Soy bastante nuevo en el desarrollo de temas de WordPress y no estoy tan interesado en PHP (vine de Java y C #) y tengo la siguiente situación en este tema personalizado
Como puede ver en la página de inicio, primero muestro una sección (llamada Articoli en evidenza ) que contiene las publicaciones destacadas (la he implementado usando una etiqueta específica) y debajo hay otra área (llamada Ultimi Articoli ) que contiene la última publicación esa no es la publicación destacada.
Para hacerlo utilizo 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 bien, pero tengo algunas dudas sobre la calidad de esta solución y cómo funciona exactamente.
Para seleccionar todas las publicaciones destacadas , utilizo esta línea que crea un nuevo WP_Query
objeto que define una consulta que tiene la etiqueta específica featured
:
$featured = new WP_Query('tag=featured');
Luego repito el resultado de esta consulta usando su have_posts()
método.
Entonces, por lo que tengo entendido, esta no es la consulta principal de WordPress, pero es una nueva consulta creada por mí. Por lo que entiendo, es mejor crear una nueva consulta (como se hizo) y no usar la consulta principal cuando quiero realizar este tipo de operación.
¿Es verdad o me estoy perdiendo algo? Si es cierto, ¿puede explicarme por qué es mejor crear una nueva consulta personalizada y no modificar la consulta principal de Wordpress?
Ok, continuando. Muestro todas las publicaciones que no tienen la etiqueta 'destacado'. Para hacer esto, uso este fragmento de código, que por el contrario, modifica la 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;
?>
Así que creo que esto es bastante horrible. ¿Es verdad?
ACTUALIZAR:
Para hacer la misma operación, encontré esta función (en la gran respuesta a continuación) que he agregado 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' );
Esta función tiene un enlace que se llama después de crear el objeto variable de consulta, pero antes de que se ejecute la consulta real.
Entonces, por lo que tengo entendido, toma un objeto de consulta como parámetro de entrada y lo modifica (en realidad lo filtra) seleccionando todas las publicaciones excluyendo una etiqueta específica (en mi caso, las featured
publicaciones de etiqueta)
Entonces, ¿cómo puedo usar la consulta anterior (la que se usa para mostrar las publicaciones destacadas) con esta función para mostrar solo las publicaciones no destacadas en mi tema? ¿O tengo que crear una nueva consulta?
fuente