pre_get_posts 함수를 사용하여 메타 키로 게시물을 제외 할 수 있습니까?


24

많은 사람들이 pre_get_posts대신 후크 를 사용하는 것을 선호합니다 query_posts. 아래 코드는 작동하며 메타 키가 "추천 된"모든 게시물을 보여줍니다.

function show_featured_posts ( $query ) {
    if ( $query->is_main_query() ) {
       $query->set( 'meta_key', 'featured' );
       $query->set( 'meta_value', 'yes' );
    }
}

add_action( 'pre_get_posts', 'show_featured_posts' );

그러나 ' featured'meta_key 가있는 게시물을 기본 쿼리에서 제외 하고 싶습니다 . 쉬운 방법이 있습니까?

답변:


33

많은 사람들이 query_posts 대신 pre_get_posts 후크를 선호합니다

예이!

그래서 pre_get_posts필터 WP_Query개체를 의미 아무것도 를 통해 당신이 할 수있는 query_posts()당신은을 통해 할 수 $query->set()$query->get(). 특히 meta_query속성 을 사용할 수 있습니다 ( Codex 참조 ).

$meta_query = array(
                 array(
                    'key'=>'featured',
                    'value'=>'yes',
                    'compare'=>'!=',
                 ),
);
$query->set('meta_query',$meta_query);

그러나 .. 이것은 원래 '메타 쿼리'(있는 경우)를 대체합니다. 따라서 원래 메타 쿼리를 완전히 바꾸지 않으려면 다음을 제안합니다.

//Get original meta query
$meta_query = $query->get('meta_query');

//Add our meta query to the original meta queries
$meta_query[] = array(
                    'key'=>'featured',
                    'value'=>'yes',
                    'compare'=>'!=',
                );
$query->set('meta_query',$meta_query);

이 방법으로 기존 메타 쿼리와 함께 메타 쿼리를 추가합니다.

메타 relation속성을 모두 또는 하나 이상 충족하는 게시물을 반환 $meta_query하기 위해 AND또는 의 속성 을 설정하지 않을 수도 있습니다 OR.

* 참고 : 이 유형의 쿼리는 '기능'메타 키가 있지만 값이 아닌 게시물을 반환 yes합니다. '추천'메타 키가 존재하지 않는 게시물은 포함되지 않습니다. 3.5에서이 작업을 수행 할 수 있습니다 .


따라서 게시물의 meta_key가 존재하는지 / 비어 있는지 여부를 확인할 수있는 방법이 없습니까? 3.5를 기다려야합니다. 그때. 답장을 보내 주셔서 감사합니다.
칼라일

나는 단순히 메타와 상자를 생성합니다 YesNo기본적으로 선택됩니다 옵션 '아니오'. 게시물을 게시하려면을 선택 Yes합니다. 그러나 마지막 5 개의 게시물을 계속 추천하고 다른 게시물은 기본 쿼리에 표시하려고합니다. 가장 최근 5 개의 게시물 만 제외 할 수있는 방법을 찾아야하므로 매번 선택을 변경하고 싶지 않습니다. stackexchange에 대해 비슷한 질문이 많이 있으며 해당 게시물을 관리하는 쉬운 방법이 있어야합니다. (일반 성능에 영향을 미치지 않거나 많은 쿼리를 생성하지 않거나 혼합 된 SQL 쿼리를 요구하지 않는 방법)
Carlisle

BTW 모든 게시물에 대해 meta_key를 추가 Yes하거나 No값을 추가하는 것이 좋은지 잘 모르겠습니다 . featured열쇠가 없는 게시물은 제외하는 것이 좋습니다 .
칼라일

이 기능은 PHP 7로 업그레이드 한 후 Uncaught Error: [] operator not supported for strings원본 meta_query이 null로 돌아 오면 오류가 발생 하여 사이트에서 고장 났습니다. 에 $meta_query = $query->get('meta_query');대한 전환이 없으면 빈 배열로 다시 돌아가서 해결할 수 있습니다 $meta_query = ( is_array( $query->get('meta_query') ) ) ? $query->get('meta_query') : [];.
케빈 누젠트

2

일부 사람들이 사용할 수 있도록 추천 게시물에 대한 임시 솔루션을 게시하고 싶습니다. 나는 pre_get_posts여기서 후크를 사용 하지 않지만 query_posts둘 다 사용 하지는 않습니다 . 문제는 기본 쿼리를 사용하고 SQL 쿼리를 실행해야한다는 것입니다. 전문가가 코드를 확인하고 코드가 정상인지 성능 문제가 발생하지 않는지 알려면 기쁠 것입니다. 누군가 더 나은 접근 방식을 가지고 우리와 공유한다면 좋을 것입니다.

추천 게시물 쿼리 만들기

<?php 

$featured_query = new WP_query( array(
    'meta_key'       =>'featured', 
    'meta_value'     =>'yes', 
    'posts_per_page' => 5, 
    'no_found_rows'  => true
    )
);

while ($featured_query->have_posts()) : 

    $featured_query->the_post(); 
    //Stuff...

endwhile; 
wp_reset_postdata(); 

?>

주요 검색어를 작성하고 추천 meta_key가있는 게시물을 제외하고 5 개의 최신 게시물로 제외를 제한하고 다른 모든 게시물을 표시합니다.

<?php 

$excludeposts = $wpdb->get_col( "SELECT post_id FROM $wpdb->postmeta WHERE meta_key = 'featured' AND meta_value != '' ORDER BY post_id DESC LIMIT 0, 5" );

$main_query = new WP_Query( array(
    'post__not_in' => $excludeposts, 
    'paged' => $paged 
    ) 
);  

while ($main_query->have_posts()) : 

    $main_query->the_post();
    //Stuff...

endwhile;

?>

0

@Carlisle에 대한 답변으로 추천으로 표시된 최근 5 개의 게시물을 제외하려면 다음을 수행하십시오. posts_per_page를 제외 할 수로 변경하고 meta_query를 추천 카테고리를 지정하는 방법으로 변경하십시오.

function cmp_exclude_featured_posts($query) {
    $exclude = array();  //Create empty array for post ids to exclude
    if ( $query->is_main_query() ) {
            $featured = get_posts(array(
                'post_type' => 'post',
                'meta_query' => array(
                    array(
                        'key' => 'featured',
                        'value' => '1',
                        'compare' => '==',
                    ),
                ),
                'posts_per_page' => 2
            ));

            foreach($featured as $hide) {
                $exclude[] = $hide->ID;
            }   

            $query->set('post__not_in', $exclude);
        }
}

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