web-dev-qa-db-fra.com

La pagination de shortcode n'avance pas

J'ai une galerie d'images qui fonctionne, je la convertis en un shortcode afin que le positionnement puisse être flexible et que je n'ai pas à copier le code encore et encore.

Le problème que je rencontre est que la pagination ne passe pas à la page suivante. Les images montrent, la pagination montre, le numéro de page montre ... mais quand j'essaie de cliquer sur la page deux ou trois, les images, la pagination et les numéros de page ne changent pas. L'URL change, le contenu ne change pas.

J'ai une page avec du code manuel (qui fonctionne et avance ou change lorsque l'on clique sur la pagination).

Le site sur lequel je travaille est: http://joshrodg.com/test/banquet/2017-induction-banquet/ . Mon shortcode de test est en haut (sous le banquet d'induction 2017), celui qui fonctionne est celui en bas (code manuel).

Mon shortcode ressemble à: [halloffame rml_folder="16"]

Ma fonction ressemble à:

function picture_gallery($atts){
    extract(shortcode_atts(array(
        'rml_folder' => 1
    ), $atts));

    $paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
    query_posts("post_status=inherit&post_type=attachment&rml_folder=".$rml_folder."&orderby=title&order=asc&posts_per_page=12&paged=".$paged);

    if ( have_posts() ) :
        $return_string .= '<div id="album">';
            while ( have_posts() ) : the_post();
                $return_string .= '<div class="gallery">';
                    $image = wp_get_attachment_image(get_post_thumbnail_id($post->ID), 'medium');
                    $return_string .= '<a href="'.wp_get_attachment_url($post->ID).'" class="simplelightbox">'.$image.'</a>';
                    $return_string .= '<p>'.get_the_title().'</p>';
                $return_string .= '</div>';
            endwhile;
        $return_string .= '</div>';
    endif;

    $return_string .= '<div id="pagi">';
        $return_string .= '<div class="wrap">';
            $args = array(
                'prev_text' => __('<span class="left"></span><span class="ion-Android-arrow-dropleft"></span>'),
                'next_text' => __('<span class="ion-Android-arrow-dropright"></span><span class="right"></span>')
            );
            $return_string .= paginate_links($args);
        $return_string .= '</div>';
    $return_string .= '</div>';

    global $wp_query;
    $current_page = get_query_var( 'paged' );
    $pages = $wp_query->max_num_pages;
    $return_string .= '<p align="center">(Page: '.$current_page.' of '.$pages.')</p>';

    wp_reset_query();

    return $return_string;
}

function register_shortcodes(){
    add_shortcode('halloffame', 'picture_gallery');
}
add_action( 'init', 'register_shortcodes');

Comme cela fonctionne avec le code manuel, j'imagine que quelque chose ne va pas avec mon code shortcode.

Des idées?

** METTRE À JOUR **

Ainsi, sur la page http://joshrodg.com/test/banquet/ , la pagination est rompue, mais sur http://joshrodg.com/test/banquet/2017-induction-banquet/ la pagination fonctionne. 2017-induction-banquet est le message d'origine, c'est un message enfant de http://joshrodg.com/test/banquet/ . Sur http://joshrodg.com/test/banquet/ , j'affiche le contenu de toutes mes pages enfants. Donc, le shortcode lui-même fonctionne, mais pas sur cette page - il y a donc peut-être un problème avec ma boucle.

La boucle pour cette page ressemble à:

<?php query_posts("order=asc&orderby=menu_order&posts_per_page=-1&post_type=page&post_parent=".$post->ID); ?>
    <?php while ( have_posts() ) : the_post(); ?>
        <div class="wrap">
            <h2><?php the_title(); ?></h2>
        </div>
        <p><?php the_content(); ?></p>
    <?php endwhile; ?>
<?php wp_reset_query(); ?>

Je pense qu'il pourrait y avoir un conflit avec la boucle dans le shortcode et la boucle sur cette page.

La pagination sur la page d'origine ressemble à: http://joshrodg.com/test/banquet/2017-induction-banquet/page/2/

La pagination sur la page parente ressemble à: http://joshrodg.com/test/banquet/page/2/

Je ne sais pas si cela fait une différence, mais je me suis dit que cela méritait d'être mentionné.

Merci,
Josh

1
Josh Rodgers

J'ai donc réussi à trouver une solution.

J'ai essayé de changer query_posts sur mon shortcode, mais pour une raison quelconque, je n'ai pas réussi à le faire fonctionner. J'ai changé la requête sur la page qui a résolu le problème.

La requête ressemble maintenant à:

<?php
    $args = array(
        'order' => 'asc',
        'orderby' => 'menu_order',
        'posts_per_page' => -1,
        'post_type' => 'page',
        'post_parent' => $post->ID

    );

    $query = new WP_Query( $args );
?>

    <?php while ( $query->have_posts() ) : $query->the_post(); ?>
        <div class="wrap">
            <h2><?php the_title(); ?></h2>
        </div>
        <p><?php the_content(); ?></p>
    <?php endwhile; ?>
<?php wp_reset_postdata(); ?>

Le shortcode n'a pas changé (autre que la suppression du trait d'union).

Ainsi, les deux requêtes étaient en conflit l'une avec l'autre. Les différentes requêtes query_posts et WP_Query ont résolu le problème.

Merci,
Josh

0
Josh Rodgers

N'utilisez pas de trait d'union dans le nom du shortcode. Voir https://codex.wordpress.org/Shortcode_API#Hyphens .

1
Rick Hellewell