WP_Query and name__in

时间:2014-06-13 作者:Bill

有没有可能name__in array() 对于WP_Query?

我正试图从一组帖子的slug中获取一个自定义帖子列表。

查看codex, 似乎没有办法。

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

WordPress core不支持该参数,但您可以使用\'posts_where\':

// require PHP 5.3+
add_action( \'posts_where\', function( $where, $query ) {
  if ( isset( $query->query[\'name__in\'] ) && is_array( $query->query[\'name__in\'] ) ) { 
    global $wpdb;
    $names = array_filter( array_map( function( $name ) use( $wpdb ) {
        $sane = sanitize_title( $name );
        return ! empty( $sane ) ? $wpdb->prepare( \'%s\', $sane ) : NULL;
    }, $query->query[\'name__in\'] ) );
    if ( ! empty( $names ) ) {
      $where .= " AND {$wpdb->posts}.post_name IN (" . implode( \',\', $names ) . ")";
    }
  }
  return $where;
}, PHP_INT_MAX, 2 );
请注意,这将not 默认情况下使用get_posts 因为默认情况下,使用该函数会抑制sql筛选器,您需要使用“suppress\\u filters”参数启用它:

这将起作用:

$args = array(
  \'post_type\'       => \'my-cpt\',
  \'name__in\'        => array( \'foo\', \'bar\' )
);
$posts = new WP_Query( $args );
这将not 工作:

$args = array(
  \'post_type\'       => \'my-cpt\',
  \'name__in\'        => array( \'foo\', \'bar\' )
);
$posts = get_posts( $args );
这也会起作用:

$args = array(
  \'post_type\'        => \'my-cpt\',
  \'name__in\'         => array( \'foo\', \'bar\' ),
  \'suppress_filters\' => FALSE // <== enable filters
);
$posts = get_posts( $args );

SO网友:macro64

截至2021,gmazzap的回答是:

参数应为“post\\u name\\uu in”,请参阅https://developer.wordpress.org/reference/classes/wp_query/#post-page-parameters

$args = array(
  \'post_type\'       => \'my-cpt\',
  \'post_name__in\'        => array( \'foo\', \'bar\' )
);
$posts = new WP_Query( $args );

结束

相关推荐

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

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