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?
wp-query
query-posts
query
get-posts
Dan Gayle
fuente
fuente
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 delpre_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.fuente
query_posts()
es una función de envoltura pequeñaWP_Query
, lo único que hace (según el diagrama de flujo) es sobrescribir global$wp_query
query_posts()
conWP_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 unpre_get_posts
filtro. developer.wordpress.com/2012/05/14/…query_posts
- Nunca deberías usarloquery_posts
. Además de lo que ha dicho @Rarst, el problema realmente grandequery_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 resultadosget_posts
yWP_Query
son la forma correcta de construir consultas secundarias ( como publicaciones relacionadas, controles deslizantes, contenido destacadoy 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, usepre_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 porget_posts
, pero aunque losget_posts()
usosWP_Query
, existen algunas diferenciasget_posts
son más rápidos queWP_Query
. El margen depende de la cantidad de publicaciones totales del sitio. La razón de esto es queget_posts
pasa'no_found_rows' => true
por defecto a loWP_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. Paginarget_posts
es realmente un gran desastre.WP_Query
debe usarse para todas las consultas paginadasget_posts()
no están influenciados por losposts_*
filtros donde seWP_Query
ve influenciado por estos filtros. La razón es queget_posts
, por defecto, pasa'suppress_filters' => true
aWP_Query
get_posts
tiene un par de parámetros adicionales comoinclude
,exclude
,numberposts
ycategory
. Estos parámetros se cambian a parámetros válidosWP_Query
antes de pasarlos aWP_Query
.include
se transforma enpost__in
,exclude
dentropost__not_in
,category
dentrocat
ynumberposts
dentroposts_per_page
. Solo una nota, todos los parámetros que se pueden pasar aWP_Query
trabajar conget_posts
, puede ignorar y no utilizar los parámetros predeterminados deget_posts
get_posts
devuelve solo la$posts
propiedad deWP_Query
whileWP_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 unforeach
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 predeterminadaget_posts
pasa'ignore_sticky_posts' => 1
aWP_Query
,get_posts
por lo que por defecto ignora las publicaciones adhesivasDe acuerdo con lo anterior, si usar
get_posts
oWP_Query
depende de usted y qué necesita realmente de la consulta. Lo anterior debe guiarlo en su elecciónfuente
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í:Por otro lado,
WP_Query
es más una herramienta de propósito general, y es más como escribir consultas MySQL directamente quequery_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.fuente
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 objetoglobal wp_query
.Como referencia, la siguiente es esa
query_posts()
función real .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 laWP_Query
clase.fuente
Asegúrese de usarlo
wp_reset_query()
después de usarloquery_posts()
porque afectará también el resultado de otra consulta.fuente
Si recuerdo haber leído bien, esencialmente "el bucle" está funcionando
WP_Query
en los archivos principales, pero de una manera más fácil de entender.fuente
fuente
Yo diría que no lo uses
get_posts()
en un complemento. Impone filtros muy restrictivas en algunos casos (serie desuppress_filters
,ignore_sticky_posts
, etc.) y debe probablemente sólo ser utilizados en un tema cuando se quiere que se haga algo rápido.fuente