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