홈페이지에서 일반 및 맞춤 게시물 유형 (meta_query 포함) 혼합


9

이것을 달성하는 방법을 모르겠습니다. 사이트 홈페이지에서 표준 게시물과 맞춤 게시물을 혼합하려고하는데 메타 값이 설정된 경우에만 맞춤 게시물을 표시하고 싶습니다. 게시물을 표시하면 정상적으로 작동 'post_type' => array('game', 'post')하지만 meta_query를 추가하면 일반 게시물이 더 이상 표시되지 않습니다 (meta_query 조건을 충족하지 않으므로 의미가 있습니다).

그렇다면 일반 게시물이 계속 포함되도록 meta_query를 사용자 정의 게시물 유형으로 만 제한하는 방법은 무엇입니까?


1
좋은 질문입니다 ... +1. 나는 당신이 default로 그렇게 할 수 없을 것이라고 생각합니다 WP_Query. pre_get_posts쿼리를 변경하거나 사용자 지정 SQL 문을 사용해야 합니다. 어쨌든 현재 코드를 보여주세요.
카이저

답변:


4

트릭을 수행하는 다른 방법이 있습니다 .2가 생각납니다.

  1. 완전한 맞춤 $wpdb검색어를 사용하십시오.
  2. 추가 SQL을 빌드하는 데 사용 WP_Query하는 필터와 함께 사용WP_Meta_Query

사례 2의 샘플 코드를 여기에 게시하겠습니다.

/**
 * Run on pre_get_posts and if on home page (look at url)
 * add posts_where, posts_join and pre_get_posts hooks
 */
function home_page_game_sql( $query ) {
  // exit if is not main query and home index
  if ( ! ( $query->is_main_query() && ! is_admin() && is_home() ) ) return;
  add_filter( 'posts_where', 'home_page_game_filter' );
  add_filter( 'posts_join', 'home_page_game_filter' );
}
add_action('pre_get_posts', 'home_page_game_sql');


/**
 * Set the SQL filtering posts_join and posts_where
 * use WP_Meta_Query to generate the additional where clause
 */
function home_page_game_filter( $sql = '' ) {
  // remove filters
  remove_filter( current_filter(), __FUNCTION__);
  static $sql_game_filters;
  if ( is_null($sql_game_filters) ) {
    // SET YOUR META QUERY ARGS HERE
    $args = array(
      array(
        'key' => 'my_custom_key',
        'value'   => 'value_your_are_looking_for',
        'compare' => '='
      )
    );
    $meta_query = new WP_Meta_Query( $args );
    $sql_game_filters = $meta_query->get_sql('post', $GLOBALS['wpdb']->posts, 'ID');
  }
  // SET YOUR CPT NAME HERE
  $cpt = 'game';
  global $wpdb;
  if ( current_filter() === 'posts_where' && isset($sql_game_filters['where']) ) {
    $where = "AND ($wpdb->posts.post_status = 'publish') ";
    $where .= "AND ( $wpdb->posts.post_type = 'post' OR ( ";
    $where .= $wpdb->prepare( "$wpdb->posts.post_type = %s", $cpt);
    $where .= $sql_game_filters['where'] . ' ) )';
    $where .= " GROUP BY $wpdb->posts.ID ";
    return $where;
  }
  if ( current_filter() === 'posts_join' && isset($sql_game_filters['join']) ) {
    return $sql .= $sql_game_filters['join'];
  }
}

자세한 설명은 인라인 주석을 참조하십시오.

또한 볼 분과에 WP_Meta_Query 당신의 메타 쿼리 인수를 설정하는 방법에 대한 문서를 위해.


편집하다

클래스를 사용하여 재사용 가능한 플러그인으로 코드를 리팩터링했습니다. Gist로 사용 가능합니다 .


1
완벽하게 작업했으며 인라인 의견에 감사드립니다. 나는 단순히 코드를 내 utils.php 플러그인에 복사했다. 당신이 그루터기를 제공 한 메타 쿼리 인자에 적절한 값을 넣고 홈 페이지를 새로 고쳤으며 내 게시물과 게임 게시물이 그 영광을 누렸다. 다시 감사합니다.
lrm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.