wp_query를 사용하면 분류법으로 주문할 수 있습니까?


49

내 질문은 간단합니다. WP_Query를 사용하여 tax_query를 사용하여 분류법으로 필터링하는 일부 사용자 정의 유형 게시물을 검색합니다.

이제 내 문제는 분류법으로 주문하고 싶지만 웹에서 문서를 검색하고 검색하면 해결책을 찾을 수 없습니다.

WP_Query의 orderby를 사용하면 사용자 정의 메타 필드조차도 여러 필드로 주문할 수 있지만 분류법을 지원하지 않는 것 같습니다.

올바른 방향에 대한 포인터가 있습니까?

다들 감사 해요.

답변:


12

아니요, 분류 방식으로 주문하는 것은 불가능합니다. 특정 유형의 관점에서는 실제로 의미가 없기 때문입니다.

분류법은 사물을 그룹화하는 방법입니다. 따라서 게시물에 분류 체계가 있다는 것은 실제로 해당 분류 체계에서 게시물간에 공유되는 용어를 갖는 것입니다. 분류 체계에 각 게시물에 한 용어 만 사용 된 경우 분류 체계를 무의미하게 만듭니다. 그리고 용어가 원래대로 공유된다면, 그것을 순서대로 주문하면 특별히 유용한 것이 없습니다.

이러한 상황에서 사용해야 할 것은 포스트 메타입니다. 게시물 메타별로 주문할 수 있으며 각 게시물마다 고유합니다.

편집 : 즉, 필터를 사용하여 사용자 지정 SQL 쿼리를 작성하여 분류법으로 주문할 수 있지만 수정되지 않은 WP_Query에서 수행 할 수는 없습니다 : http://scribu.net/wordpress/sortable-taxonomy-columns.html

그러나 이런 종류의 작업을 수행 해야하는 경우 데이터 디자인 구조가 처음에 잘못되었습니다. 분류에서 "용어"는 실제 "데이터"가 아닙니다. 용어 자체는 고유 한 의미가 없으며 설명하는 특정 그룹에 대한 레이블 일뿐입니다. 그것들을 의미있는 데이터로 취급한다면 근본적인 디자인 결함이 있습니다.

분류법은 용어를 지정하여 항목을 그룹화합니다. 그 그룹화는 분류법의 요점이며, 용어는 그룹화에 대한 예쁜 얼굴입니다. 게시물에 할당 할 의미있는 메타 데이터가있는 경우 대신 게시물 메타를 사용해야합니다. post meta는 키와 값을 모두 사용하여 정보를 저장하기 때문에 주문할 수 있습니다 . 분류법을 사용하면 실제로 키만 저장하며 해당 값은 해당 용어별로 그룹화 된 게시물입니다.

올바른 접근 방식을 사용하면 장기적으로 훨씬 쉬워집니다. 나는 분류법으로 이상한 일을 할 수 없다고 말하지는 않지만 장기적으로 잘못 사용하여 스스로를 힘들게 만들고 있습니다.


오토 안녕하세요, 답변 주셔서 감사합니다. 나는 당신의 요점을보고 아마도 이것으로 잘못된 길을 가고 있습니다. 내 예에서는 TV 쇼 사이트에 시리즈 1, 시리즈 2, 시리즈 3 등에 대한 분류법이 있습니다. 따라서 모든 TV 쇼를 시리즈 번호별로 그룹화 할 수 있습니다. 그런 다음 에피소드, 에피소드 01, 에피소드 02 등이 동일합니다. 에피소드 및 세리별로 순서가 지정된 모든 에피소드 목록을 표시 할 때 원하는 것이 있습니다. 메타 및 사용자 정의 필드를 분석 한 후 게시하겠습니다. 오토 감사합니다.
yeope

