web-dev-qa-db-fra.com

Utilisation de la pagination avec get_posts sur le type de page

Est-il possible d'utiliser la pagination sur une requête de page comme avec les publications?

Voici le code que j'utilise:

    $listingPages = get_posts( 
    array(
    'cild_of' => '7',
        'meta_key' => 'Type',
        'post_type' => 'page',
        'post_status' => 'publish',
        'orderby' => 'meta_value',
        'order' => 'ASC',
    'posts_per_page' => '20',
    'paged' => ( get_query_var('paged') ? get_query_var('paged') : 1 ),
    )
);

Je peux ajouter/page/2/page/3/et etc. à l'URL et voir la série suivante de 20, mais lorsque j'ajoute dans mon code de pagination, rien ne s'affiche.

<?php wpbeginner_numeric_posts_nav(); ?>

Voici la partie function.php de ceci:

function wpbeginner_numeric_posts_nav() {

if( is_singular() )
    return;
global $wp_query;

/** Stop execution if there's only 1 page */
if( $wp_query->max_num_pages <= 1 )
    return;
$paged = get_query_var( 'paged' ) ? absint( get_query_var( 'paged' ) ) : 1;
$max   = intval( $wp_query->max_num_pages );

/** Add current page to the array */
if ( $paged >= 1 )
    $links[] = $paged;

/** Add the pages around the current page to the array */
if ( $paged >= 3 ) {
    $links[] = $paged - 1;
    $links[] = $paged - 2;
}

if ( ( $paged + 2 ) <= $max ) {
    $links[] = $paged + 2;
    $links[] = $paged + 1;
}
echo '<div class="navigation"><ul>' . "\n";

/** Previous Post Link */
if ( get_previous_posts_link() )
    printf( '<li>%s</li>' . "\n", get_previous_posts_link() );

/** Link to first page, plus ellipses if necessary */
if ( ! in_array( 1, $links ) ) {
    $class = 1 == $paged ? ' class="active"' : '';
    printf( '<li%s><a href="%s">%s</a></li>' . "\n", $class, esc_url( get_pagenum_link( 1 ) ), '1' );
    if ( ! in_array( 2, $links ) )
        echo '<li>…</li>';
}

/** Link to current page, plus 2 pages in either direction if necessary */
sort( $links );
foreach ( (array) $links as $link ) {
    $class = $paged == $link ? ' class="active"' : '';
    printf( '<li%s><a href="%s">%s</a></li>' . "\n", $class, esc_url( get_pagenum_link( $link ) ), $link );
}

/** Link to last page, plus ellipses if necessary */
if ( ! in_array( $max, $links ) ) {
    if ( ! in_array( $max - 1, $links ) )
        echo '<li>…</li>' . "\n";
    $class = $paged == $max ? ' class="active"' : '';
    printf( '<li%s><a href="%s">%s</a></li>' . "\n", $class, esc_url( get_pagenum_link( $max ) ), $max );
}

/** Next Post Link */
if ( get_next_posts_link() )
    printf( '<li>%s</li>' . "\n", get_next_posts_link() );
echo '</ul></div>' . "\n";

}

2
svsdnb

Vous devriez vérifier votre code car vous avez des phrases qui feront que votre fonction de pagination renvoie une valeur vide. Par exemple, le prochain morceau de code vous sortira parce que vous êtes dans un modèle de page, ainsi is_singular () renvoie true:

if( is_singular() )
    return;

De même, vous utilisez l'objet global $wp_query dans votre fonction de pagination, mais vous utilisez get_posts() pour obtenir la liste des pages, pas la requête principale. Donc, $wp_query->max_num_pages est cero car la requête principale portait sur une seule page. Donc, ce morceau de code va également vous sortir:

global $wp_query;

/** Stop execution if there's only 1 page */
if( $wp_query->max_num_pages <= 1 )
    return;

Supprimer les deux blocs de code ne sera pas suffisant car vous utiliserez à nouveau l'objet global $wp_query pour obtenir le nombre maximal de pages:

 $max = intval( $wp_query->max_num_pages );

