Sou bastante novo no desenvolvimento de temas para WordPress e não gosto muito de PHP (vim de Java e C #) e tenho a seguinte situação neste tema personalizado
Como você pode ver na página inicial, primeiro mostro uma seção (denominada Articoli in evidenza ) contendo as postagens em destaque (eu a implementei usando uma tag específica) e abaixo dela existe outra área (denominada Ultimi Articoli ) que contém a post mais recente essa não é a postagem em destaque.
Para fazer isso, eu uso este código:
<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>
Funciona bem, mas tenho algumas dúvidas sobre a qualidade desta solução e como exatamente ela funciona.
Para selecionar todas as postagens em destaque , eu uso esta linha que cria um novo WP_Query
objeto que define uma consulta com a tag específica featured
:
$featured = new WP_Query('tag=featured');
Então, eu itero neste resultado da consulta usando seu have_posts()
método
Portanto, pelo que entendi, essa não é a consulta principal do WordPress, mas é uma nova consulta criada por mim. Pelo que entendi, é melhor criar uma nova consulta (como concluída) e não usar a consulta principal quando desejar executar esse tipo de operação.
É verdade ou estou faltando alguma coisa? Se for verdade, você pode me explicar, por que é melhor criar uma nova consulta personalizada e não modificar a consulta principal do Wordpress?
Ok, continuando. Eu mostro todas as postagens que não têm a tag 'em destaque'. Para fazer isso, eu uso esse trecho de código, que, pelo contrário, modifica a consulta principal:
<?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;
?>
Então eu acho que isso é horrível. É verdade?
ATUALIZAR:
Para fazer a mesma operação, encontrei esta função (na grande resposta abaixo) que adicionei 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' );
Essa função possui um gancho chamado após a criação do objeto variável de consulta, mas antes da execução da consulta real.
Então, pelo que entendi, ele pega um objeto de consulta como parâmetro de entrada e o modifica (na verdade filtra) selecionando todas as postagens, exceto uma tag específica (no meu caso, a featured
tag posta)
Então, como posso usar a consulta anterior (aquela usada para mostrar as postagens em destaque) com esta função para mostrar apenas as postagens não em destaque no meu tema? Ou tenho que criar uma nova consulta?