사용자 정의 분류에 따라 그룹화 사용자 정의 포스트 유형의 모든 게시물을 표시


18

나는 사용자 정의 분류와 사용자 정의 포스트 유형을 사용 멤버 페이지에서 일하고 있어요. 내 사용자 정의 포스트 유형이라고 member내 사용자 정의 분류가 호출됩니다 member_groups.

나는 그들의 각각의 그룹으로 함께 모든 구성원 만 그룹을 나열합니다.

그래서 명확하게하기 위해, 나는 35 개 회원 9 개 그룹으로 나누어 한 - 그래서 대신 동일한 쿼리를 내가 한 번하고 싶은 아홉 번을하지만 그룹들이 함께, 그래서 멤버 1, 멤버 4 및 회원 (11)가 한 그룹에서 함께 그룹화되어, "마케팅"이라고합니다.

WP_Query게시물 유형 회원 아래의 모든 게시물을 검색 하는 데 사용 하고 있습니다. 나는 다른 시도를 시도했지만 성공적인 결과는 없었습니다.

어떻게하면 되나요?

답변:


29

그래서, 당신은 여러 쿼리를 자동화하는 것이 좋습니다.

먼저 다음을 사용하여 사용자 지정 분류 체계에서 용어 목록을 가져옵니다 get_terms().

<?php
$member_group_terms = get_terms( 'member_group' );
?>

그런 다음 매번 새 쿼리를 실행하여 각각을 반복하십시오.

<?php
foreach ( $member_group_terms as $member_group_term ) {
    $member_group_query = new WP_Query( array(
        'post_type' => 'member',
        'tax_query' => array(
            array(
                'taxonomy' => 'member_group',
                'field' => 'slug',
                'terms' => array( $member_group_term->slug ),
                'operator' => 'IN'
            )
        )
    ) );
    ?>
    <h2><?php echo $member_group_term->name; ?></h2>
    <ul>
    <?php
    if ( $member_group_query->have_posts() ) : while ( $member_group_query->have_posts() ) : $member_group_query->the_post(); ?>
        <li><?php echo the_title(); ?></li>
    <?php endwhile; endif; ?>
    </ul>
    <?php
    // Reset things, for good measure
    $member_group_query = null;
    wp_reset_postdata();
}
?>

이 접근 방식에는 확장 성이 제한적일 수 있지만 (예 : 수백 또는 수천 명의 구성원 또는 member_group 용어가있는 경우 성능 문제가 발생할 수 있음)이 문제에 대해서는 특히 잘못된 점이 없습니다 .


네, 완벽하게 문제가 있습니다. 단지 하나의 문제입니다.이 <? php get_post_meta ($ member_group_term-> ID, 'job_title', true);?>와 같은 cutom 필드를 표시하고 싶지만 작동하지 않았습니다. > ID는했지만 아무런 문제가 없습니다. @Chip Bennett를 도와주세요.
Anahit DEV

6

사용자 정의 쿼리를 사용한 다음 용어를 이름으로 그룹화하여 솔루션을 찾았습니다.

SELECT * 
FROM wp_term_taxonomy AS cat_term_taxonomy
INNER JOIN wp_terms AS cat_terms ON cat_term_taxonomy.term_id = cat_terms.term_id
INNER JOIN wp_term_relationships AS cat_term_relationships ON cat_term_taxonomy.term_taxonomy_id = cat_term_relationships.term_taxonomy_id
INNER JOIN wp_posts AS cat_posts ON cat_term_relationships.object_id = cat_posts.ID
INNER JOIN wp_postmeta AS meta ON cat_posts.ID = meta.post_id
WHERE cat_posts.post_status =  'publish'
AND meta.meta_key =  'active'
AND meta.meta_value =  'active'
AND cat_posts.post_type =  'member'
AND cat_term_taxonomy.taxonomy =  'member_groups'

그런 다음 정규 foreach 쿼리를 사용하여 원하는 정보를 추출 할 수 있습니다.

그러나 Wordpress 자체 기능을 사용하는 경우 여전히 다른 방법에 관심이 있습니다.


