Parece que la mitad de los tutoriales en el Codex y alrededor de la blogosfera usan query_posts()
y la otra mitad WP_Query
. ¿Cual es el trato?
Parece que la mitad de los tutoriales en el Codex y alrededor de la blogosfera usan query_posts()
y la otra mitad WP_Query
. ¿Cual es el trato?
Respuestas:
query_posts()
es demasiado simplista y una forma problemática de modificar la consulta principal de una página al reemplazarla con una nueva instancia de la consulta. Es ineficiente (vuelve a ejecutar consultas SQL) y fallará directamente en algunas circunstancias (especialmente a menudo cuando se trata de paginación de publicaciones). Cualquier código WP moderno debería usar métodos más confiables, como hacer uso del pre_get_posts
gancho, para este propósito. TL; DR no utiliza query_posts () nunca .
get_posts()
es muy similar en uso y acepta los mismos argumentos (con algunos matices, como diferentes valores predeterminados), pero devuelve una serie de publicaciones, no modifica las variables globales y es seguro de usar en cualquier lugar.
WP_Query
es la clase que potencia tanto detrás de escena, pero también puedes crear y trabajar con tu propia instancia. Un poco más complejo, menos restricciones, también seguro de usar en cualquier lugar.
query_posts()
es una función de envoltura pequeña WP_Query
, lo único que hace (según el diagrama de flujo) es sobrescribir global$wp_query
query_posts()
con WP_Query
no hará ninguna diferencia en el rendimiento, la consulta de la página original todavía se ejecutará porque eso es parte de la carga principal. Esas consultas se ejecutarán incluso si su archivo de plantilla no tiene ningún bucle.
query_posts
no modificar el bucle principal en absoluto, que sustituye a que después de que ya se ha ejecutado. La mejor manera de modificar el bucle principal es a través de un pre_get_posts
filtro. developer.wordpress.com/2012/05/14/…
query_posts
- Nunca deberías usarlo query_posts
. Además de lo que ha dicho @Rarst, el problema realmente grande query_posts
es que rompe el objeto de consulta principal (almacenado en $wp_query
). Muchos complementos y código personalizado se basan en el objeto de consulta principal, por lo que romper el objeto de consulta principal significa que está rompiendo las funcionalidades de los complementos y el código personalizado. Una de esas funciones es la función de paginación más importante, por lo que si interrumpe la consulta principal, interrumpe la paginación.
Para probar qué tan malo query_posts
es, en cualquier plantilla, haga lo siguiente y compare los resultados
var_dump( $wp_query );
query_posts( '&posts_per_page=-1' );
var_dump( $wp_query );
get_posts
y WP_Query
son la forma correcta de construir consultas secundarias ( como publicaciones relacionadas, controles deslizantes, contenido destacado y contenido en portadas estáticas ) con. Cabe señalar, no debe utilizar ninguno de los dos a favor de la consulta principal en la página de inicio, página única o cualquier tipo de página de archivo, ya que romperá la funcionalidad de la página. Si necesita modificar la consulta principal, use pre_get_posts
para hacerlo, y no una consulta personalizada. ( ACTUALIZACIÓN: para páginas frontales estáticas y páginas verdaderas, consulte Uso de pre_get_posts en páginas verdaderas y páginas frontales estáticas *)
En esencia, WP_Query
es usado por la consulta principal y también es usado por get_posts
, pero aunque los get_posts()
usos WP_Query
, existen algunas diferencias
get_posts
son más rápidos que WP_Query
. El margen depende de la cantidad de publicaciones totales del sitio. La razón de esto es que get_posts
pasa 'no_found_rows' => true
por defecto a lo WP_Query
que omite / rompe legalmente la paginación. Con 'no_found_rows' => true
, WP_Query
obtiene la cantidad de publicaciones consultadas, luego rescata, donde, de forma predeterminada, busca aún más todas las publicaciones que coinciden con la consulta para calcular la paginación.
Por esta razón, get_posts()
debe usarse solo para consultas no paginadas. Paginar get_posts
es realmente un gran desastre. WP_Query
debe usarse para todas las consultas paginadas
get_posts()
no están influenciados por los posts_*
filtros donde se WP_Query
ve influenciado por estos filtros. La razón es que get_posts
, por defecto, pasa 'suppress_filters' => true
aWP_Query
get_posts
tiene un par de parámetros adicionales como include
, exclude
, numberposts
y category
. Estos parámetros se cambian a parámetros válidos WP_Query
antes de pasarlos a WP_Query
. include
se transforma en post__in
, exclude
dentro post__not_in
, category
dentro cat
y numberposts
dentro posts_per_page
. Solo una nota, todos los parámetros que se pueden pasar a WP_Query
trabajar con get_posts
, puede ignorar y no utilizar los parámetros predeterminados deget_posts
get_posts
devuelve solo la $posts
propiedad de WP_Query
while WP_Query
devuelve el objeto completo. Este objeto es bastante útil cuando se trata de condicionales, paginación y otra información útil que se puede usar dentro del bucle.
get_posts
no usa el bucle, sino un foreach
bucle para mostrar publicaciones. Además, no hay etiquetas de plantilla disponibles de forma predeterminada. setup_postdata( $post )
tiene que usarse para hacer que las etiquetas de plantilla estén disponibles. WP_Query
utiliza el bucle y las etiquetas de plantilla están disponibles de forma predeterminada
get_posts
pasa 'ignore_sticky_posts' => 1
a WP_Query
, get_posts
por lo que por defecto ignora las publicaciones adhesivas
De acuerdo con lo anterior, si usar get_posts
o WP_Query
depende de usted y qué necesita realmente de la consulta. Lo anterior debe guiarlo en su elección
La diferencia básica es que query_posts()
es realmente solo para modificar el Loop actual. Una vez que hayas terminado, es necesario restablecer el bucle y enviarlo de manera alegre. Este método también es un poco más fácil de entender, simplemente porque su "consulta" es básicamente una cadena de URL que pasa a la función, así:
query_posts('meta_key=color&meta_value=blue');
Por otro lado, WP_Query
es más una herramienta de propósito general, y es más como escribir consultas MySQL directamente que query_posts()
lo que es. También puede usarlo en cualquier lugar (no solo en el bucle) y no interfiere con las consultas de publicaciones que se ejecutan actualmente.
Tiendo a usar WP_Query
más a menudo, como sucede. Realmente, todo se reducirá a su caso específico.
Simplemente no hay necesidad de usar query_posts()
. Todo lo que hace es crear una instancia de un nuevo objeto WP_Query y reasignar ese nuevo objeto global wp_query
.
Como referencia, la siguiente es esa query_posts()
función real .
function query_posts($query) {
$GLOBALS['wp_query'] = new WP_Query();
return $GLOBALS['wp_query']->query($query);
}
Cree una instancia de su propio objeto WP_Query si desea crear un script de consulta personalizado en profundidad. O úselo get_posts()
si todo lo que necesita hacer es alguna manipulación ligera aquí y allá.
En cualquier caso, recomiendo hacerte un favor e ir wp_includes/query.php
y examinar la WP_Query
clase.
Asegúrese de usarlo wp_reset_query()
después de usarlo query_posts()
porque afectará también el resultado de otra consulta.