¿Cuándo se inicializa $wp_query y cómo anularlo?

2 minutos de lectura

Estoy tratando de escribir una nueva función de consulta usando WP_Query objeto.

Creé un nuevo archivo de plantilla y puse lo siguiente:

        $query_args = array(
            'post_type' => 'page',
            'post_parent=41',
        );

        // The Featured Posts query.
        $results = new WP_Query($query_args);

Pero independientemente de los argumentos que use, la consulta no cambia. Parece que la consulta ya está inicializada y creando una nueva WP_Query no tiene ningún efecto en la consulta existente.

La única función de wordpress llamada antes de mi código es get_header() que no incluye ninguna llamada a WP_Query o query_posts.

Pongo la siguiente línea para averiguar cuál es la consulta sql real:

echo $GLOBALS['wp_query']->request;

La consulta sql real es:

SELECT wp_posts.* FROM wp_posts WHERE 1=1 AND (wp_posts.ID = '14') AND wp_posts.post_type="page" ORDER BY wp_posts.post_date DESC

Esta consulta no cambia cuando cambio mi $query_args.

Me pregunto cuando la variable global $wp_query se inicializa y ¿qué debo hacer para usar mi propia consulta?

Estás creando un nuevo WP_Query objeto y guardarlo en $results. Ahí es donde estarán los resultados de su consulta, no en $GLOBALS['wp_query']. Por supuesto que no se sobrescribe. $wp_query. Son cosas diferentes. Probar var_dump($results) en cambio.

Puedes sobrescribir $wp_query al crear un nuevo WP_Query objeto así: $wp_query = new WP_Query($query_args);. Pero eso no es eficiente. Ejecutas dos consultas cuando solo necesitas una. La mejor manera de hacerlo es engancharse pre_get_posts. Algo como:

function alter_query_so_15250127($qry) {
   if ( $qry->is_main_query() && is_page('featured-posts-page') ) {
     $qry->set('post_type','page');
     $qry->set('post_parent',41);
   }
}
add_action('pre_get_posts','alter_query_so_15250127');

los if condicional es muy importante. Debe usar esa línea para asegurarse de que el filtro se active solo en las páginas en las que desea que se active. Su pregunta no tiene suficientes detalles para que pueda determinar las condiciones precisas.

  • Para completar esta respuesta. También tuve que sobrescribir algunos valores y establecerlos en nulo para ejecutar la consulta: $qry-> set('p' , null); $qry-> set( 'page_id' , null);

    – Rufein

    03/02/2015 a las 15:20


Eche un vistazo al siguiente diagrama publicado en http://codex.wordpress.org/Function_Reference/query_posts
ingrese la descripción de la imagen aquí

¿Ha sido útil esta solución?