@yeope 당신의 분류 체계는 시리즈이어야하고 당신의 용어는 시리즈 1, 시리즈 2 등등이어야합니다. 에피소드 2 등은 "시리즈 x"라는 상위 용어를 갖습니다. 그런 다음 에피소드가 원하는 위치에 맞춰 순서대로 전체 시리즈를 쿼리 할 수 ​​있습니다.
Chris_O

@Chris_O 알다시피, 당신은 거기에 돈이있을 수 있습니다! 내가 볼 수있는 유일한 문제는 각 시리즈에 대해 "에피소드 1", "에피소드 2"라는 용어를 반복해야한다는 사실입니다. 또한 시리즈에 의존하지 않고 모든 에피소드 1을 그룹화 할 수는 없지만 아마도 그 주위에 방법이 있다고 생각합니다. 감사합니다 Chris_O
yeope

2
에피소드에 분류 체계를 사용하는 것은 실제로 그룹화가 가치가 없기 때문에 의미가 없습니다. 생각해보십시오. "에피소드 1"이라는 용어가 있다면 에피소드 1을 다른 모든 TV 쇼의 다른 에피소드 1과 그룹화하는 것입니다. 에피소드 및 시리즈 번호는 특정 프로그램에만 적용되며 그룹으로는 유용하지 않기 때문에 post_meta로 더 의미가 있습니다. TV 쇼의 이름은 TV 쇼 분류법에서 용어로 유용 할 것입니다. 왜냐하면 쇼를 전체적으로 그룹화하기 때문입니다.
Otto

1
오토 흥미로운 블로그 게시물이 추적 : (안)에 사용자 정의 분류를 사용하는 경우 .
Jan Fabry

47

이 질문에 대한 답변은 허용되지 않습니다. 세금으로 주문하는 것이 "이치가 없다"고 가정하는 것은 비논리적입니다. 그가 한 대답은 이해가되지 않습니다.

메뉴 게시물 유형을 고려하십시오. 그런 다음 "Food Categories"의 관세가 있습니다. 식품 카테고리 세금에는 "조식", "점심"및 "저녁"이라는 용어가 있습니다. tax_query 매개 변수를 사용하여 쿼리를 제출하면 모든 용어가 포함 된 결과 집합이 생성되지만 게시 날짜순으로 정렬됩니다.

용어와 관련하여 이들 중 올바른 순서를 얻은 다음 게시물을 다양한 범주로 분리하여 프런트 엔드에 적절하게 표시하려면 결과 집합을 반복 한 다음 각 게시물을 쿼리해야합니다. 용어를 찾고 현재 용어와 비교하고 배열로 필터링 한 후 계속 진행하려면 결과 집합입니다. 그런 다음 표시를 위해 새 어레이를 다시 반복해야합니다. 이것은 생산적이지 않습니다.

WP에 "post__in"옵션과 같이 "tax__in"orderby 옵션이 있으면 좋을 것입니다. 그렇지 않은 경우 위의 어리석은 프로세스를 수행해야합니다. orderby 메소드를 조정하고 각각 용어를 결과 세트에 추가하기 위해 'posts_orderby'필터 및 'posts_join'필터를 사용하여 쿼리를 사용자 정의하십시오. 또는 해당 용어와 관련하여 html 섹션 내에서 필터링 할 각 용어에 대해 새 쿼리를 작성해야합니다.

가장 효율적인 방법은 필터를 사용하여 쿼리 문자열을 변경하는 것입니다. 가장 쉬운 방법은 세 개의 별도 쿼리를 수행하는 것입니다. WP API는 세금 별 주문 또는 모든 제한적인 쿼리 매개 변수를 처리해야합니다. 특정 조건에 따라 쿼리를 제한하는 경우 많은 사람들이 동일한 조건으로 주문해야 할 가능성이 높습니다.


