En çok oy alan cevap olarak geç cevap sorgunuzu kıracak ve sadece bazı önemli noktalarda doğru değil.
Ana WP_Query ve 's filtreleri
Birincisi, WordPress dahili olarak kullanır query_posts()(etrafında ince bir sarıcı WP_Queryo olmamalı temaları veya eklentileri kullanılacak) bir yapmak WP_Query. Bu WP_Queryana döngü / sorgu görevi görüyor. Bu sorgu, asıl SQL sorgu dizesi kuruluncaya kadar bir çok filtre ve eylemle çalışacaktır. Bunlardan biri pre_get_posts. Diğerleri şunlardır posts_clauses, posts_wherevb o da sorgu dizesi bina sürecini durdurmak için izin verir.
Çekirdeğin içinde olanlara derinlemesine bir bakış
WordPress çalışan wp()fonksiyonu (içinde wp-includes/functions.phparamaları), $wp->main()( $wpde tanımlandığı sınıfı WP, bir amacı, wp-includes/class-wp.php). Bu, WordPress'e şunları söyler:
- URL'yi
WP->parse_request()aşağıdakiler üzerinde daha fazlasını kullanarak bir sorgu belirtiminde ayrıştırın .
- Koşullu Etiketler tarafından kullanılan tüm is_ değişkenlerini
$wp_query->parse_query()( $wp_queryiçinde class WP_Querytanımlanmış bir nesnedir wp-includes/query.php) kullanarak ayarlayın. Bu işlevin adına rağmen, bu durumda WP_Query->parse_queryelimizden gelenin en iyisini yaptığımızdan, bizim için herhangi bir ayrıştırma yapılmadığını unutmayın WP->parse_request().
- Sorgu belirtimini bir MySQL veritabanı sorgusuna dönüştürün ve WP_Query-> get_posts () işlevinde yayınların listesini almak için veritabanı sorgusunu çalıştırın. Gönderileri, WordPress Döngüsünde kullanılacak $ wp_query nesnesine kaydedin.
Kaynak Kodeksi
Sonuç
Ana sorguyu gerçekten değiştirmek istiyorsanız, çok çeşitli filtreler kullanabilirsiniz. Basitçe kullanmak $query->set( 'some_key', 'some_value' );için değiştirmek verileri var ya kullanımını$query->get( 'some_key' ); için almak şartlı kontrolleri yapmak verileri. Bu, yalnızca SQL sorgusunu değiştirdiğiniz için sizi ikinci bir sorgu yapmaktan kurtaracaktır .
Yapmak zorundaysan Ek bir sorgu gerekiyorsa, bir WP_Querynesneyle gidin . Bu, DB'ye başka bir sorgu ekleyecektir.
Örnek
Cevaplar her zaman bir örnekle daha iyi çalıştığı için, burada gerçekten iyi bir tane bulmuşsunuzdur (Brad Touesnard'a aittir).
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'";
}
}
Daha sonra aşağıdaki örnekte gördüğünüz gibi ikinci / ek sorgunuzu çalıştırabilirsiniz . Sorgunuzu daha sonra sıfırlamayı unutmayın.
$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;