在主页上混合使用常规和自定义帖子类型(带有meta_Query)

时间:2014-01-10 作者:lrm

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

那么,如何将meta\\u查询限制为仅自定义帖子类型,以便仍然包含常规帖子?

1 个回复
最合适的回答,由SO网友:gmazzap 整理而成

有不同的方法可以做到这一点,我想到了2个:

使用完整的自定义$wpdb 查询使用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\'];
  }
}
请参阅内联注释以获取进一步解释。

还要看WP_Meta_Query on Codex 有关如何设置元查询参数的完整文档。

编辑我使用类在可重用插件中重构代码。Available as Gist.

结束

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post