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_Query
które nie powinno być używane w kompozycjach lub wtyczkach) do zrobienia WP_Query
. Działa WP_Query
to 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_where
itd, 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()
( $wp
jest 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_query
jest to obiekt class WP_Query
zdefiniowany w wp-includes/query.php
). Zauważ, że pomimo nazwy tej funkcji, w tym przypadku WP_Query->parse_query
tak 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_Query
obiektu. 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;