web-dev-qa-db-fra.com

Paginer les liens avec "moche" et "jolie" permaliens?

Si j'ai de "jolis" permaliens activés, mon code fonctionnera pour les pages statiques (fonctionnera si la page est définie sur "page d'accueil" ou "page normale"). Mais mon code se casse si j'utilise la structure "permalink par défaut".

J'ai ceci jusqu'à présent (travaillant bien avec "pretty permalinks" mais rompt avec "laid permalinks"):

/*Declared above the loop*/
    if ( get_query_var( 'paged' ) ) {
    $paged = get_query_var( 'paged' );
    } elseif ( get_query_var( 'page' ) ) {
    $paged = get_query_var( 'page' );
    } else {
    $paged = 1;
    }

    /*The loop and arguments go here*/

    global $wp_query;
    $big = 999999999; // need an unlikely integer
    echo paginate_links( array(
    'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
    'format' => '?paged=%#%',
    'current' => max( 1, $paged ),
    'total' => $wp_query->max_num_pages,
    'prev_text' => esc_html__( 'Prev', 'domain' ),
    'next_text' => esc_html__( 'Next', 'domain' ),
    'end_size'  => 1,
    'mid_size'  => 1,
    ) );

Est-il possible d'avoir une pagination numérotée pour les deux (permaliens laids et jolies)?

3
Dejo Dekic

EDIT - WORDPRESS 4.4.1 BUG

Veuillez prendre note qu’il existe un bogue dans WordPress 4.4.1 ( je ne suis pas sûr que ce bogue influence également WordPress 4.4, mais selon le rapport de bogue, il n’est pas ), ce qui échoue lors de la définition de la pagination. page comme page d'accueil statique. Assurez-vous de vérifier le rapport de bogue ( ticket trac # 35344 ]) et le patch. Cela sera corrigé dans WordPress 4.4.2 selon le rapport de bogue.

HAPPY B/DAY UPDATE/EDIT

Le code que j'avais initialement fait un an n'a accepté que l'objet de requête complet WP_Query, ce dont je me suis rendu compte qu'il est assez restrictif lorsque vous faites cette réponse (que vous pouvez également vérifier ), la fonction nécessaire pour accepter également les valeurs entières/numériques de query afin de paginer d’autres types de requêtes

J'ai mis à jour le code d'origine, donc maintenant vous pouvez simplement passer n'importe quelle valeur entière/numérique à query.

RÉPONSE ORIGINALE

En fait, je viens juste de terminer une fonction pour mon usage personnel hier car j'avais besoin de quelque chose d'un peu plus flexible pour toutes les requêtes. J'ai décidé que j'avais besoin d'au moins 5 numéros de page pour être visibles en tout temps s'il y avait plus de 5 pages. En outre, j'avais besoin d'un lien vers la première et la dernière page

De plus, j'avais besoin de la souplesse nécessaire pour basculer entre les numéros de page numérotés et les liens paginés normaux. En outre, la fonction devait être flexible pour pouvoir être utilisée même sur les pages de couverture statiques.

Je ne vais pas entrer beaucoup dans le fonctionnement et le fonctionnement interne de la fonction car j'ai commenté les points les plus importants à l'intérieur de la fonction.

LA FONCTION:

