맞춤 게시물 유형별 get_terms


19

'국가'와 '도시'와 공유 분류법 '플래그'의 두 가지 맞춤 게시물 유형이 있습니다.

내가 사용하는 경우 :

<?php $flags = get_terms('flag', 'orderby=name&hide_empty=0');

분류 체계에있는 모든 용어 목록을 얻었지만 목록을 게시물 유형 '국가'로 제한하고 싶습니다.

어떻게하니?


새로운 솔루션 사용

<?php 
$flags = wpse57444_get_terms('flags',array('parent' => 0,'hide_empty' => 1,'post_types' =>array('country')));
foreach ($flags as $flag) {
    $childTerms = wpse57444_get_terms('flags',array('parent' => $flag->term_id,'hide_empty' => 1,'post_types' =>array('country')));
    foreach ($childTerms as $childTerm) {
        echo $childTerm->name.'<br />';
    }
}
?>

$ childTerm-> name을 에코 할 수 없습니다. 왜?


좀 더 명확 해 지실 수 있습니까?
TheDeadMedic

답변:


16

나는 이것이 기본적으로 가능하지 않다는 것을 두려워합니다 (아직?). 이 트랙을보십시오 : http://core.trac.wordpress.org/ticket/18106

마찬가지로 분류 체계 관리 페이지에서 게시물 수는 모든 게시물 유형을 반영 합니다 . ( 저도 trac 티켓이 있다고 확신합니다 ) http://core.trac.wordpress.org/ticket/14084

이 관련 게시물 도 참조하십시오 .


새로운 솔루션

아래에 하나를 작성한 후, get_terms()전화에 제공된 필터를 사용하는 것이 훨씬 더 나은 방법을 발표했습니다 (더 많은 것을 할 수 있다는 의미에서) . get_termsSQL 쿼리를 조작하기위한 필터를 사용 하고 조건부로 추가 하는 랩퍼 함수를 ​​작성할 수 있습니다 (게시 유형별로 제한하기 위해).

이 함수는와 동일한 인수를 사용 get_terms($taxonomies, $args)합니다. $args추가 인수 post_types는 포스트 유형의 배열을 취합니다.

그러나 나는 모든 것이 '예상대로'작동한다는 것을 보증 할 수 없습니다 (나는 패딩을 생각하고 있습니다). 에 $args대한 기본값을 사용하여 작동하는 것 같습니다 get_terms.

function wpse57444_get_terms( $taxonomies, $args=array() ){
    //Parse $args in case its a query string.
    $args = wp_parse_args($args);

    if( !empty($args['post_types']) ){
        $args['post_types'] = (array) $args['post_types'];
        add_filter( 'terms_clauses','wpse_filter_terms_by_cpt',10,3);

        function wpse_filter_terms_by_cpt( $pieces, $tax, $args){
            global $wpdb;

            // Don't use db count
            $pieces['fields'] .=", COUNT(*) " ;

            //Join extra tables to restrict by post type.
            $pieces['join'] .=" INNER JOIN $wpdb->term_relationships AS r ON r.term_taxonomy_id = tt.term_taxonomy_id 
                                INNER JOIN $wpdb->posts AS p ON p.ID = r.object_id ";

            // Restrict by post type and Group by term_id for COUNTing.
            $post_types_str = implode(',',$args['post_types']);
            $pieces['where'].= $wpdb->prepare(" AND p.post_type IN(%s) GROUP BY t.term_id", $post_types_str);

            remove_filter( current_filter(), __FUNCTION__ );
            return $pieces;
        }
    } // endif post_types set

    return get_terms($taxonomies, $args);           
}

용법

$args =array(
    'hide_empty' => 0,
    'post_types' =>array('country','city'),
);

$terms = wpse57444_get_terms('flag',$args);

원래 해결 방법

위의 trac 티켓에서 영감을 얻어 (테스트를 거쳐 나에게 적합 함)

function wpse57444_filter_terms_by_cpt($taxonomy, $post_types=array() ){
    global $wpdb;

    $post_types=(array) $post_types;
    $key = 'wpse_terms'.md5($taxonomy.serialize($post_types));
    $results = wp_cache_get($key);

    if ( false === $results ) {
       $where =" WHERE 1=1";
       if( !empty($post_types) ){
            $post_types_str = implode(',',$post_types);
            $where.= $wpdb->prepare(" AND p.post_type IN(%s)", $post_types_str);
       }

       $where .= $wpdb->prepare(" AND tt.taxonomy = %s",$taxonomy);

       $query = "
          SELECT t.*, COUNT(*) 
          FROM $wpdb->terms AS t 
          INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id 
          INNER JOIN $wpdb->term_relationships AS r ON r.term_taxonomy_id = tt.term_taxonomy_id 
          INNER JOIN $wpdb->posts AS p ON p.ID = r.object_id 
          $where
          GROUP BY t.term_id";

       $results = $wpdb->get_results( $query );
       wp_cache_set( $key, $results );
    }        

    return $results;
}