2
미안하지만, 당신은 틀 렸습니다. 분류법에 의한 주문은 귀하의 경우에도 의미가 없습니다. 무엇을 보여주고 싶습니까? 모든 아침 식사를 먼저 마친 다음 모든 저녁 식사를 마친 다음 모든 점심 식사를? 원하는 것과 원하는 순서를 선택해야하지만 분류 체계는 그룹화 레이블 일뿐입니다. 주문해야하는 "데이터"는 의미가 없습니다. 그렇다면 분류법의 용어가 아니어야합니다. 대신 포스트 메타로 만들어야합니다.
Otto

15
물론 C'mon은 분류 용어로 게시물을 주문하려는 경우가 있습니다. 또 다른 예로는 등급 분류법이있는 영화 게시물 유형이 있습니다. 영화 목록에서 등급별로 영화 목록을 주문하려는 사람들이 G- 등급, PG 등급 등 모든 영화가 맨 위에 표시되도록 상상하는 것은 매우 쉽습니다. (이 예제와 식사 예제에서 이름 대신 term_id로 주문할 수 있습니다.) 메타가 아닌 분류법으로 가장 잘 처리되는 경우가 큰 회색 영역이 있지만 해당 분류법이 순서에 도움이 될 수도 있습니다. -할 수 있는.
SeventhSteel

2
PG 및 G 등급 등은 특정 영화에 대한 데이터라는 점을 제외하고 좋은 분류법 선택입니다. 따라서 그들은 메타입니다. 카테고리가 아니라 데이터입니다. 선택의 수가 제한되어 있어도 분류법은 아닙니다. 정렬 기준이 필요한 경우 메타 데이터로 만들거나 분류법 별 코드를 통해 분류법으로 정렬하십시오. BTW, NC17은 PG 이후입니다. 어쨌든 주문을하려면 코드가 필요합니다.
Otto

나는이 의견으로 파티에 늦었다는 것을 알고 있지만, 이것에 부딪쳤다. 분류법에 의한 주문은 일부 상황에서 의미가 있습니다. 우리는 하나의 프로젝트에 작업 유형을 게시 유형으로 한 다음 작업이 분류 법인 주 및 도시를 가지고 있습니다. 우리는 그것들을 쉽게 정리할 수 있기를 원하며 (주에있는 모든 직업을 보여 주거나 도시에있는 모든 직업을 보여주십시오) 분류법이 최선의 해결책이었습니다. 동시에, 직책을 검색 한 다음 제목, 주, 도시별로 정렬합니다.
Dennis Puzak

또 다른 유스 케이스 : 클라이언트에는 기사가 있으며 각 기사에는 카테고리가 있습니다. 고객은 모든 기사를 나열하는 페이지를 원하며 알파벳, 날짜 또는 범주별로 정렬 할 수 있습니다. 범주를 필터링 할 수도 있지만 알파벳순으로 모든 기사를 나열하는 것은 유스 케이스에 열광하지 않으며 자주 표시되는 것을 볼 수 있습니다.
윌슨 빅스

15

예,하지만 꽤 관련이 있습니다 ...

테마에서 functions.php에 추가하십시오.

function orderby_tax_clauses( $clauses, $wp_query ) {
    global $wpdb;
    $taxonomies = get_taxonomies();
    foreach ($taxonomies as $taxonomy) {
        if ( isset( $wp_query->query['orderby'] ) && $taxonomy == $wp_query->query['orderby'] ) {
            $clauses['join'] .=<<<SQL
LEFT OUTER JOIN {$wpdb->term_relationships} ON {$wpdb->posts}.ID={$wpdb->term_relationships}.object_id
LEFT OUTER JOIN {$wpdb->term_taxonomy} USING (term_taxonomy_id)
LEFT OUTER JOIN {$wpdb->terms} USING (term_id)
SQL;
            $clauses['where'] .= " AND (taxonomy = '{$taxonomy}' OR taxonomy IS NULL)";
            $clauses['groupby'] = "object_id";
            $clauses['orderby'] = "GROUP_CONCAT({$wpdb->terms}.name ORDER BY name ASC) ";
            $clauses['orderby'] .= ( 'ASC' == strtoupper( $wp_query->get('order') ) ) ? 'ASC' : 'DESC';
        }
    }
    return $clauses;
}

    add_filter('posts_clauses', 'orderby_tax_clauses', 10, 2 );

