La respuesta tardía, como la respuesta más votada, interrumpirá tu consulta y simplemente no es cierta en algunos puntos importantes.
El main WP_Query y sus filtros
Primero, WordPress usa internamente query_posts()
(una envoltura delgada alrededor de WP_Query
que no debería usarse en temas o complementos) para hacer un WP_Query
. Este WP_Query
está actuando como el bucle / consulta principal. Esta consulta se ejecutará a través de muchos filtros y acciones hasta que se genere la cadena de consulta SQL real. Uno de ellos es pre_get_posts
. Otros son posts_clauses
, posts_where
, etc. que también le permiten interceptar el proceso de creación de cadenas de consulta.
Una mirada en profundidad a lo que sucede dentro del núcleo
WordPress ejecuta la función wp()
(en wp-includes/functions.php
), que llama a $wp->main()
( $wp
es un objeto de la clase WP, que se define en wp-includes/class-wp.php
). Esto le dice a WordPress que:
- Analice la URL en una especificación de consulta usando
WP->parse_request()
- más sobre esto a continuación.
- Establezca todas las variables is_ que son utilizadas por las etiquetas condicionales usando
$wp_query->parse_query()
( $wp_query
es un objeto de class WP_Query
, que se define en wp-includes/query.php
). Tenga en cuenta que a pesar del nombre de esta función, en este caso WP_Query->parse_query
no realiza ningún análisis por nosotros, ya que se realiza de antemano en WP->parse_request()
.
- Convierta la especificación de la consulta en una consulta de la base de datos MySQL y ejecute la consulta de la base de datos para obtener la lista de publicaciones, en la función WP_Query- > get_posts (). Guarde las publicaciones en el objeto $ wp_query que se usará en el bucle de WordPress.
Fuente Codex
Conclusión
Si realmente desea modificar la consulta principal, puede usar una amplia variedad de filtros. Simplemente use $query->set( 'some_key', 'some_value' );
para cambiar los datos allí o use $query->get( 'some_key' );
para recuperar datos para hacer verificaciones condicionales. Esto evitará que realice una segunda consulta, ya que está modificando solo la consulta SQL.
Si tienes que hacer una consulta adicional , ve con un objeto WP_Query
. Esto agregará otra consulta a la base de datos.
Ejemplo
Como las respuestas siempre funcionan mejor con un ejemplo, aquí tienes una muy buena (apoyos a Brad Touesnard), que simplemente extiende el objeto central y, por lo tanto, es bastante reutilizable (crea un complemento):
class My_Book_Query extends WP_Query
{
function __construct( $args = array() )
{
// Forced/default args
$args = array_merge( $args, array(
'posts_per_page' => -1
) );
add_filter( 'posts_fields', array( $this, 'posts_fields' ) );
parent::__construct( $args );
}
public function posts_fields( $sql )
{
return "{$sql}, {$GLOBALS['wpdb']->terms}.name AS 'book_category'";
}
}
Luego puede ejecutar su segundo / consulta adicional como puede ver en el siguiente ejemplo. No olvides restablecer tu consulta después.
$book_query = new My_Book_Query();
if ( $book_query->have_posts() )
{
while ( $book_query->have_posts() )
{
$book_query->the_post();
# ...do stuff...
} // endwhile;
wp_reset_postdata();
} // endif;