De même, si vous définissez le modèle de page comme page de couverture de votre blog, la variable paged var ne fonctionnera pas dans la requête, vous devez utiliser la requête page var.

Je vous recommande de repenser à ce que vous essayez de faire. En regardant votre code, vous essayez de lister les pages enfants de la page avec l'ID 7 et de paginer les résultats. Il semble plus facile de convertir ces pages enfants en publications normales dans une catégorie et de les afficher dans un modèle de catégorie standard.

Si vous avez vraiment besoin que les éléments soient des pages enfants, dans votre cas, il est préférable d’utiliser un objet new WP_Query() et non une fonction get_posts() pour obtenir le nombre maximal de pages de votre fonction de pagination:

 $args =  array(
       'cild_of' => '7',
       'meta_key' => 'Type',
       'post_type' => 'page',
       'post_status' => 'publish',
       'orderby' => 'meta_value',
       'order' => 'ASC',
       'posts_per_page' => '20',
       'paged' => ( get_query_var('paged') ? get_query_var('paged') : 1 ),
   );
   $query = new WP_Query($args);
   $max_num_pages = $query->max_num_pages;

   wpbeginner_numeric_posts_nav($max_num_pages);

Et la fonction de pagination:

function wpbeginner_numeric_posts_nav($max_num_pages = 0) {

/** Stop execution if there's only 1 page */
if( $max_num_pages <= 1 )
    return;
$paged = get_query_var( 'paged' ) ? absint( get_query_var( 'paged' ) ) : 1;

/** Add current page to the array */
if ( $paged >= 1 )
    $links[] = $paged;

/** Add the pages around the current page to the array */
if ( $paged >= 3 ) {
    $links[] = $paged - 1;
    $links[] = $paged - 2;
}

if ( ( $paged + 2 ) <= $max_num_pages ) {
    $links[] = $paged + 2;
    $links[] = $paged + 1;
}
echo '<div class="navigation"><ul>' . "\n";

/** Previous Post Link */
if ( get_previous_posts_link() )
    printf( '<li>%s</li>' . "\n", get_previous_posts_link() );

/** Link to first page, plus ellipses if necessary */
if ( ! in_array( 1, $links ) ) {
    $class = 1 == $paged ? ' class="active"' : '';
    printf( '<li%s><a href="%s">%s</a></li>' . "\n", $class, esc_url( get_pagenum_link( 1 ) ), '1' );
    if ( ! in_array( 2, $links ) )
        echo '<li>…</li>';
}

/** Link to current page, plus 2 pages in either direction if necessary */
sort( $links );
foreach ( (array) $links as $link ) {
    $class = $paged == $link ? ' class="active"' : '';
    printf( '<li%s><a href="%s">%s</a></li>' . "\n", $class, esc_url( get_pagenum_link( $link ) ), $link );
}

/** Link to last page, plus ellipses if necessary */
if ( ! in_array( $max_num_pages, $links ) ) {
    if ( ! in_array( $max_num_pages - 1, $links ) )
        echo '<li>…</li>' . "\n";
    $class = $paged == $max_num_pages ? ' class="active"' : '';
    printf( '<li%s><a href="%s">%s</a></li>' . "\n", $class, esc_url( get_pagenum_link( $max_num_pages ) ), $max_num_pages );
}

/** Next Post Link */
if ( get_next_posts_link() )
    printf( '<li>%s</li>' . "\n", get_next_posts_link() );
echo '</ul></div>' . "\n";
}
1
cybmeta

Cela ressemble à une requête secondaire. paged est Core query var - c’est-à-dire qu’il est utilisé par WordPress Core. Cette variable va être manipulée par le Cœur pendant un chargement de page ordinaire par la requête principale au début du chargement de page. La requête principale ne sait pas ce que votre requête fait plus loin dans le chargement de la page. Je suis presque sûr que ce qui se passe, c’est que vous essayez d’utiliser une variable de requête "réservée" et que vous constatez des interférences/conflits dus à la requête principale et au fonctionnement des fonctions principales.

Le correctif, si j'ai raison, consiste à utiliser une variable autre que celle utilisée par le Core - quelque chose comme my_paged.

0
s_ha_dum