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_Query
o olmamalı temaları veya eklentileri kullanılacak) bir yapmak WP_Query
. Bu WP_Query
ana 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_where
vb 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.php
aramaları), $wp->main()
( $wp
de 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_query
içinde class WP_Query
tanımlanmış bir nesnedir wp-includes/query.php
) kullanarak ayarlayın. Bu işlevin adına rağmen, bu durumda WP_Query->parse_query
elimizden 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_Query
nesneyle 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;