WP_Query()で投稿を検索し、特定の文字で始まる投稿のみを選択します。私は4.4より前のフィルタを使ったたくさんの古い投稿を見つけましたが、4.4以来WP_Query関数にタイトル検索が追加されました。
$q = new WP_Query( array('post_type'=>'post','title'=>'This Song Title') );
これは、タイトルが「This Song Title」の投稿と完全に一致するもののみを返します。
私がやりたいことは、この例では、文字「T」で始まるすべての投稿を返すことです。
私もこの記事を見つけました、そしてそれは本当に答えられませんでした。それは受け入れられた答えですが、私はそれが質問にどのように答えているのかわかりません。 タイトルの最初の文字に検索を制限するには?
コメントやメタ検索のような他のクエリ機能はLIKE%をクエリに追加するための '比較'を持っていますが、タイトルはそうではありません。
WP_Query
をそのまま使用することはできませんが、posts_where
フィルターを使用してWP_Query
のカスタム引数を探すことで、この機能を追加することができます。
starts_with
が使用したい引数の名前であると仮定すると、posts_where
がクエリに設定されている場合、結果を指定された値で始まるものに限定するWHERE
句を追加するためにstarts_with
をフィルタリングできます。
function wpse_298888_posts_where( $where, $query ) {
global $wpdb;
$starts_with = $query->get( 'starts_with' );
if ( $starts_with ) {
$where .= " AND $wpdb->posts.post_title LIKE '$starts_with%'";
}
return $where;
}
add_filter( 'posts_where', 'wpse_298888_posts_where', 10, 2 );
このフィルタを追加すると、次のような投稿をクエリできます。
$query = new WP_Query( array(
'starts_with' => 'M',
) );
それは "M"で始まるすべての投稿を返します。
メインクエリをフィルタリングできるようにしたい場合は、pre_get_posts
でこの引数を使用することもできます。
function wpse_298888_pre_get_posts( $query ) {
if ( $query->is_main_query() ) {
$query->set( 'starts_with', 'M' );
}
}
add_action( 'pre_get_posts', 'wpse_298888_pre_get_posts' );