이것은 내가 찾은 것들과 내가 한 일들로 프랑켄슈타인입니다. 설명하기는 어렵지만 결론은 이것입니다.? orderby = (taxonomy query var) & order = ASC (또는 DESC)를 넣을 수 있습니다.


Drew에게 감사드립니다. SQL을 실행하려고 시도하고 약간 편집해야하지만 작동 할 수 있습니다. 내 유일한 문제는 오토가 지적한대로 잘못된 방향으로 가고 있다는 것입니다. 고마워 드류 편집-편집 할 필요가 없습니다 어디 수정이 필요한지 볼 수 있습니다 :) 감사합니다
yeope

당신이 지난 2 분 안에 그것을 잡으면 작동하지 않습니다, 계속해서 그것을 잡아라, 나는 그것을 고쳤다. 두 개의 특정 분류 체계에 맞게 설정되었으며 등록 된 모든 분류 체계에서 작동하도록 코드를 개선했습니다.
Drew Gourley

다시 한번 감사드립니다. 귀하의 솔루션을 시도해 보았을 때를 대비해 또한 다른 누군가가 그것을 사용 add_filter('posts_clauses', 'orderby_tax_clauses', 10, 2 );하려면 add_filter('posts_clauses', 'todo_tax_clauses', 10, 2 );감사 로 변경 해야 합니다 :)
yeope

그렇습니다. 이것은 이제 코드 블록에서 수정되었습니다. 작업중 인 프로젝트에서 가져 와서 후크에서 함수 이름을 변경하더라도 함수 이름을 변경하는 것을 잊었습니다.
Drew Gourley

1
이름 대신 ID로 분류법을 주문할 수 있는지 알고 있습니까? ID로 분류군을 주문하는 것과 동일한 결과를 얻으려고합니다.
Javier Villanueva

9

나는 여기서 게임에 늦게 올 것이다. 그러나 이것을하는 더 간단한 WordPressy 방법이있다.

평소처럼 세금 문의를 작성하십시오.

$tax_query = array();
$tax_query['relation']="OR";
$tax_query[] = array(
    'taxonomy' => 'product_cat',
    'field'    => 'slug',
    'terms'    => $cat_terms,
);
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

query_posts 또는 WP_Query에 대한 인수 설정

$args = array(
    'post_type'=>'post',
    'posts_per_page'=>12,
    'paged'=>$paged,
    'tax_query' => $tax_query,
);

query_posts / WP_Query 호출을하기 전에 orderby 필터에 연결하여 재정의하십시오.

add_filter('posts_orderby', 'edit_posts_orderby');
function edit_posts_orderby($orderby_statement) {
    $orderby_statement = " term_taxonomy_id ASC ";
    return $orderby_statement;
}
query_posts($args);
remove_filter('posts_orderby', 'edit_posts_orderby');

나중에 필터를 제거하는 것을 잊지 마십시오 ...

이것은 tax_query가 당신을 위해 조인 등을 생성하는 b / c에서 작동합니다. 조인에서 필드 중 하나를 순서로 지정하면됩니다.


2
term_taxonomy_id 대신 이름으로 주문하는 방법에 대한 아이디어가 있습니까? orderby_statement에서 term_taxonomy_id를 변경하면 오류가 발생합니다
tehlivi

관심있는 사람이라면 누구나 정답입니다!
Mayra M

2

글쎄, 카테고리 / 택시 노미별로 사용자 정의 게시물 유형을 정렬 한 경험을 공개하고 싶습니다.

인터넷

  1. WordPress에서 실행되는 여행사 웹 사이트
  2. 'ruta'라는 맞춤 게시물 유형의 기본 콘텐츠
  3. 이 구조의 분류 체계 여행 유형> 대륙> 국가