/**
 * @author Pieter Goosen
 * @license GPLv2 
 * @link http://www.gnu.org/licenses/gpl-2.0.html
 *
 * This function returns numbered pagination links or text pagination links
 * depending what is been set
 *
 * Paginated numbered links uses get_pagenum_link() to return links to the
 * required pages
 * @uses http://wpseek.com/function/get_pagenum_link/
 *
 * The pagination links uses next_posts_link() and previous_posts_link()
 * @uses http://codex.wordpress.org/Function_Reference/next_posts_link
 * @uses http://codex.wordpress.org/Template_Tags/previous_posts_link
 *
 * @param array $args An array of key => value arguments. Defaults below 
 * - mixed query variable                   'query'                 => $GLOBALS['wp_query'],
 * - string Previous page text              'previous_page_text'    => __( '«' ),
 * - string Next page text                  'next_page_text'        => __( '»' ),
 * - string First page link text            'first_page_text'       => __( 'First' ),
 * - string Last page link text             'last_page_text'        => __( 'Last' ),
 * - string Older posts text                'next_link_text'        => __( 'Older Entries' ),
 * - string Newer posts text                'previous_link_text'    => __( 'Newer Entries' ),
 * - bool Whether to use links              'show_posts_links'      => false,
 * - int Amount of numbered links to show   'range'                 => 5,
 *
 * @return string $paginated_text
*/ 
function get_paginated_numbers( $args = [] ) {

    //Set defaults to use
    $defaults = [
        'query'                 => $GLOBALS['wp_query'],
        'previous_page_text'    => __( '«' ),
        'next_page_text'        => __( '»' ),
        'first_page_text'       => __( 'First' ),
        'last_page_text'        => __( 'Last' ),
        'next_link_text'        => __( 'Older Entries' ),
        'previous_link_text'    => __( 'Newer Entries' ),
        'show_posts_links'      => false,
        'range'                 => 5,
    ];

    // Merge default arguments with user set arguments
    $args = wp_parse_args( $args, $defaults );

    /**
     * Get current page if query is paginated and more than one page exists
     * The first page is set to 1
     * 
     * Static front pages is included
     *
     * @see WP_Query pagination parameter 'paged'
     * @link http://codex.wordpress.org/Class_Reference/WP_Query#Pagination_Parameters
     *
    */ 
    if ( get_query_var('paged') ) { 

        $current_page = get_query_var('paged'); 

    }elseif ( get_query_var('page') ) { 

        $current_page = get_query_var('page'); 

    }else{ 

        $current_page = 1; 

    }

    // Get the amount of pages from the query
    if ( is_object( $args['query'] ) ) {
        $max_pages = (int) $args['query']->max_num_pages;
    } else {
        $max_pages = filter_var( $args['query'], FILTER_VALIDATE_INT );
    }

    /**
     * If $args['show_posts_links'] is set to false, numbered paginated links are returned
     * If $args['show_posts_links'] is set to true, pagination links are returned
    */
    if( false === $args['show_posts_links'] ) {

        // Don't display links if only one page exists
        if( 1 === $max_pages ) {

            $paginated_text = '';

        }else{

            /**
             * For multi-paged queries, we need to set the variable ranges which will be used to check
             * the current page against and according to that set the correct output for the paginated numbers
            */
            $mid_range      = (int) floor( $args['range'] / 2 );
            $start_range    = range( 1 , $mid_range );
            $end_range      = range( ( $max_pages - $mid_range +1 ) , $max_pages );
            $exclude        = array_merge( $start_range, $end_range );  

            /**
             * The amount of pages must now be checked against $args['range']. If the total amount of pages
             * is less than $args['range'], the numbered links must be returned as is
             *
             * If the total amount of pages is more than $args['range'], then we need to calculate the offset
             * to just return the amount of page numbers specified in $args['range']. This defaults to 5, so at any
             * given instance, there will be 5 page numbers displayed
            */
            $check_range    = ( $args['range'] > $max_pages )   ? true : false;

            if( true === $check_range ) {

                $range_numbers = range( 1, $max_pages );

            }elseif( false === $check_range ) {

                if( !in_array( $current_page, $exclude ) ) {

                    $range_numbers = range( ( $current_page - $mid_range ), ( $current_page + $mid_range ) );

                }elseif( in_array( $current_page, $start_range ) && ( $current_page - $mid_range ) <= 0 ) {

                    $range_numbers = range( 1, $args['range'] );

                }elseif(  in_array( $current_page, $end_range ) && ( $current_page + $mid_range ) >= $max_pages ) {

                    $range_numbers = range( ( $max_pages - $args['range'] +1 ), $max_pages );

                }

            }

            /**
             * The page numbers are set into an array through this foreach loop. The current page, or active page
             * gets the class 'current' assigned to it. All the other pages get the class 'inactive' assigned to it
            */
            foreach ( $range_numbers as $v ) {

                if ( $v == $current_page ) { 

                    $page_numbers[] = '<span class="current">' . $v . '</span>';

                }else{

                    $page_numbers[] = '<a href="' . get_pagenum_link( $v ) . '" class="inactive">' . $v . '</a>';

                }

            }

            /** 
            * All the texts are set here and when they should be displayed which will link back to:
             * - $previous_page The previous page from the current active page
             * - $next_page The next page from the current active page
             * - $first_page Links back to page number 1
             * - $last_page Links to the last page
            */
            $previous_page  = ( $current_page !== 1 )                       ? '<a href="' . get_pagenum_link( $current_page - 1 ) . '">' . $args['previous_page_text'] . '</a>' : '';
            $next_page      = ( $current_page !== $max_pages )              ? '<a href="' . get_pagenum_link( $current_page + 1 ) . '">' . $args['next_page_text'] . '</a>'     : '';
            $first_page     = ( !in_array( 1, $range_numbers ) )            ? '<a href="' . get_pagenum_link( 1 ) . '">' . $args['first_page_text'] . '</a>'                    : '';
            $last_page      = ( !in_array( $max_pages, $range_numbers ) )   ? '<a href="' . get_pagenum_link( $max_pages ) . '">' . $args['last_page_text'] . '</a>'            : '';

            /**
             * Text to display before the page numbers
             * This is set to the following structure:
             * - Page X of Y
            */
            $page_text      = '<span>' . sprintf( __( 'Page %s of %s' ), $current_page, $max_pages ) . '</span>';
            // Turn the array of page numbers into a string
            $numbers_string = implode( ' ', $page_numbers );

            // The final output of the function
            $paginated_text = '<div class="pagination">';
            $paginated_text .= $page_text . $first_page . $previous_page . $numbers_string . $next_page . $last_page;
            $paginated_text .= '</div>';

        }

    }elseif( true === $args['show_posts_links'] ) {

        /**
        * If $args['show_posts_links'] is set to true, only links to the previous and next pages are displayed
        * The $max_pages parameter is already set by the function to accommodate custom queries
        */
        $paginated_text = get_next_posts_link( '<div class="next-posts-link">' . $args['next_link_text'] . '</div>', $max_pages );
        $paginated_text .= get_previous_posts_link( '<div class="previous-posts-link">' . $args['previous_link_text'] . '</div>' );

    }

    // Finally return the output text from the function
    return $paginated_text;

}

