Pregunta

Parece que la mitad de los tutoriales en el Codex y en torno al uso blogosfera query_posts() y medio uso WP_Query . Cuál es el problema?

¿Fue útil?

Solución

  • query_posts() es demasiado simplista y una forma problemática para modificar la consulta principal de una página reemplazándolo con nueva instancia de la consulta. Es ineficiente (repetición de las consultas SQL) y tendrá absoluta fallar en algunas circunstancias (especialmente a menudo cuando se trata de mensajes de paginación). Cualquier código WP moderna debe utilizar métodos más fiables, como hacer uso de la pre_get_posts gancho, postes pre-get para este propósito. TL;. DR no utilice nunca query_posts ()

  • get_posts() es muy similar en el uso y acepta los mismos argumentos (con algunos matices , al igual que diferentes valores por defecto), pero devuelve una tabla de mensajes, no modifica las variables globales y es seguro de usar en cualquier lugar.

  • WP_Query es la clase que alimenta tanto detrás de las escenas, sino que también puedes crear y trabajar con su propia instancia de la misma. Un poco más complejo, menos restricciones, también es seguro en cualquier lugar.

Otros consejos

query_posts - Nunca se debe utilizar nunca query_posts. Aparte de lo que @Rarst ha dicho, la realidad gran problema con query_posts está, se rompe el objeto de consulta principal (almacenada en $wp_query). Una gran cantidad de plugins y código personalizado se basa en el objeto principal de consulta, por lo rompiendo el medio principal objeto de consulta que está rompiendo las funcionalidades de los plugins y código personalizado. Sólo una tal función es la función de suma importancia paginación, por lo que si se rompe la consulta principal, se rompe la paginación.

Para demostrar lo mal query_posts es, en cualquier plantilla, haga lo siguiente y comparar 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 construcción secundarias consultas ( como mensajes relacionados, deslizadores, contenido destacado y el contenido de las portadas estática ) con. Debe tenerse en cuenta, no se debe utilizar cualquiera de los dos en favor de la consulta principal en la página principal, de una sola página o cualquier tipo de página de archivo, ya que se romperá la funcionalidad de la página. Si necesita modificar la consulta principal, utilice pre_get_posts para hacerlo, y no una consulta personalizada. ( ACTUALIZACIÓN: Para las portadas y páginas estáticas verdaderas, consulte Usando pre_get_posts en verdaderos páginas y portadas estáticas *)

En esencia, WP_Query es utilizado por la consulta principal y también es utilizado por get_posts, pero aunque get_posts() utiliza WP_Query, hay algunas diferencias

  • get_posts son más rápidos que WP_Query. El margen depende de la cantidad del total de mensajes del sitio. La razón de esto es, get_posts pasa 'no_found_rows' => true de manera predeterminada a la que WP_Query salta / rompe legalmente paginación. Con 'no_found_rows' => true, WP_Query obtiene la cantidad de mensajes consultados, a continuación, rescata, donde por defecto, búsqueda adicional para todos los mensajes que coincidan con la consulta con el fin de calcular la paginación.

    Por esta razón, get_posts() debe utilizarse sólo para consultas que no paginados. Paginar get_posts es realmente un gran lío. WP_Query se debe utilizar para todos paginado consultas

  • get_posts() no están influenciados por los filtros posts_* donde WP_Query recibe la influencia de estos filtros. La razón es que get_posts, por defecto, pasa a 'suppress_filters' => true WP_Query

  • get_posts tiene un par de parámetros adicionales como include, exclude, numberposts y category. Estos parámetros se cambian en los parámetros válidos para WP_Query antes de ser pasado a WP_Query. include se transformó en post__in, exclude en post__not_in, category en cat y numberposts en posts_per_page. Sólo una nota, todos de los parámetros que se pueden pasar a las obras WP_Query con get_posts, que puede ignorar y no utilizar los parámetros por defecto de get_posts

  • retornos get_posts sólo la propiedad de $posts WP_Query mientras WP_Query devuelve el objeto completo. Este objeto es muy útil cuando se trata de los condicionales, paginación y otra información útil que se pueden utilizar dentro del bucle.

  • get_posts no utiliza el bucle, pero un bucle foreach a los puestos de visualización. Además, no hay etiquetas de plantilla están disponibles por defecto. setup_postdata( $post ) tiene que ser utilizado para hacer las etiquetas de plantillas disponibles. WP_Query utiliza las etiquetas de bucle y de la plantilla están disponibles por defecto

  • get_posts pasa 'ignore_sticky_posts' => 1 a WP_Query, por lo get_posts por defectoignora los mensajes pegajosas

Con base en lo anterior, ya sea para uso get_posts o WP_Query depende de usted y qué es lo que realmente necesita de la consulta. Lo anterior debe guiarle en su elección

La diferencia básica es que query_posts() es realmente sólo para la modificación de la corriente de bucle. Una vez que haya terminado es necesario restablecer el bucle y enviarlo en su camino 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 se 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 directamente consultas MySQL que es query_posts(). También se puede usar en cualquier lugar (no sólo en el Loop) y que no interfiera con cualquier pregunta de correos se están ejecutando actualmente.

Me tienden a utilizar WP_Query más a menudo, como sucede. En realidad, se va a venir abajo a su caso específico.

Simplemente no hay necesidad de utilizar query_posts(). Todo lo que hace es una instancia de un nuevo objeto WP_Query y reasigna ese nuevo objeto a global wp_query.

Para referencia, la siguiente es que la función query_posts() real.

 function query_posts($query) {
        $GLOBALS['wp_query'] = new WP_Query();
        return $GLOBALS['wp_query']->query($query);
    }

instancia su propio objeto WP_Query si desea crear un profundo guión consulta personalizada. O el uso get_posts() si todo lo que necesita hacer es un poco de manipulación de la luz aquí y allá.

En cualquier caso, recomiendo encarecidamente hacer un favor y ir a wp_includes/query.php y leyendo la clase WP_Query.

Asegúrese de que utiliza wp_reset_query() después de usar query_posts() porque afectará a otro resultado de la consulta también.

Si Recuerdo haber leído bien, esencialmente "el círculo" está haciendo WP_Query en los archivos del núcleo, pero de una manera más fácil de entender.

  • query_posts () : podría ser utilizado en un solo y único caso, si resulta necesario modificar principal consulta . Se establece una gran cantidad de variables globales;
  • get_posts () : es muy similar en la mecánica y acepta mismos argumentos, pero vuelve array de mensajes
  • WP_Query : puede crear y trabajar con el propio objeto de la misma. Poco más complejo, menos restricciones, es seguro de usar en cualquier lugar.

Yo diría que no utilice get_posts() en un plugin. Impone filtros muy restrictivas en algunos casos (suppress_filters del conjunto, ignore_sticky_posts, etc.) y debe, probablemente, sólo se puede utilizar en un tema cuando se quiere que se haga algo rápido.

Licenciado bajo: CC-BY-SA con atribución
scroll top