Sono abbastanza nuovo nello sviluppo del tema WordPress e non sono così interessato a PHP (vengo da Java e C #) e ho la seguente situazione in questo tema personalizzato
Come puoi vedere nella homepage, per prima cosa mostro una sezione (chiamata Articoli in evidenza ) contenente i post in evidenza (l'ho implementata usando un tag specifico) e sotto di essa c'è un'altra area (chiamata Ultimi Articoli ) che contiene l'ultimo post che non sono i post in primo piano.
Per farlo uso questo codice:
<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>
Funziona bene, ma ho alcuni dubbi sulla qualità di questa soluzione e su come funziona esattamente.
Per selezionare tutti i post in primo piano , utilizzo questa riga che crea un nuovo WP_Query
oggetto che definisce una query con il tag specifico featured
:
$featured = new WP_Query('tag=featured');
Quindi eseguo l'iterazione su questo risultato della query usando il suo have_posts()
metodo.
Quindi, da quello che ho capito, questa non è la query principale di WordPress, ma è una nuova query creata da me. Da quello che ho capito, è meglio creare una nuova query (come fatto) e non usare la query principale quando voglio eseguire questo tipo di operazione.
È vero o mi sto perdendo qualcosa? Se è vero, puoi spiegarmi, perché è meglio creare una nuova query personalizzata e non modificare la query principale di Wordpress?
Ok, continua. Mostro tutti i post che non hanno il tag "in primo piano". Per fare ciò, uso questo frammento di codice, che al contrario modifica la query 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;
?>
Quindi penso che sia piuttosto orribile. È vero?
AGGIORNARE:
Per fare la stessa operazione ho trovato questa funzione (nella grande risposta di seguito) che ho aggiunto a 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' );
Questa funzione ha un hook chiamato dopo la creazione dell'oggetto variabile query, ma prima dell'esecuzione della query effettiva.
Quindi, da quello che ho capito, prende un oggetto query come parametro di input e lo modifica (effettivamente filtra) selezionando tutti i post escludendo un tag specifico (nel mio caso il featured
post dei tag)
Quindi, come posso utilizzare la query precedente (quella utilizzata per mostrare i post in primo piano) con questa funzione per mostrare solo i post non in primo piano nel mio tema? O devo creare una nuova query?