답변:
아니요, 분류 방식으로 주문하는 것은 불가능합니다. 특정 유형의 관점에서는 실제로 의미가 없기 때문입니다.
분류법은 사물을 그룹화하는 방법입니다. 따라서 게시물에 분류 체계가 있다는 것은 실제로 해당 분류 체계에서 게시물간에 공유되는 용어를 갖는 것입니다. 분류 체계에 각 게시물에 한 용어 만 사용 된 경우 분류 체계를 무의미하게 만듭니다. 그리고 용어가 원래대로 공유된다면, 그것을 순서대로 주문하면 특별히 유용한 것이 없습니다.
이러한 상황에서 사용해야 할 것은 포스트 메타입니다. 게시물 메타별로 주문할 수 있으며 각 게시물마다 고유합니다.
편집 : 즉, 필터를 사용하여 사용자 지정 SQL 쿼리를 작성하여 분류법으로 주문할 수 있지만 수정되지 않은 WP_Query에서 수행 할 수는 없습니다 : http://scribu.net/wordpress/sortable-taxonomy-columns.html
그러나 이런 종류의 작업을 수행 해야하는 경우 데이터 디자인 구조가 처음에 잘못되었습니다. 분류에서 "용어"는 실제 "데이터"가 아닙니다. 용어 자체는 고유 한 의미가 없으며 설명하는 특정 그룹에 대한 레이블 일뿐입니다. 그것들을 의미있는 데이터로 취급한다면 근본적인 디자인 결함이 있습니다.
분류법은 용어를 지정하여 항목을 그룹화합니다. 그 그룹화는 분류법의 요점이며, 용어는 그룹화에 대한 예쁜 얼굴입니다. 게시물에 할당 할 의미있는 메타 데이터가있는 경우 대신 게시물 메타를 사용해야합니다. post meta는 키와 값을 모두 사용하여 정보를 저장하기 때문에 주문할 수 있습니다 . 분류법을 사용하면 실제로 키만 저장하며 해당 값은 해당 용어별로 그룹화 된 게시물입니다.
올바른 접근 방식을 사용하면 장기적으로 훨씬 쉬워집니다. 나는 분류법으로 이상한 일을 할 수 없다고 말하지는 않지만 장기적으로 잘못 사용하여 스스로를 힘들게 만들고 있습니다.
이 질문에 대한 답변은 허용되지 않습니다. 세금으로 주문하는 것이 "이치가 없다"고 가정하는 것은 비논리적입니다. 그가 한 대답은 이해가되지 않습니다.
메뉴 게시물 유형을 고려하십시오. 그런 다음 "Food Categories"의 관세가 있습니다. 식품 카테고리 세금에는 "조식", "점심"및 "저녁"이라는 용어가 있습니다. tax_query 매개 변수를 사용하여 쿼리를 제출하면 모든 용어가 포함 된 결과 집합이 생성되지만 게시 날짜순으로 정렬됩니다.
용어와 관련하여 이들 중 올바른 순서를 얻은 다음 게시물을 다양한 범주로 분리하여 프런트 엔드에 적절하게 표시하려면 결과 집합을 반복 한 다음 각 게시물을 쿼리해야합니다. 용어를 찾고 현재 용어와 비교하고 배열로 필터링 한 후 계속 진행하려면 결과 집합입니다. 그런 다음 표시를 위해 새 어레이를 다시 반복해야합니다. 이것은 생산적이지 않습니다.
WP에 "post__in"옵션과 같이 "tax__in"orderby 옵션이 있으면 좋을 것입니다. 그렇지 않은 경우 위의 어리석은 프로세스를 수행해야합니다. orderby 메소드를 조정하고 각각 용어를 결과 세트에 추가하기 위해 'posts_orderby'필터 및 'posts_join'필터를 사용하여 쿼리를 사용자 정의하십시오. 또는 해당 용어와 관련하여 html 섹션 내에서 필터링 할 각 용어에 대해 새 쿼리를 작성해야합니다.
가장 효율적인 방법은 필터를 사용하여 쿼리 문자열을 변경하는 것입니다. 가장 쉬운 방법은 세 개의 별도 쿼리를 수행하는 것입니다. WP API는 세금 별 주문 또는 모든 제한적인 쿼리 매개 변수를 처리해야합니다. 특정 조건에 따라 쿼리를 제한하는 경우 많은 사람들이 동일한 조건으로 주문해야 할 가능성이 높습니다.
예,하지만 꽤 관련이 있습니다 ...
테마에서 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)를 넣을 수 있습니다.
add_filter('posts_clauses', 'orderby_tax_clauses', 10, 2 );
하려면 add_filter('posts_clauses', 'todo_tax_clauses', 10, 2 );
감사 로 변경 해야 합니다 :)
나는 여기서 게임에 늦게 올 것이다. 그러나 이것을하는 더 간단한 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;
$args = array(
'post_type'=>'post',
'posts_per_page'=>12,
'paged'=>$paged,
'tax_query' => $tax_query,
);
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에서 작동합니다. 조인에서 필드 중 하나를 순서로 지정하면됩니다.
글쎄, 카테고리 / 택시 노미별로 사용자 정의 게시물 유형을 정렬 한 경험을 공개하고 싶습니다.
인터넷
경우
보관 카테고리 목록 페이지에서 고객은 게시물을 정렬하기를 원했습니다.
단계
먼저 수정되지 않은 아카이브 페이지 쿼리에서 다음과 같은 요청을 받았습니다.
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');
이것이 누군가를 도울 수 있기를 바랍니다.
나는 매우 비슷한 문제를 겪었다. 커스텀 분류법 (문제)에 따라 커스텀 포스트 타입 아카이브 (잡지 기사)를 주문하고 싶다. 나는 내 사이트에서 직접 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
; 이것은 당신에게 당신이 필요로하는 주문을 얻습니다. 스크린 샷 :
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;
}
이 사이트 관련 읽기 : 모든 게시물을 사용자 정의 분류로 그룹화하여 사용자 정의 게시물 유형으로 표시
여기의 모든 솔루션이 왜 그렇게 많이 과잉 처리하는지 잘 모르겠습니다. 좋아, 그것은 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 분류 체계가 사전 순으로 분류되며 분류 체계 그룹 내에서 사전 순으로 정렬됩니다.
이 특정 문제에 사용한 솔루션은 다음과 같습니다. 이 솔루션은 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
쿼리 전의 쿼리와 비슷하지만 너무 많은 게시물을 쿼리하지 않으면 신경 쓰지 않습니다 ... 주요 쿼리를 수정하여 템플릿으로 이동하여 새 쿼리를 생성하지 않아도됩니다. 루프 ...
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' );