web-dev-qa-db-fra.com

Trier les messages par attributs 'ordre'

Comment trier les articles affichés par attribut "ordre"?

Dans functions.php, j'ai ajouté les "attributs" pour les publications

function wpzen_add_attributes_to_post() {
    add_post_type_support('post', 'page-attributes');
}
add_action('init', 'wpzen_add_attributes_to_post');
function wpzen_change_post_order($query) {
    if($query->is_main_query()) {
        $query->set('orderby', 'menu_order');
    }
}
add_action('pre_get_posts', 'wpzen_change_post_order');

Le code affiche une vue d'ensemble des articles qui ressemble à ceci:

<?php
        $show_posts = '12';
        $cat_name = 'Products';
        $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

        $my_query = new WP_query('category_name=' . $cat_name . '&showposts=' . $show_posts . '&paged=' . $paged );

        global $wp_query;
        $wp_query->in_the_loop = true;

        while ($my_query->have_posts()) : $my_query->the_post();
        $do_not_duplicate = $post->ID;?>

    <a href="<?php echo get_permalink(); ?>">
        <h2><?php the_title(); ?></h2>
    </a>
    <?php the_content( $more_link_text , $strip_teaser ); ?>

<?php endwhile; ?>

Comment trier les messages en fonction de l'attribut "ordre" (croissant ou décroissant).

4
Lech

Eh bien, j'ai bien peur que cela ne fonctionne pas comme ça. Laisse moi expliquer pourquoi ...

Dans votre fonction wpzen_change_post_order, vous vérifiez si $query->is_main_query(). Pour être précis, cette vérification vérifie si la requête donnée est la requête principale pour la page en cours - la requête générée par WP pour afficher les publications par défaut pour la page en cours.

Donc, si vous créez votre propre objet WP_Query, cette condition sera fausse et votre fonction ne définira pas le paramètre orderby.

Comment changer ça?

Il y a plusieurs façons de résoudre ce problème. Premièrement: supprimez l'instruction if de wpzen_change_post_order. Mais ensuite, faites attention et ajoutez d’autres vérifications, afin que vous ne modifiiez que les requêtes que vous voulez vraiment. (Surtout, vous devriez vérifier, if ( ! is_admin() ))

Deuxième manière, beaucoup plus facile, je suppose ... Ajoutez le paramètre orderby directement dans votre WP_Query. Ainsi, le code qui affiche les messages ressemblerait à ceci:

<?php
        $show_posts = '12';
        $cat_name = 'Products';
        $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

        $my_query = new WP_Query( array(  // <- It's better to use array
           'category_name' => $cat_name,
           'posts_per_page' => $show_posts,  // <- showposts is deprecated for long time, so use posts_per_page instead
           'paged' => $paged,
           'orderby' => 'menu_order'
        ) );

        global $wp_query;  // <- I'm not sure what do you want to accomplish with these 2 lines
        $wp_query->in_the_loop = true;

        while ($my_query->have_posts()) : $my_query->the_post();
        $do_not_duplicate = $post->ID;?>

    <a href="<?php echo get_permalink(); ?>">
        <h2><?php the_title(); ?></h2>
    </a>
    <?php the_content( $more_link_text , $strip_teaser ); ?>

<?php endwhile; ?>
2
Krzysiek Dróżdż