source

현재 쿼리에 상대적인 범주 수 가져오기

lovecheck 2023. 3. 28. 21:54
반응형

현재 쿼리에 상대적인 범주 수 가져오기

WordPress를 사용하고 있는데 검색 페이지에서 카테고리 내의 투고 수를 파악하여 이름 옆에 표시해야 합니다.그렇게

고양이 1(3) 고양이 2(1) 고양이 3(18)..

현재 사용하고 있는 것은get_categories()오브젝트를 제공하고 카운트를 잡는 기능$cat->count()기간 내 투고 총수를 취득합니다만, 현재 쿼리 내의 투고만 취득하면 됩니다.사용하고 있다pre_get_posts쿼리를 갱신합니다.이걸 할 방법을 아는 사람?

현재 코드 블록입니다.

foreach ( get_categories() as $cat ) {
    if ( $cat->parent === 0 ) {
        $checked = ( in_array( $cat->slug, $check ) ) ? 'checked' : '';

        printf( '<input id="%1$s" %4$s type="checkbox" name="category[%1$s]"><label for="%1$s" >%2$s ( %3$d )</label><br>',
            $cat->slug,
            $cat->name,
            $cat->count,
            $checked
        );
    }
}

여기 제 것이 있습니다.pre_get_posts액션:

add_action( 'pre_get_posts', 'breed_search_query' );
function breed_search_query( $query ) {
$cats   = ( isset( $_GET['category'] ) ) ? implode( ',', array_keys( $_GET['category'] ) ) : null;
$search = ( isset( $_GET['s'] ) ) ? sanitize_text_field( $_GET['s'] ) : null;

    if ( ! is_admin() && $query->is_main_query() && is_search() ) {
        $query->set( 'post_type', 'post' );
        $query->set( 'posts_per_page', 8 );
        $query->set( 's', $search );
        $query->set( 'category_name', $cats );
    }
}

멋지고 흥미로운 질문이네요.유감스럽게도 이 기능을 사용할 수 없습니다.get_categories다른 접근법이 필요합니다.

그 방법은 다음과 같습니다.

  • 매우 희박한 사용자 지정 쿼리를 생성하여 쿼리에 일치하는 모든 게시물에서 모든 게시 ID를 가져옵니다.

  • 게시물에 모든 카테고리를 첨부합니다.

  • 투고내의 모든 투고와 카테고리를 루프 해, 카테고리명을 키로 하고, 투고 ID를 값으로 하는 배열을 작성합니다.

  • 이 새로운 어레이를 루프하여 카테고리 이름을 표시하고 특정 키의 투고량(카테고리)을 카운트하여 표시합니다.

코드:

(주의: 다음 코드는 테스트되지 않았으며 새로운 어레이 구문()[]으로 인해 PHP 5.4+에 필요합니다.)

$cats   = ( isset( $_GET['category'] ) ) ? implode( ',', array_keys( $_GET['category'] ) ) : null;
$search = ( isset( $_GET['s'] ) ) ? sanitize_text_field( $_GET['s'] ) : null;

$args = [
    'post_type'     => 'post',
    'nopaging'      => true, // Gets all posts
    's'             => $search,
    'category_name' => $cats,
    'fields'        => 'ids', // Makes the query extremely lean, excellent for performance, only get post ID's
];
$q = get_posts( $args );

// Define our $category_array which will hold the category name/post ID's array
$category_array = [];

// Define our $category_info array which will hold the category name as key and the object as value
$category_info = [];

foreach ( $q as $post ) {
    // Get the categories attached to a post
    $categories = get_the_category( $post );

    foreach ( $categories as $category ) {
        // Create our array which will hold the category name as key and post ID's as values
        $category_array[$category->name][] = $post;
        // Create an array to hold the category objects. Use names as keys and objects as values
        $category_info[$category->name] = $category;
    } // endforeach $categories
} // endforeach $wp_query->posts
wp_reset_postdata();

// Sort the array keys alphabetical. You can change or remove this as necessary
ksort( $category_array );

foreach ( $category_array as $k=>$v ) {

    $category_slug = $category_info[$k]->slug;
    $category_parent = $category_info[$k]->parent;

    $checked = ( in_array( $category_slug, $check ) ) ? 'checked' : ''; // Just make sure that $check is defined somewhere

    // Build our string
    printf ( '<input id="%1$s" %4$s type="checkbox" name="category[%1$s]"><label for="%1$s" >%2$s ( %3$d )</label><br>', // I have not modified anything in this line
        $category_slug, // Holds the category slug
        $k, // Holds the category name
        count( $v ), // Counts and return the post count
        $checked
    );
} // endforeach $category_array

언급URL : https://stackoverflow.com/questions/31372094/get-category-count-relative-to-the-current-query

반응형