Is it possible to have something like name__in array() for WP_Query?
I am trying to get a list of custom posts from an array of the post’s slugs.
Looking at the codex, there doesn’t seem to be a way.
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
The parameter is not supported by WordPress core, but you can implement it using a filter on '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 );
Note that this will not work by default using get_posts because using that function sql filters are suppressed by default and you need to enable it using ‘suppress_filters’ argument:
This will work:
$args = array( 'post_type' => 'my-cpt', 'name__in' => array( 'foo', 'bar' ) ); $posts = new WP_Query( $args );
This will not work:
$args = array( 'post_type' => 'my-cpt', 'name__in' => array( 'foo', 'bar' ) ); $posts = get_posts( $args );
This will work too:
$args = array( 'post_type' => 'my-cpt', 'name__in' => array( 'foo', 'bar' ), 'suppress_filters' => FALSE // <== enable filters ); $posts = get_posts( $args );
Method 2
As of 2021 and adding to gmazzap’s Answer:
the parameter should be ‘post_name__in’, see
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 );
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0