在首页上混合常规和自定义帖子类型(使用meta_query)


9

不知道如何实现这一目标。我试图在网站首页上混合标准帖子和自定义帖子,但是我只想在设置了元值的情况下显示自定义帖子。显示帖子效果很好,'post_type' => array('game', 'post')但是当我添加meta_query时,常规帖子不再显示(这很有意义,因为它们不符合meta_query条件)。

因此,如何将meta_query限制为仅自定义帖子类型,以便仍包含常规帖子?


1
好问题+1。我认为您将无法使用默认设置WP_Query。您将需要使用pre_get_postsalter query或自定义SQL语句。无论如何,请显示您的当前代码。
kaiser 2014年

Answers:


4

有两种方法可以解决这个问题,我想到2:

  1. 使用完整的自定义$wpdb查询
  2. 使用WP_Query带有过滤器,通过WP_Meta_Query打造更多的SQL

我将在这里发布案例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'];
  }
}

请参阅内联注释以获取进一步的解释。

另请参阅Codex上的WP_Meta_Query,以获取有关如何设置元查询参数的完整文档。


编辑

我使用一个类在可重用的插件中重构了代码。可作为要点


1
完美的工作,并感谢您的内联评论。我只是将代码复制到我的utils.php插件中,将适当的值放入您为其提供存根的meta查询args中,刷新了主页,并且我的帖子和游戏帖子全貌了。再次感谢。
lrm 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.