La respuesta tardía como la respuesta más votada interrumpirá su consulta y simplemente no es cierto en algunos puntos importantes.
El principal WP_Query y sus filtros
Primero, WordPress usa internamente query_posts()
(un envoltorio delgado WP_Query
que no debe usarse en temas o complementos) para hacer una WP_Query
. Esto WP_Query
está actuando como el bucle principal / consulta. Esta consulta se ejecutará a través de muchos filtros y acciones hasta que se construya la cadena de consulta SQL real. Uno de esos 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 wp()
función (in wp-includes/functions.php
), que llama $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 eso a continuación.
- Establezca todas las variables is_ que usan 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 en WP_Query->parse_query
realidad no hace ningún análisis por nosotros, ya que eso se hace de antemano WP->parse_request()
.
- Convierta la especificación de consulta en una consulta de base de datos MySQL y ejecute la consulta de 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 para usar en el bucle de WordPress.
Codex fuente
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 datos allí o use $query->get( 'some_key' );
para recuperar datos para hacer verificaciones condicionales. Esto le ahorrará hacer una segunda consulta, ya que solo está alterando la consulta SQL.
Si tiene que hacer una consulta adicional , vaya con un WP_Query
objeto. Esto agregará otra consulta a la base de datos.
Ejemplo
Como las respuestas siempre funcionan mejor con un ejemplo, aquí tienes uno realmente bueno (accesorios para 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 segunda consulta / adicional como puede ver en el siguiente ejemplo. No olvide restablecer su 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;