@Manny Fleurmond'un cevabını uygulamaya çalıştım ve @Jake gibi 'orderby' => 'meta_key'
olması gereken yazım hatasını düzelttikten sonra bile işe yaramadım 'orderby' => 'meta_value'
. (Ve şeyiyle olması gerektiği 'posts_per_page'
değil 'post_per_page'
ama bu konu baktı ediliyor etkilemez.)
@Manny Fleurmond'un cevabı (yazım hatalarını düzelttikten sonra) tarafından oluşturulan SQL sorgusuna bakarsanız, elde ettiğiniz şey budur:
SELECT wp_{prefix}_posts.* FROM wp_{prefix}_posts
LEFT JOIN wp_{prefix}_postmeta ON (wp_{prefix}_posts.ID = wp_{prefix}_postmeta.post_id AND wp_{prefix}_postmeta.meta_key = 'custom_author_name' )
LEFT JOIN wp_{prefix}_postmeta AS mt1 ON ( wp_{prefix}_posts.ID = mt1.post_id )
WHERE 1=1 AND (
wp_{prefix}_postmeta.post_id IS NULL
OR
mt1.meta_key = 'custom_author_name'
) AND wp_{prefix}_posts.post_type = 'news' AND
(wp_{prefix}_posts.post_status = 'publish' OR wp_{prefix}_posts.post_author = 1 AND wp_{prefix}_posts.post_status = 'private')
GROUP BY wp_{prefix}_posts.ID ORDER BY wp_{prefix}_postmeta.meta_value ASC
Bu, WP'nin sorguyu ayrıştırma şeklini gösterir: her meta_query deyimi için bir tablo oluşturur, ardından bunlara nasıl katılacağını ve neye göre sipariş verileceğini bulur. Sadece tek bir cümle kullanıyorsanız 'compare' => 'EXISTS'
, ancak ikinci 'compare' => 'NOT EXISTS'
maddeyi OR ile birleştirmemiz gerektiğinde sipariş iyi çalışır (gerektiği gibi) siparişi bozar. Sonuç olarak, LEFT JOIN hem ilk yan tümceyi / tabloyu hem de ikinci yan tümcesi / tabloyu birleştirmek için kullanılır - ve 'compare' => 'EXISTS'
WP'nin her şeyi bir araya getirme biçimi, kullanılarak oluşturulan tablonun yalnızca HERHANGİ özel alandan meta_değerlerle doldurulduğu anlamına gelir 'custom_author_name'
Bu cümle / tabloya göre sipariş vermek, yalnızca 'haberlerin' belirli post_type'ının sadece tek bir özel alana sahip olması durumunda istenen sonuçları vereceğini düşünüyorum.
Benim durumum için çalıştı çözüm diğer cümle / tablo - DEĞİL DEĞİL biri tarafından sipariş oldu. Görünüşte karşı-sezgisel biliyorum, ama WP sorgu varsayı ayrıştırma biçimi nedeniyle bu tablo meta_value
sadece peşinde olduğumuz özel alan tarafından doldurulur.
(Ben bunu anladım tek yolu benim durumum için bu sorgu eşdeğeri çalıştırarak oldu:
SELECT wp_{prefix}_posts.ID, wp_{prefix}_postmeta.meta_value, mt1.meta_value FROM wp_{prefix}_posts
LEFT JOIN wp_{prefix}_postmeta ON (wp_{prefix}_posts.ID = wp_{prefix}_postmeta.post_id AND wp_{prefix}_postmeta.meta_key = 'custom_author_name' )
LEFT JOIN wp_{prefix}_postmeta AS mt1 ON ( wp_{prefix}_posts.ID = mt1.post_id )
WHERE 1=1 AND (
wp_{prefix}_postmeta.post_id IS NULL
OR
mt1.meta_key = 'custom_author_name'
) AND wp_{prefix}_posts.post_type = 'news' AND
(wp_{prefix}_posts.post_status = 'publish' OR wp_{prefix}_posts.post_author = 1 AND wp_{prefix}_posts.post_status = 'private')
ORDER BY wp_{prefix}_postmeta.meta_value ASC
Tüm yaptığım gösterilen sütunları değiştirilir ve GROUP BY yan tümcesi kaldırılır. Bu bana neler olduğunu gösterdi - postmeta.meta_value sütununun tüm meta_key'lerden değerleri çektiğini gösterirken mt1.meta_value sütunu, haber özel alanından yalnızca meta_values çekiyordu.)
Çözüm
@Manny Fleurmond'un dediği gibi, sipariş için kullanılan ilk cümledir, bu yüzden cevap sadece cümleleri yuvarlamaktır ve bunu verir:
$args = array(
'post_type' => 'news',
'orderby' => 'meta_value',
'order' => 'ASC',
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'custom_author_name',
'compare' => 'NOT EXISTS'
),
array(
'key' => 'custom_author_name',
'compare' => 'EXISTS'
)
),
'posts_per_page' => -1
);
$query = new WP_Query($args);
Alternatif olarak, cümleleri ilişkilendirilebilir diziler yapabilir ve karşılık gelen anahtarla sıralayabilirsiniz:
$args = array(
'post_type' => 'news',
'orderby' => 'not_exists_clause',
'order' => 'ASC',
'meta_query' => array(
'relation' => 'OR',
'exists_clause' => array(
'key' => 'custom_author_name',
'compare' => 'EXISTS'
),
'not_exists_clause' => array(
'key' => 'custom_author_name',
'compare' => 'NOT EXISTS'
)
),
'posts_per_page' => -1
);
$query = new WP_Query($args);
'orderby' => 'meta_value'
için sıralamayı hiç değiştirmedi, kullandığımda sıra değiştirdi, ancak gerçek meta alanla ilgisi yoktu.