Yazıları sorgulama
4 dk okuma
Alan değerleri gerçek tablo sütunlarında tutulur; bu yüzden WP_Query, wp_postmeta tablosunu taramak yerine indeksli bir JOIN ile bu değerler üzerinde filtreleme ve sıralama yapabilir. WP_Query için üç ek argüman kullanırsınız:
Argüman | Amaç |
|---|---|
| Alan değerleri üzerinde koşullar |
| Bir alana göre sıralama |
| Bir noktanın çevresinde mesafe araması (Map alanları) |
$query = new WP_Query( [
'post_type' => 'listing',
'posts_per_page' => 12,
'wpmcf_query' => [
'relation' => 'AND',
[ 'field' => 'listing.price', 'compare' => '<=', 'value' => 500 ],
[ 'field' => 'listing.features', 'compare' => 'CONTAINS', 'value' => 'garden' ],
],
'orderby' => [ 'wpmcf:listing.price' => 'ASC', 'date' => 'DESC' ],
] );Buradaki her şey yazılar (herhangi bir yazı türü) için WP_Query üzerinde geçerlidir. Yalnızca kullanıcılara, terimlere veya yorumlara bağlı gruplar bu yolla sorgulanamaz: grubun yazılara bağlanan konum kuralları olmalıdır, aksi halde sorgu hiçbir şey eşleştirmez.
wpmcf_query_posts()
wpmcf_query_posts( array $args ): array // WP_Post[] or int[] with 'fields' => 'ids'get_posts(), suppress_filters değeri false olmaya zorlanmış halde çalışır; alan sorgusu buna ihtiyaç duyar. Sorgu başarısız olursa boş dizi döndürür (ve günlüğe yazar). get_posts() yerine bunu kullanın:
$posts = wpmcf_query_posts( [
'post_type' => 'listing',
'numberposts' => -1,
'wpmcf_query' => [ [ 'field' => 'listing.price', 'value' => 20 ] ],
] );Alan referansları
Referans "group.field" biçimindedir; isteğe bağlı olarak ardından bir JSON değerinin içindeki anahtarlar veya liste indeksleri gelebilir:
listing.price
listing.details.city (Group field)
listing.tags.0 (list item)Her bölüm [a-z0-9_] kalıbına uymalıdır (1 ila 64 karakter). Yalnızca sütunu olan alanlar çalışır; Password alanları sorgulanamaz veya sıralanamaz (bunlara yapılan sorgu hiçbir şey eşleştirmez).
wpmcf_query
Bir koşul dizisi ve isteğe bağlı relation değeri:
'wpmcf_query' => [
'relation' => 'OR', // 'AND' (default) or 'OR'
[ 'field' => 'listing.price', 'compare' => '>', 'value' => 100, 'type' => 'NUMERIC' ],
[ 'relation' => 'AND', [ ... ], [ ... ] ], // nested group
]Koşul anahtarları
Anahtar | Açıklama |
|---|---|
| Referans (zorunlu) |
| Skaler bir değer ya da şunlar için dizi: |
| Aşağıdaki operatörlerden biri, büyük/küçük harfe duyarsız. Varsayılan |
| Karşılaştırmadan önce sütunun dönüştürüleceği tür. Aşağıya bakın. |
Operatörler
Operatör | Anlamı |
|---|---|
| Tek bir değerle karşılaştırma |
| Değer listedeki öğelerden biridir (değildir). Boş bir |
|
|
| Alt dize eşleşmesi (değer sizin için |
| Sütun |
| Liste alanlarında (Checkbox, Relationship, Taxonomy, User) bir öğeyle ( |
Diğer tüm operatörler (REGEXP, ...) hatadır (bkz. "Geçersiz argümanlar").
Türler
type, karşılaştırmadan önce sütunu dönüştürür: NUMERIC (SIGNED olur), DECIMAL (DECIMAL(65,10) anlamına gelir) veya DECIMAL(M,D) (M ve D en çok iki basamak, D <= M, örneğin DECIMAL(10,2)), SIGNED, UNSIGNED, CHAR, BINARY, DATE, DATETIME, TIME. Number sütunları zaten sayısaldır; bir sabitle karşılaştırdığınız tarih dizeleri için DATE/DATETIME kullanın. Bir sayıyı CHAR türüne dönüştürmek onun ondalık metnini verir (saklanan 20 değeri '20.000000' olur), bu yüzden = ile '20' karşılaştırması eşleşmez; sayılar için bundan kaçının.
Doğrulanmış sonuçlar
Fiyatı 10, 20 ve 30 olan üç yazı ve değeri olmayan başka yazılar:
Koşul | Eşleşen |
|---|---|
| 20 olan |
| 10 ve 30 (değeri olmayan yazılar eşleşmez) |
| 20, 30 |
| 20, 30 |
| 10 |
| 10, 30 |
| 20 |
| değeri olan üç yazı |
| değeri olmayan yazılar |
| b/B içeren satırlar (büyük/küçük harfe duyarsız harmanlama) |
| listesinde şunu içeren satırlar: |
| içinde |
yol | Group'un |
Sınırlar
- İç içe geçme derinliği: 5 düzey. Daha derin sorgular geçersizdir.
- Sorgu başına en fazla 30 koşul.
- Başvurulan her alan grubu bir kez birleştirilir.
Sıralama
Şu anahtarları wpmcf:group.field biçiminde orderby değerine ekleyin:
'orderby' => [ 'wpmcf:listing.price' => 'DESC', 'title' => 'ASC' ]
'orderby' => 'wpmcf:listing.price', 'order' => 'DESC' // string form- Alan sıralaması önce gelir, ardından WordPress'in kendi sıralaması uygulanır.
- Boş değerler her iki yönde de en sona sıralanır.
- Sorgu başına en fazla 5
wpmcf:anahtarı (fazlası yok sayılır). - Yön
ASCveyaDESColmalıdır; başka bir değerDESCsayılır (dize biçimini kullandığınızda düz birorderuygulanır:ASCveyaDESC). - Password alanları kullanılamaz (geçersiz sorgu).
Mesafe araması
Bir Map alanı için:
'wpmcf_distance' => [
'field' => 'listing.place',
'lat' => 40.7,
'lng' => -74.0,
'radius' => 50, // optional; km by default
'unit' => 'km', // 'km' (default) or 'mi'
],
'orderby' => 'wpmcf_distance', 'order' => 'ASC',- Yalnızca koordinatı olan yazılar döndürülür.
- Yarıçap için
radiusverilirse sonuçlar o mesafeyle sınırlanır (önce bir sınırlayıcı kutu uygulanır; bu yüzden enlem/boylam sütunları üzerindeki bir indeks yardımcı olur). Verilmezse koordinatı olan tüm yazılar döndürülür. - Döndürülen her yazıda
$post->wpmcf_distancebulunur (seçilen birimde; New York yakınındaki iki yazı için1.4km ve33.36km olarak doğrulandı). orderby => 'wpmcf_distance'bu değere göre sıralar vewpmcf_distanceargümanını gerektirir.lat-90 ile 90 arasında,lng-180 ile 180 arasında,radiuspozitif olmalıdır.
Geçersiz argümanlar
Kullanılamayan bir argüman (bilinmeyen grup veya alan, bilinmeyen operatör, iki değeri olmayan BETWEEN, = için dizi değeri, Password alanı, mesafe için map olmayan alan, hatalı enlem, çok fazla koşul, aşırı derin iç içelik, yazılara bağlı olmayan grup) sorgunun hiçbir şey eşleştirmemesine (AND 0 = 1) ve bir _doing_it_wrong() bildirimi oluşmasına (WP_DEBUG ile görünür) neden olur. Dolayısıyla bir yazım hatası asla tüm yazıları listelemez. Tüm değerler $wpdb->prepare() ile bağlanır; tanımlayıcılar doğrulanır, bu yüzden x' OR 1=1 -- gibi bir değer ya da ters tırnak içeren bir alan referansı enjeksiyon yapmak yerine hiçbir şey eşleştirmez.
Ana sorgu sıralaması korunur
orderby herkese açık bir sorgu değişkenidir (?orderby=wpmcf:listing.price). Ön yüzdeki ana sorguda alan sıralaması yalnızca kod tarafından ayarlandığında dikkate alınır, ziyaretçinin URL'si istediğinde alınmaz. Bu, kimsenin adres çubuğundan rastgele sütunlara (özel olanlar dahil) göre sıralama yapmasını engeller. Doğrulandı: ?orderby=wpmcf:... ile ana sorgu alan sıralamasını yok sayar. Bunu bilerek etkinleştirmek için:
add_filter( 'wpmcf/query/public_orderby', '__return_true' );İkincil sorgular (new WP_Query, wpmcf_query_posts()) ve yönetim sorguları bundan etkilenmez.
Örnekler
// Price range, newest first, with pagination.
$q = new WP_Query( [
'post_type' => 'listing',
'paged' => max( 1, get_query_var( 'paged' ) ),
'wpmcf_query' => [
[ 'field' => 'listing.price', 'compare' => 'BETWEEN', 'value' => [ 100000, 500000 ] ],
[ 'field' => 'listing.status', 'value' => 'for_sale' ],
],
] );
// Opening on or after a date (Date picker column).
$q = new WP_Query( [
'post_type' => 'event',
'wpmcf_query' => [ [ 'field' => 'event.starts', 'compare' => '>=', 'value' => gmdate( 'Y-m-d' ), 'type' => 'DATE' ] ],
'orderby' => [ 'wpmcf:event.starts' => 'ASC' ],
] );
// Nearest stores.
$stores = wpmcf_query_posts( [
'post_type' => 'store',
'numberposts' => 10,
'wpmcf_distance' => [ 'field' => 'store.place', 'lat' => $lat, 'lng' => $lng, 'radius' => 25 ],
'orderby' => 'wpmcf_distance',
'order' => 'ASC',
] );
foreach ( $stores as $store ) {
printf( '%s: %.1f km', esc_html( $store->post_title ), $store->wpmcf_distance );
}Notlar
- Grubun tablosunda satırı olmayan bir yazının her alanı
NULLdeğerindedir; bu yüzdenNOT EXISTS,NOT CONTAINSve!=gibi olumsuzlamalar yukarıdaki tabloda gösterildiği gibi davranır. - Pro'nun yönetim sütunu filtreleri aynı
wpmcf_queryargümanı üzerine kuruludur.
Hâlâ takıldınız mı? Destek ile iletişime geçin