Je suis assez nouveau dans le développement de thèmes WordPress et je ne suis pas tellement en PHP (je viens de Java et C #) et j'ai la situation suivante dans ce thème personnalisé
Comme vous pouvez le voir sur la page d'accueil, je montre d'abord une section (nommée Articoli in evidenza ) contenant les articles en vedette (je l'ai implémentée en utilisant une balise spécifique) et en dessous il y a une autre zone (nommée Ultimi Articoli ) qui contient le dernier article qui ne sont pas le poste en vedette.
Pour ce faire j'utilise ce code:
<section id="blog-posts">
<header class="header-sezione">
<h2>Articoli in evidenza</h2>
</header>
<!--<?php query_posts('tag=featured');?>-->
<?php
$featured = new WP_Query('tag=featured');
if ($featured->have_posts()) :
while ($featured->have_posts()) : $featured->the_post();
/*
* Include the post format-specific template for the content. If you want to
* use this in a child theme, then include a file called called content-___.php
* (where ___ is the post format) and that will be used instead.
*/
get_template_part('content', get_post_format());
endwhile;
wp_reset_postdata();
else :
// If no content, include the "No posts found" template.
get_template_part('content', 'none');
endif;
?>
<header class="header-sezione">
<h2>Ultimi Articoli</h2>
</header>
<?php
// get the term using the slug and the tag taxonomy
$term = get_term_by( 'slug', 'featured', 'post_tag' );
// pass the term_id to tag__not_in
query_posts( array( 'tag__not_in' => array ( $term->term_id )));
?>
<?php
if (have_posts()) :
// Start the Loop.
while (have_posts()) : the_post();
/*
* Include the post format-specific template for the content. If you want to
* use this in a child theme, then include a file called called content-___.php
* (where ___ is the post format) and that will be used instead.
*/
get_template_part('content', get_post_format());
endwhile;
else :
// If no content, include the "No posts found" template.
get_template_part('content', 'none');
endif;
?>
</section>
Cela fonctionne bien, mais j'ai quelques doutes sur la qualité de cette solution et sur son fonctionnement exact.
Pour sélectionner tous les articles en vedette , j'utilise cette ligne qui crée un nouvel WP_Query
objet qui définit une requête ayant la balise spécifique featured
:
$featured = new WP_Query('tag=featured');
Ensuite, j'itère sur ce résultat de requête en utilisant sa have_posts()
méthode.
Donc, d'après ce que j'ai compris, ce n'est pas la requête principale de WordPress, mais c'est une nouvelle requête créée par moi. D'après ce que je comprends, il est préférable de créer une nouvelle requête (comme cela est fait) et de ne pas utiliser la requête principale lorsque je souhaite effectuer ce type d'opération.
Est-ce vrai ou manque-t-il quelque chose? Si c'est vrai, pouvez-vous m'expliquer pourquoi il vaut mieux créer une nouvelle requête personnalisée et ne pas modifier la requête principale de Wordpress?
Ok, continue. Je montre tous les messages qui n'ont pas la balise «en vedette». Pour ce faire, j'utilise cet extrait de code, qui au contraire modifie la requête principale:
<?php
// get the term using the slug and the tag taxonomy
$term = get_term_by( 'slug', 'featured', 'post_tag' );
// pass the term_id to tag__not_in
query_posts( array( 'tag__not_in' => array ( $term->term_id )));
?>
<?php
if (have_posts()) :
// Start the Loop.
while (have_posts()) : the_post();
get_template_part('content', get_post_format());
endwhile;
else :
// If no content, include the "No posts found" template.
get_template_part('content', 'none');
endif;
?>
Je pense donc que c'est assez horrible. Est-ce vrai?
MISE À JOUR:
Pour faire la même opération, j'ai trouvé cette fonction (dans la grande réponse ci-dessous) que j'ai ajoutée à functions.php
function exclude_featured_tag( $query ) {
if ( $query->is_home() && $query->is_main_query() ) {
$query->set( 'tag__not_in', 'array(ID OF THE FEATURED TAG)' );
}
}
add_action( 'pre_get_posts', 'exclude_featured_tag' );
Cette fonction possède un hook qui est appelé après la création de l'objet variable de requête, mais avant l'exécution de la requête réelle.
Donc, d'après ce que j'ai compris, il prend un objet de requête comme paramètre d'entrée et le modifie (en fait le filtre) en sélectionnant tous les messages à l'exclusion d'une balise spécifique (dans mon cas, les featured
messages de balise)
Alors, comment puis-je utiliser la requête précédente (celle utilisée pour afficher les publications en vedette) avec cette fonction pour afficher uniquement les publications non présentées dans mon thème? Ou dois-je créer une nouvelle requête?
la source