나는 @Manny Fleurmond의 대답을 적용 시도하고 @Jake처럼 난 오타 수정 후 작업에 가져올 수 없습니다 'orderby' => 'meta_key'
되어야한다 'orderby' => 'meta_value'
. (완전성을 위해 반드시 지켜야하는 'posts_per_page'
것은 'post_per_page'
아니지만보고있는 문제에는 영향을 미치지 않습니다.)
@Manny Fleurmond의 답변에 의해 실제로 생성 된 SQL 쿼리 (오타 수정)를 보면 다음과 같습니다.
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
이는 WP가 쿼리 변수를 구문 분석하는 방식을 보여줍니다. 각 meta_query 절에 대한 테이블을 생성 한 다음 이들을 조인하는 방법 및 정렬 방법을 파악합니다. 와 함께 단일 절만 사용하고 OR로 'compare' => 'EXISTS'
두 번째 'compare' => 'NOT EXISTS'
절을 조인 하면 순서가 엉망이됩니다. 결과적으로 LEFT JOIN은 첫 번째 절 / 테이블과 두 번째 절 / 테이블을 결합하는 데 사용되며 WP가 모든 것을 하나로 묶는 방식은 사용하여 생성 된 테이블 'compare' => 'EXISTS'
이 실제로는 사용자 정의 필드의 meta_value로 채워지는 것을 의미합니다 . 'custom_author_name'
관심있는 필드입니다. 따라서 'news'의 특정 post_type에 단일 사용자 정의 필드 만있는 경우 해당 절 / 테이블로 주문하면 원하는 결과 만 얻을 수 있다고 생각합니다.
내 상황에서 효과가 있었던 해결책은 다른 절 / 표-NOT EXISTS로 주문하는 것이 었습니다. 직관적으로 반 직관적이지만 WP가 쿼리 변수를 구문 분석하는 방식 때문에이 테이블 meta_value
은 우리가 따르는 사용자 정의 필드로 채워지는 테이블 입니다.
(내가 알아 낸 유일한 방법은 내 경우 에이 쿼리와 동등한 것을 실행하는 것입니다.
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
내가 한 것은 표시되는 열을 변경하고 GROUP BY 절을 제거하는 것입니다. 그런 다음 postmeta.meta_value 열이 모든 meta_keys에서 값을 가져 오는 반면 mt1.meta_value 열은 뉴스 사용자 정의 필드에서 meta_values 만 가져 오는 것을 보여줍니다.)
해결책
@Manny Fleurmond가 말했듯이, 이것이 orderby에 사용되는 첫 번째 절이므로 답은 절을 교환하여 다음과 같이 제공합니다.
$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);
또는 다음과 같이 절을 연관 배열로 만들고 해당 키를 기준으로 순서를 지정할 수 있습니다.
$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'
순서를 바꾸었지만 실제 메타 필드와는 아무런 관련이 없습니다.