경우

보관 카테고리 목록 페이지에서 고객은 게시물을 정렬하기를 원했습니다.

  1. 각 대륙의 경로 수에 따라 순서가 지정된 대륙.
  2. 알파벳순으로 주문 된 국가입니다.

단계

먼저 수정되지 않은 아카이브 페이지 쿼리에서 다음과 같은 요청을 받았습니다.

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID 
FROM wp_posts 
INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) 
WHERE 1=1 
AND ( wp_term_relationships.term_taxonomy_id IN (5,6,7,8,9,10,11,12,13,15,16,17,18,19,20,21,22,23,25,26,28,29,31,32,33,35,38,95,101,102,193) )
AND wp_posts.post_type IN ('ruta', 'nav_menu_item') 
AND (wp_posts.post_status = 'publish' OR wp_posts.post_author = 45 
AND wp_posts.post_status = 'private') 
GROUP BY wp_posts.ID 
ORDER BY wp_posts.post_date DESC LIMIT 0, 20

둘째 , Sequel Pro에서 데이터베이스에 대해 SQL 코드를 편집하여 내 요구를 충족했습니다. 나는 이것을 가지고 나온다.

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID, tt1.parent AS pare,
    (
    SELECT COUNT(*) 
    FROM  wp_posts
    INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
    INNER JOIN wp_term_taxonomy AS tt1 ON ( tt1.term_taxonomy_id =      wp_term_relationships.term_taxonomy_id )
    INNER JOIN wp_term_taxonomy AS tt2 ON ( tt2.term_taxonomy_id =  tt1.term_taxonomy_id )
    WHERE 1=1  
    AND tt1.parent = pare
    ) AS Total
FROM  wp_posts
INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
INNER JOIN wp_term_taxonomy AS tt1 ON ( tt1.term_taxonomy_id =      wp_term_relationships.term_taxonomy_id )
INNER JOIN wp_terms ON ( tt1.term_id = wp_terms.term_id )
WHERE 1=1  
AND ( wp_term_relationships.term_taxonomy_id IN (5,6,7,8,9,10,11,12,13,15,16,17,18,19,20,21,22,23,25,26,28,29,31,32,33,35,38,95,101,102,193) ) 
AND wp_posts.post_type IN ('ruta', 'nav_menu_item') 
AND (wp_posts.post_status = 'publish' OR wp_posts.post_author = 45 
AND wp_posts.post_status = 'private') 
GROUP BY wp_posts.ID 
ORDER BY
total DESC,
wp_terms.name  

셋째 , posts_fields, posts_join 및 posts_orderby의 세 가지 필터를 사용하여 functions.php 파일에 쿼리를 연결했습니다.

functions.php의 코드 :

function xc_query_fields( $fields ) {

   $fields = "wp_posts.ID, wp_posts.post_title, wp_terms.name, tt1.parent AS pare,
    (
    SELECT COUNT(*) 
    FROM  wp_posts
    INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
    INNER JOIN wp_term_taxonomy AS tt1 ON ( tt1.term_taxonomy_id = wp_term_relationships.term_taxonomy_id )
    INNER JOIN wp_term_taxonomy AS tt2 ON ( tt2.term_taxonomy_id = tt1.term_taxonomy_id )
    WHERE 1=1  
    AND tt1.parent = pare
    )
    AS Total";
     return $fields;
}


function xc_query_joins( $join ) {
$join .= "INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
   INNER JOIN wp_term_taxonomy AS tt1 ON ( tt1.term_taxonomy_id = wp_term_relationships.term_taxonomy_id )
   INNER JOIN wp_terms ON ( tt1.term_id = wp_terms.term_id )";
 return $join;
}


function xc_query_orderby( $join ) {
    $join = "total DESC, wp_terms.name ";
    return $join;
 }