용법

 $terms = wpse57444_filter_terms_by_cpt('flag',array('country','city'));

또는

 $terms = wpse57444_filter_terms_by_cpt('flag','country');

작동하지만 $ args로 무엇을 할 수 있습니까? 내 말은 ... parent = 0 & orderby = name & hide_empty = 0
user1443216

아니오-배열이어야합니다 $args = array('parent'=>0,'orderby'=>'name','hide_empty'=>0);. 쿼리 문자열을 허용하도록 이것을 편집 할 것입니다.
Stephen Harris

이 예제에서 $ args를 어디에 둘 수 있습니까 $terms = wpse57444_filter_terms_by_cpt('flag',array('country','city'));?
user1443216

새로운 솔루션에서만 가능합니다.wpse57444_get_terms()
Stephen Harris

@ user1443216 $args은 두 번째 인수입니다. 거기에wpse57444_get_terms( 'flag', array( 'country', 'city' ) );
카이저

2

위의 @ stephen-harris의 답변은 부분적으로 만 효과가있었습니다. 페이지에서 두 번 사용하려고하면 작동하지 않습니다. 또한 mysql 쿼리를 묻는 아이디어는 저를 걱정합니다. 향후 WP 업데이트와의 충돌을 피하기 위해 솔루션을 달성하기 위해 핵심 방법을 사용하는 것이 좋습니다. 다음은 그가 참조하는 Trac 티켓에 대한 의견 # 7을 기반으로 한 내 솔루션입니다.

function get_terms_by_custom_post_type( $post_type, $taxonomy ){
  $args = array( 'post_type' => $post_type);
  $loop = new WP_Query( $args );
  $postids = array();
  // build an array of post IDs
  while ( $loop->have_posts() ) : $loop->the_post();
    array_push($postids, get_the_ID());
  endwhile;
  // get taxonomy values based on array of IDs
  $regions = wp_get_object_terms( $postids,  $taxonomy );
  return $regions;
}

용법:

$terms = get_terms_by_custom_post_type('country','flag');

이것은 하나의 게시물 유형과 하나의 분류법에서만 작동합니다. 왜냐하면 그것이 필요한 것이므로 여러 값을 허용하도록이를 수정하는 것은 어렵지 않습니다.

Trac 스레드에 대해서는 이것이 제대로 확장되지 않을 수도 있다고 언급했지만 꽤 작은 규모로 작업 중이며 속도에 문제가 없었습니다.


MEE이 솔루션은 외모보다 "네이티브"- 어쨌든 -> 바로 루프의 "ENDWHILE"후 "wp_reset_postdata ()"를 호출해야합니다 wordpress.stackexchange.com/questions/144343/...
토마스 Fellinger

2

두 가지 맞춤 게시물 유형 '국가'및 '도시'및 공유 분류 체계 '플래그'. 목록을 게시물 유형 '국가'로 제한하려고합니다.

더 간단한 해결책은 다음과 같습니다.

$posts_in_post_type = get_posts( array(
    'fields' => 'ids',
    'post_type' => 'country',
    'posts_per_page' => -1,
) );
$terms = wp_get_object_terms( $posts_in_post_type, 'flag', array( 'ids' ) ); ?>

1

[편집] 이것은 Stephen Harris의 탁월한 답변에 대한 의견입니다.

이와 같은 여러 게시물 유형과 함께 사용되는 경우 어떤 용어도 반환하지 않습니다 $flags = wpse57444_get_terms('flags', array('post_types' => array('country','city')));. $ wpdb-> prepare는 $ post_types_str 문자열을 삭제하는 p.post_type IN('country,city')동안 $ post_types_str 문자열을 삭제하기 때문 p.post_type IN('country','city')입니다. 이 티켓을보십시오 : 11102 . 이 주제의 솔루션을 사용하여이 문제를 해결하십시오. /programming//a/10634225


1

또한 @Stephen Harris의 답변을 사용하려고했지만 필요한 쿼리는 단일 쿼리로 작성하고 필터 조각을 사용하는 것이 매우 어렵습니다.

또한 동일한 페이지에서 해당 함수를 여러 번 사용해야 wpse_filter_terms_by_cpt했고 랩퍼 함수 외부에서 함수를 선언하는 문제를 해결했습니다 .

어쨌든 @ Mark Pruce의 대답은 wp_get_object_terms함수에 대한 인수를 준비하기 위해 쿼리 (및 관련 루프)를 하나 더 만들어야하더라도 동일한 이유 때문에 더 잘 맞습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.