방금 다른 방법을 추가했습니다. 원시 SQL 쿼리가 필요한 모든 것을 멀리하는 경향이 있습니다.
Chip Bennett

2
스키마가 어느 시점에서 변경되면 워드 프레스에서 쿼리가 작동하지 않더라도이 답변이 정답으로 표시되어 기쁩니다 ... 단일 쿼리에서 모두 수집하는 개념이 정답입니다. PHP에서 분류 체계를 그룹화하는 반복은 이만큼이나 규모가 크지 않습니다.
wowo_999

4

훨씬 더 간단합니다.

$terms = get_terms('tax_name');
$posts = array();
foreach ( $terms as $term ) {
    $posts[$term->name] = get_posts(array( 'posts_per_page' => -1, 'post_type' => 'post_type', 'tax_name' => $term->name ));
}

결과 $ posts 배열 내에서 각 세금 용어는 해당 게시물을 포함하는 중첩 배열의 핵심입니다.


4

나는이 정확한 요구를 가지고 있었고 칩의 솔루션 은 한 가지를 제외하고는 효과 'field' => 'slug'가 있었다. 필수.

    foreach ( $service_categories as $category ) {
        $services = new WP_Query( 
            array(
                'post_type'     => 'service',
                'tax_query'     => array(
                    array(
                        'taxonomy'  => 'service_category',
                        'terms'     => array( $category->slug ),
                        'operator'  => 'IN',
                        'get'       => 'all',
                        'field'     => 'slug'
                    )
                )
            ) 
        ); ?>
        <h2><?php echo $category->slug; ?></h2>
        <?php if ( $services->have_posts() ) {  // loop stuff goes here ?>

또한 결과 디스플레이가 평평해야하므로 'get' => 'all'여기에 설정되어 있습니다.

잘하면 이것은 다른 누군가를 도와줍니다.


3
$query = new WP_Query( 
   array ( 
      'post_type' => 'member', 
      'orderby'   => 'meta_value', 
      'meta_key'  => 'member_group' 
   ) 
);

그런 다음이 쿼리를 반복하면이 행을 따라 if를 사용할 수 있습니다 (php 의사 코드).

$groupName = "";
$counter = 0;
if havePosts: while havePosts: thePost

if( $groupName != post->meta_value )
{
if ($counter > 0)
{
</ul>
}
<h1>A group name</h1>
<ul>
<li>member name</li>
}
else
{
<li>member name</li>
}

endwhile;endif

</ul>

도움이 되길 바랍니다. 나는 이것이 당신이 필요했던 것보다 훨씬 더 복잡하게 만들고 있다고 생각합니다.

자세한 정보 : http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters


3

몇 년 전에 프로젝트 에서이 작업을 수행해야했습니다. djb와 비슷한 대답으로 조금 더 자세한 내용이 있습니다. 그러면 모든 분류 이름이 h3으로 출력되고 각 게시물 제목의 글 머리 기호 목록이 세부 사항 페이지에 링크됩니다.

<?php // Output all Taxonomies names with their respective items
$terms = get_terms('member_groups');
foreach( $terms as $term ):
?>                          
    <h3><?php echo $term->name; // Print the term name ?></h3>                          
    <ul>
      <?php                         
          $posts = get_posts(array(
            'post_type' => 'member',
            'taxonomy' => $term->taxonomy,
            'term' => $term->slug,                                  
            'nopaging' => true, // to show all posts in this taxonomy, could also use 'numberposts' => -1 instead
          ));
          foreach($posts as $post): // begin cycle through posts of this taxonmy
            setup_postdata($post); //set up post data for use in the loop (enables the_title(), etc without specifying a post ID)
      ?>        
          <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>    
        <?php endforeach; ?>
    </ul>                                                   
<?php endforeach; ?>

1

글쎄, 그것은 오래된 스레드이지만 누군가가 내가 한 것처럼지나 가면 도움이 될 수 있습니다. 아이디어는 기본 쿼리를 수정하여 템플릿으로 이동하고 새 쿼리 및 루프를 생성하지 않아도됩니다.

추신 : 아직 큰 DB에서 테스트해야합니다. 내 경우에는 만족 스러웠다.

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.