Alan değerine göre yazıları sorgulama
4 dk okuma
Alan değerleri gerçek, türlü ve dizinli sütunlarda durduğu için, yazıları WP_Query veya get_posts() içinde meta_query birleştirmeleri olmadan doğrudan filtreleyip sıralayabilirsiniz.
$cheap = new WP_Query( [
'post_type' => 'product',
'wpmcf_query' => [
[ 'field' => 'product_details.price', 'compare' => '<=', 'value' => 200 ],
],
'orderby' => [ 'wpmcf:product_details.price' => 'ASC' ],
] );Arka planda grubun tablosu, LEFT JOIN ile bir kez mid ve mtype üzerinden birleştirilir ve koşullar, sütunları üzerinde normal SQL'e dönüşür. Her değer $wpdb->prepare() üzerinden geçirilir.
Alan başvuruları
Bir alan group_key.field_key biçiminde yazılır. JSON olarak saklanan bir alan için (Group, Repeater, onay kutusu listeleri, ...) arkasına anahtarlar veya liste konumları ekleyin:
Başvuru | İşaret ettiği yer |
|---|---|
| Sütun: |
| Alt alan |
| Bir liste değerinin ilk girdisi. |
Bölümler küçük harf, rakam ve alt çizgi içerebilir. Grubun konum kuralları olmalıdır (mid/mtype sütunları gerekir) ve alan, değer saklayan bir alan olmalıdır.
Koşullar: wpmcf_query
wpmcf_query, isteğe bağlı bir relation ile (AND varsayılan, ya da OR) koşul listesidir ve koşullar iç içe olabilir.
Koşul anahtarı | Anlamı |
|---|---|
| Alan başvurusu. |
| Karşılaştırılacak değer. Liste değerinde |
| Aşağıdaki işleçlerden biri. |
| Karşılaştırmadan önce sütuna uygulanan bir tür dönüşümü (isteğe bağlı). |
İşleçler
| SQL karşılığı |
|---|---|
| Standart karşılaştırma. |
| Metni içerir ( |
| Bir değer listesinde. Boş bir |
| Tam olarak iki değer gerekir: |
| Değer |
| Liste alanları için (onay kutuları, ilişkiler, taksonomi ve kullanıcı alanları): liste öğeyi içerir. Düz metin sütunları için: alt dize eşleşmesi. |
Tür dönüşümleri (type)
NUMERIC (işaretli tamsayı), DECIMAL (DECIMAL(65,10)), DECIMAL(10,2) ve benzerleri, SIGNED, UNSIGNED, CHAR, BINARY, DATE, DATETIME, TIME. JSON içinden okunan değerler için (metin olarak gelir) tür dönüşümü kullanın:
'wpmcf_query' => [
[ 'field' => 'product_details.dimensions.weight', 'compare' => '>', 'value' => 2, 'type' => 'NUMERIC' ],
]Birleştirme
'wpmcf_query' => [
'relation' => 'AND',
[ 'field' => 'product_details.color', 'value' => 'red' ],
[
'relation' => 'OR',
[ 'field' => 'product_details.price', 'compare' => '>', 'value' => 150 ],
[ 'field' => 'product_details.title_x', 'value' => 'A' ],
],
],Sınırlar: en fazla 5 düzey iç içe geçme ve sorgu başına en fazla 30 koşul.
Sıralama: wpmcf:
Alan başvurusunun önüne wpmcf: koyarak bir orderby anahtarı olarak kullanın. Alana göre sıralamayı WordPress'in kendi anahtarlarıyla karıştırabilirsiniz; alana göre sıralama önce gelir.
'orderby' => [
'wpmcf:product_details.price' => 'DESC',
'date' => 'DESC',
],- Değeri boş olan yazılar her iki yönde de sona sıralanır.
- Password alanları sıralama için kullanılamaz.
- Sorgu başına en fazla 5
wpmcf:anahtarı. - Sıralamada
typedönüşümü kullanılamaz: doğru türde bir sütun üzerinden sıralayın veya sütunu doğru türde yapın.
Mesafe araması: wpmcf_distance
Bir Map alanı için, bir noktanın belirli bir yarıçapı içindeki yazıları bulun ve mesafeye göre sıralayın:
$near = wpmcf_query_posts( [
'post_type' => 'place',
'posts_per_page' => 20,
'wpmcf_distance' => [
'field' => 'places.location',
'lat' => 40.71,
'lng' => -74.01,
'radius' => 25, // optional
'unit' => 'km', // km (default) or mi
],
'orderby' => [ 'wpmcf_distance' => 'ASC' ],
] );
foreach ( $near as $post ) {
printf( '%s - %.1f km', esc_html( $post->post_title ), $post->wpmcf_distance );
}Her sonuç $post->wpmcf_distance değerini taşır. Mesafe, büyük daire mesafesidir. Bir radius verildiğinde sorgu önce bir sınırlayıcı kutuyla kısıtlar (bu yüzden Map alanındaki dizin, Add index, yardımcı olur), ardından tam mesafeyle. radius olmadan koordinatı olan her yazı döndürülür. Koordinatı olmayan yazılar dışarıda bırakılır.
wpmcf_query_posts()
get_posts() varsayılan olarak sorgu filtrelerini bastırır, bu yüzden wpmcf_query orada etkisizdir. wpmcf_query_posts() kullanın; bu, get_posts() işlevinin suppress_filters değeri false yapılmış ve bir hata günlüğe kaydedilecek (Settings › Health altında) ve sayfanızı bozmak yerine boş dizi döndürülecek şekilde sarılmış halidir:
$posts = wpmcf_query_posts( [
'post_type' => 'product',
'posts_per_page' => -1,
'fields' => 'ids',
'wpmcf_query' => [ [ 'field' => 'product_details.price', 'compare' => 'BETWEEN', 'value' => [ 50, 350 ] ] ],
'orderby' => [ 'wpmcf:product_details.price' => 'ASC' ],
] );WP_Query için özel bir şey gerekmez.
Hatalar hiçbir şeyle eşleşmez
Kullanılamayan bir argüman (bilinmeyen grup veya alan, bilinmeyen compare veya tür dönüşümü, skaler olmayan değer, konum kuralı olmayan grup, sıralamada kullanılan Password alanı) tüm sorgunun hiç yazı döndürmesine neden olur ve WP_DEBUG açıksa sorunu adıyla belirten bir _doing_it_wrong() bildirimi verir. Bir yazım hatası asla tüm yazıları listelemez.
Hız
- Sık filtrelediğiniz veya sıraladığınız alanlara dizin ekleyin (Add index); normal bir dizin
=, aralıklar,INve sıralamada yardımcı olur. - JSON sütunları içindeki değerler üzerindeki koşullar dizin kullanamaz.
LIKE '%text%'sütunu tarar.CONTAINSliste alanlarındaJSON_CONTAINSkullanır.
Tabloyu kendiniz de birleştirebilirsiniz:
SELECT p.ID, d.price
FROM wp_posts p
JOIN wp_wpmcf_fg_product_details d ON d.mid = p.ID AND d.mtype = 'posts'
WHERE p.post_status = 'publish' AND d.price BETWEEN 50 AND 350
ORDER BY d.price;Diğer nesneler
wpmcf_query yazıları filtreler. Kullanıcılar, terimler ve yorumlar için grup tablosunu kendi SQL'inizde mtype değerini users, terms veya comments yaparak birleştirin. Pro yönetim sütunları liste ekranlarına alan filtreleri ekler, bkz. Yönetim sütunları. Pro sayfa oluşturucu yazı ızgarası aynı wpmcf_query ve wpmcf: orderby argümanlarını kabul eder; bkz. Sayfa oluşturucular.
Sorun giderme
Sorun | Çözüm |
|---|---|
Hiç yazı dönmüyor | Bir başvuru veya işleç yanlış, grubun konum kuralı yok ya da tür dönüşümü bilinmiyor. |
Koşul, | Şunu kullanın: |
Group içindeki sayılar metin gibi sıralanıyor | Koşullarda bir |
| Ana sorguda bu bilerek böyledir; ziyaretçilerin gerçekten sıralama yapabilmesini istiyorsanız |
Büyük sitede yavaş | Filtrelenen sütuna dizin ekleyin ve sık çalışan yolda JSON yollarından kaçının. |
Hâlâ takıldınız mı? Destek ile iletişime geçin