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).
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; ?>