마지막으로 일부 조건에 따라 pre_get_post 후크에서 필터를 트리거했습니다.

function filtra_queries( $query )
{

  if (  is_archive()  && $query->is_main_query() && !is_admin()  ) {

$rutes = array('viajes-privados', 'asia', 'africa', 'oceania', 'america', 'oriente-proximo');

if  ( in_array( $query->get('category_name'), $rutes ) ) 
  {
  add_filter( 'posts_fields', 'xc_query_fields' );
  add_filter( 'posts_join', 'xc_query_joins' );
  add_filter( 'posts_orderby', 'xc_query_orderby' );
}// end if in_array

  }// end if is_archive

}
 add_filter('pre_get_posts', 'filtra_queries');

이것이 누군가를 도울 수 있기를 바랍니다.


이 작업은 분류법으로 정렬하는 데 많은 양의 코드가 사용됩니다. WP에 큰 문제가 있습니다.
serraosays

2

나는 매우 비슷한 문제를 겪었다. 커스텀 분류법 (문제)에 따라 커스텀 포스트 타입 아카이브 (잡지 기사)를 주문하고 싶다. 나는 내 사이트에서 직접 SQL 쿼리를 수행하지 않으며 일반적으로 다른 답변과 같은 경우 접근 방식을 다시 생각해야합니다.

문제 :

1) Wordpress에서는 지능적인 방식으로 분류법을 주문할 수 없습니다.

2) Wordpress는 orderby포스트 유형 WP_Query에서 분류법을 사용할 수 없습니다 (Otto 가 언급 한대로).

솔루션 :

1) 분류법 분류는 현재 Custom Taxonomy Order NE 플러그인에서 가장 잘 수행됩니다 . WYSIWYG를 통해 분류법을 주문할 수 있습니다.이 wp-admin방법은 아니지만 더 나은 것을 찾지 못했습니다.

플러그인을 설정하면 여기에서 한 것과 비슷한 것을 얻을 수 있습니다. 옵션을 기록해 둡니다 Auto-sort Queries of this Taxonomy-이하는 설정 Custom Order as Defined Above; 이것은 당신에게 당신이 필요로하는 주문을 얻습니다. 스크린 샷 :

사용자 정의 분류 순서 NE 표시

2) 분류 된 분류법을 사용하여 각 용어를 실행하는 일련의 WP_Query 호출을 작성하여 분류법으로 정렬 된 아카이브를 효과적으로 작성할 수 있습니다. 사용 get_terms()하는 모든 세금 용어의 배열을 만들려면 다음을 실행하여 foreach각 기간 동안. 이렇게하면 WP_Query각 용어 항목에 대해 특정 용어에 대한 모든 게시물을 반환하고 분류 용어로 정렬 된 아카이브를 효과적으로 만듭니다. 이를 가능하게하는 코드 :

  // Get your terms and put them into an array
  $issue_terms = get_terms([
    'taxonomy' => 'issues',
    'hide_empty' => false,
  ]);

  // Run foreach over each term to setup query and display for posts
  foreach ($issue_terms as $issue_term) {
    $the_query = new WP_Query( array(
      'post_type' => 'post',
      'tax_query' => array(
        array(
          'taxonomy' => 'issues',
          'field' => 'slug',
          'terms' => array( $issue_term->slug ),
          'operator' => 'IN'
        )
      )
    ) );

    // Run loop over each query
    while($the_query->have_posts()) :
      $the_query->the_post();

      // YOUR TEMPLATE OUTPUT FOR EACH POST

    endwhile;
  }

이 사이트 관련 읽기 : 모든 게시물을 사용자 정의 분류로 그룹화하여 사용자 정의 게시물 유형으로 표시


2

