La risposta tardiva in quanto la risposta più votata interromperà la tua domanda e semplicemente non è vera in alcuni punti importanti.
Il principale WP_Query e i suoi filtri
Innanzitutto, WordPress utilizza internamente query_posts()
(un involucro sottile WP_Query
che non dovrebbe essere usato in temi o plugin) per fare un WP_Query
. Questo WP_Query
agisce come loop / query principale. Questa query verrà eseguita attraverso molti filtri e azioni finché non viene creata la stringa di query SQL effettiva. Uno di questi è pre_get_posts
. Altri sono posts_clauses
, posts_where
ecc. Che consentono anche di intercettare il processo di creazione della stringa di query.
Uno sguardo approfondito a ciò che accade all'interno del nucleo
WordPress esegue la wp()
funzione (in wp-includes/functions.php
), che chiama $wp->main()
( $wp
è un oggetto della classe WP, che è definito in wp-includes/class-wp.php
). Questo dice a WordPress di:
- Analizza l'URL in una specifica di query usando
WP->parse_request()
- più su quello sotto.
- Impostare tutte le variabili is_ utilizzate dai tag condizionali utilizzando
$wp_query->parse_query()
( $wp_query
è un oggetto di class WP_Query
, che è definito in wp-includes/query.php
). Si noti che nonostante il nome di questa funzione, in questo caso in WP_Query->parse_query
realtà non esegue alcuna analisi per noi, dal momento che viene eseguito in anticipo WP->parse_request()
.
- Converti la specifica della query in una query del database MySQL ed esegui la query del database per ottenere l'elenco dei post, nella funzione WP_Query-> get_posts (). Salvare i post nell'oggetto $ wp_query da utilizzare nel ciclo di WordPress.
Codice sorgente
Conclusione
Se desideri davvero modificare la query principale, puoi utilizzare un'ampia varietà di filtri. Basta usare $query->set( 'some_key', 'some_value' );
per modificare i dati lì o usare $query->get( 'some_key' );
per recuperare i dati per fare controlli condizionali. Questo ti salverà dal fare una seconda query, poiché stai modificando solo la query SQL.
Se devi fare una query aggiuntiva , vai con un WP_Query
oggetto. Ciò aggiungerà un'altra query al DB.
Esempio
Dato che le risposte funzionano sempre meglio con un esempio, qui ne hai uno davvero bello (oggetti di scena di Brad Touesnard), che estende semplicemente l'oggetto principale e quindi è abbastanza riutilizzabile (crea un plugin):
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'";
}
}
È quindi possibile eseguire la seconda / query aggiuntiva come si può vedere nell'esempio seguente. Non dimenticare di reimpostare la query in seguito.
$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;