USAGE

Les arguments disponibles sont également bien commentés. Voici un exemple si vous devez afficher des liens numérotés pour une requête personnalisée $q = new WP_Query

$args = [
    'query' => $q
];
echo get_paginated_numbers( $args );

Vous pouvez également simplement transmettre du texte personnalisé à la fonction si nécessaire.

Si vous devez afficher des liens au lieu de numéros de page, essayez ce qui suit.

$args = [
    'query'            => $q
    'show_posts_links' => true,
];
echo get_paginated_numbers( $args );

Avec votre propre style, vous pouvez avoir les numéros de page qui ressemblent à ceci

enter image description here

13
Pieter Goosen

Il semble donc possible de faire fonctionner cette fonction avec des permaliens "laids" et "jolis". Voici le code:

  <?php
    global $wp_query;

    //structure of "format" depends on whether we're using pretty permalinks
    if( get_option('permalink_structure') ) {
    $format = '?paged=%#%';
    } else {
    $format = 'page/%#%/';
    } 
    $big = 999999999; // need an unlikely integer
    $base = $format =='?paged=%#%' ? $base = str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ) : $base = @add_query_arg('paged','%#%');

    echo paginate_links( array(
    'base' => $base,
    'format' => $format,
    'current' => max( 1, $paged ),
    'total' => $wp_query->max_num_pages,
    'prev_text' => esc_html__( 'Prev', 'domain' ),
    'next_text' => esc_html__( 'Next', 'domain' ),
    'end_size'  => 1,
    'mid_size'  => 1,
    ) );
 ?>

J'espère que ça va aider quelqu'un;)

1
Dejo Dekic