Późna odpowiedź, ponieważ najbardziej uprzywilejowana odpowiedź złamie twoje zapytanie i po prostu nie jest prawdziwa w niektórych głównych punktach.
Główny WP_Query i to filtry
Po pierwsze, WordPress używa wewnętrznie query_posts()(cienkie opakowanie, WP_Queryktóre nie powinno być używane w kompozycjach lub wtyczkach) do zrobienia WP_Query. Działa WP_Queryto jako główna pętla / zapytanie. To zapytanie będzie działać przez wiele filtrów i działań, dopóki nie zostanie utworzony rzeczywisty ciąg zapytania SQL. Jednym z nich jest pre_get_posts. Inne są posts_clauses, posts_whereitd, które również pozwalają na przechwycenie procesu budowania ciąg kwerendy.
Dogłębne spojrzenie na to, co dzieje się w rdzeniu
WordPress uruchamia wp()funkcję (in wp-includes/functions.php), która wywołuje $wp->main()( $wpjest to obiekt klasy WP, który jest zdefiniowany w wp-includes/class-wp.php). Mówi to WordPressowi:
- Parsuj adres URL do specyfikacji zapytania za pomocą
WP->parse_request()- więcej na ten temat poniżej.
- Ustaw wszystkie zmienne is_, które są używane przez tagi warunkowe, używając
$wp_query->parse_query()( $wp_queryjest to obiekt class WP_Queryzdefiniowany w wp-includes/query.php). Zauważ, że pomimo nazwy tej funkcji, w tym przypadku WP_Query->parse_querytak naprawdę nie wykonuje dla nas żadnej analizy, ponieważ odbywa się to wcześniej WP->parse_request().
- Konwertuj specyfikację zapytania na zapytanie do bazy danych MySQL i uruchom zapytanie do bazy danych, aby uzyskać listę postów, w funkcji WP_Query-> get_posts (). Zapisz posty w obiekcie $ wp_query do użycia w pętli WordPress.
Kod źródłowy
Wniosek
Jeśli naprawdę chcesz zmodyfikować główne zapytanie, możesz użyć szerokiej gamy filtrów. Po prostu użyj, $query->set( 'some_key', 'some_value' );aby zmienić tam dane lub użyj, $query->get( 'some_key' );aby pobrać dane w celu sprawdzenia warunkowego. Pozwoli to zaoszczędzić od robienia drugie zapytanie, jak jesteś zmieniając tylko zapytania SQL.
Jeśli musisz wykonać dodatkowe zapytanie, przejdź do WP_Queryobiektu. Spowoduje to dodanie kolejnego zapytania do bazy danych.
Przykład
Ponieważ odpowiedzi zawsze działają lepiej na przykładzie, masz tutaj naprawdę fajny (rekwizyty dla Brada Touesnarda), który po prostu rozszerza główny obiekt i dlatego jest dość wielokrotnego użytku (stwórz z niego wtyczkę):
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'";
}
}
Następnie możesz uruchomić drugie / dodatkowe zapytanie, jak pokazano w poniższym przykładzie. Nie zapomnij później zresetować zapytania.
$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;