여기의 모든 솔루션이 왜 그렇게 많이 과잉 처리하는지 잘 모르겠습니다. 좋아, 그것은 10 년 전이지만 현재 다음 코드를 실행 중이며 작동합니다.

   <?php // Default
    $wheels_args = array(
        'post_type' => 'wheels',
        'posts_per_page' => '96',
        'orderby' => 'taxonomy, name', // Just enter 2 parameters here, seprated by comma
        'order'=>'ASC'
    );
    $loop = new WP_Query($wheels_args);
    ?>

이렇게하면 먼저 CPT 분류 체계가 사전 순으로 분류되며 분류 체계 그룹 내에서 사전 순으로 정렬됩니다.


@yeope 왜 이것이 허용되는 대답입니까!? 스크롤 해 주셔서 감사합니다.
Juan Solano

1

이 특정 문제에 사용한 솔루션은 다음과 같습니다. 이 솔루션은 pre_get_posts필터 를 사용할 수없고 쿼리에 기존 페이지 매김이 있는 극단적 인 경우를위한 것입니다 (예 : WooCommerce).

global $wpdb;

$taxonomies = array('my-tax-1', 'my-tax-2', 'my-tax-3');

$orderby = "'".implode("', '", array_keys($taxonomies))."'";
$id_sql = $GLOBALS['wp_query']->request;

$id_sql = preg_replace('/LIMIT\s+\d+\s?,?\s\d*/', '', $id_sql);
$id_sql = str_replace('SQL_CALC_FOUND_ROWS', '', $id_sql);

$term_sql = "SELECT
  tt.taxonomy AS `taxonomy`,
  t.name AS `term_name`,
  t.slug AS `term_slug`,
  count(*) AS `term_count`
FROM ({$id_sql}) p 
JOIN wp_term_relationships tr
  ON p.ID = tr.object_id
JOIN wp_term_taxonomy tt
  ON tr.term_taxonomy_id = tt.term_taxonomy_id
JOIN wp_terms t
  ON tt.term_id = t.term_id
WHERE tt.taxonomy IN ({$orderby})
GROUP BY t.slug
ORDER BY
  FIELD(tt.taxonomy, {$orderby})"; // Add further specific ordering here

$results = $wpdb->get_results($term_sql, ARRAY_A);

이를 사용하여 분류법, 용어 및 기간별 게시물 수별로 정렬 된 탐색 메뉴를 만들었습니다.

당신은 단순히 게시물을 원하는 경우에 쿼리를 변경 SELECT p.*하고GROUP BY p.ID


0

쿼리 전의 쿼리와 비슷하지만 너무 많은 게시물을 쿼리하지 않으면 신경 쓰지 않습니다 ... 주요 쿼리를 수정하여 템플릿으로 이동하여 새 쿼리를 생성하지 않아도됩니다. 루프 ...

function grouped_by_taxonomy_main_query( $query ) {

    if ( $query->is_home() && $query->is_main_query() ) { // Run only on the homepage

        $post_ids = array();

        $terms = get_terms('my_custom_taxonomy');

        foreach ( $terms as $term ) {
            $post_ids = array_merge( $post_ids, get_posts( array( 
                'posts_per_page' => 4, // as you wish...
                'post_type' => 'my_custom_post_type', // If needed... Default is posts
                'fields' => 'ids', // we only want the ids to use later in 'post__in'
                'tax_query' => array( array( 'taxonomy' => $term->taxonomy, 'field' => 'term_id', 'terms' => $term->term_id, )))) // getting posts in the current term
            );
        }

        $query->query_vars['post_type'] = 'my_custom_post_type'; // Again, if needed... Default is posts
        $query->query_vars['posts_per_page'] = 16; // If needed...
        $query->query_vars['post__in'] = $post_ids; // Filtering with the post ids we've obtained above
        $query->query_vars['orderby'] = 'post__in'; // Here we keep the order we generated in the terms loop
        $query->query_vars['ignore_sticky_posts'] = 1; // If you dont want your sticky posts to change the order

    }
}

// Hook my above function to the pre_get_posts action
add_action( 'pre_get_posts', 'grouped_by_taxonomy_main_query' );
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.