¿Por qué el argumento ignore_sticky_posts está en la consulta de entradas fijas?
Todos sabemos que ignore_sticky_posts
se usa para excluir entradas fijas de tu consulta personalizada.
Pero, ¿por qué en la documentación de desarrollo de temas de WordPress usan ignore_sticky_posts
al consultar entradas fijas?
$args = array(
'posts_per_page' => 1,
'post__in' => get_option( 'sticky_posts' ),
'ignore_sticky_posts' => 1
);
$query = new WP_Query( $args );
¡Esto es muy confuso y no tiene sentido! ¿Las quieres y aun así las excluyes?
Todos sabemos que
ignore_sticky_posts
se usa para excluir posts fijos (sticky) de tu consulta personalizada.
- No, esta suposición es incorrecta.
Qué significa realmente ignore_sticky_posts
:
Aunque en inglés natural, ignore_sticky_posts
suena como que WordPress debería ignorar todos los posts fijos en la consulta, en realidad eso no es lo que hace WordPress. En su lugar, debes interpretar el argumento 'ignore_sticky_posts' => 1
de la siguiente manera:
Cuando
ignore_sticky_posts
está configurado comotrue
o1
, WordPress ignorará el procedimiento de establecer los posts fijos dentro de tu consulta personalizada.
Qué hace WordPress cuando ignore_sticky_posts
no está configurado:
Para entender claramente qué hace 'ignore_sticky_posts' => 1
, necesitas comprender qué hace WordPress cuando este argumento no está configurado o está establecido como false
o 0
(por defecto):
Si hay posts dentro de los resultados de la consulta que son parte de los posts fijos, WordPress los colocará al principio de los resultados.
Si algún post fijo no está presente en los resultados de la consulta, WordPress los obtendrá nuevamente de la base de datos y los colocará al principio de los resultados.
Así que cuando el argumento se establece como 'ignore_sticky_posts' => 1
, WordPress simplemente ignora el procedimiento anterior, eso es todo. No los excluye específicamente. Para eso necesitas usar el argumento post__not_in
.
Explicación del ejemplo del codex:
Ahora, veamos el ejemplo del codex:
$args = array(
'posts_per_page' => 1,
'post__in' => get_option( 'sticky_posts' ),
'ignore_sticky_posts' => 1
);
$query = new WP_Query( $args );
Aquí el codex solo está configurando 'ignore_sticky_posts' => 1
por eficiencia, nada más. Incluso sin este parámetro, obtendrías el mismo resultado esperado:
$args = array(
'posts_per_page' => 1,
'post__in' => get_option( 'sticky_posts' )
);
$query = new WP_Query( $args );
Sin embargo, en este caso, como no se establece 'ignore_sticky_posts' => 1
, WordPress realizará innecesariamente todo el procedimiento de colocar los posts fijos al principio de los resultados, aunque todos estos resultados (de este ejemplo) son solo posts fijos.
La mejor manera de aprender algo en WordPress es examinar el CÓDIGO central. Para una comprensión aún más clara, examina esta parte del CÓDIGO de WordPress.

¡WordPress debería incluir tu respuesta en su página de publicaciones fijas!

Me alegra que te haya ayudado. El codex de WordPress es editable, incluso tú puedes editarlo y añadir esta respuesta como referencia para otros ;)

Esta respuesta está muy infravalorada. De hecho, he vuelto a ella dos veces ahora, con un año de diferencia. Así de confuso es este parámetro.

Aquí hay una alternativa que, en mi opinión, sería más fácil, aunque algunas de las ideas ya mencionadas son bastante buenas.
$args=array(
'post__not_in'=>get_option('sticky_posts')
// añade aquí cualquier otro argumento que desees
);
$posts=new WP_Query($args);

Sin embargo, ten cuidado cuando hagas esto. Esta lista puede volverse muy larga, en teoría, lo que resultaría en una consulta que es muy pesada para la base de datos potencialmente. Lo que hace tu consulta no es la función real prevista para las entradas fijas, como se explica adecuadamente en esta respuesta: https://wordpress.stackexchange.com/a/260951/1763
