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_postsgancho, 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_Queryes 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_queryquery_posts()conWP_Queryno 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_postsno 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_postsfiltro. 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_postses 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_postses, en cualquier plantilla, haga lo siguiente y compare los resultadosget_postsyWP_Queryson 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_postspara 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_Queryes usado por la consulta principal y también es usado porget_posts, pero aunque losget_posts()usosWP_Query, existen algunas diferenciasget_postsson más rápidos queWP_Query. El margen depende de la cantidad de publicaciones totales del sitio. La razón de esto es queget_postspasa'no_found_rows' => truepor defecto a loWP_Queryque omite / rompe legalmente la paginación. Con'no_found_rows' => true,WP_Queryobtiene 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_postses realmente un gran desastre.WP_Querydebe usarse para todas las consultas paginadasget_posts()no están influenciados por losposts_*filtros donde seWP_Queryve influenciado por estos filtros. La razón es queget_posts, por defecto, pasa'suppress_filters' => trueaWP_Queryget_poststiene un par de parámetros adicionales comoinclude,exclude,numberpostsycategory. Estos parámetros se cambian a parámetros válidosWP_Queryantes de pasarlos aWP_Query.includese transforma enpost__in,excludedentropost__not_in,categorydentrocatynumberpostsdentroposts_per_page. Solo una nota, todos los parámetros que se pueden pasar aWP_Querytrabajar conget_posts, puede ignorar y no utilizar los parámetros predeterminados deget_postsget_postsdevuelve solo la$postspropiedad deWP_QuerywhileWP_Querydevuelve 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_postsno usa el bucle, sino unforeachbucle 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_Queryutiliza el bucle y las etiquetas de plantilla están disponibles de forma predeterminadaget_postspasa'ignore_sticky_posts' => 1aWP_Query,get_postspor lo que por defecto ignora las publicaciones adhesivasDe acuerdo con lo anterior, si usar
get_postsoWP_Querydepende 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_Queryes 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_Querymá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.phpy examinar laWP_Queryclase.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_Queryen 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