web-dev-qa-db-ja.com

WP タイトルが特定の文字で始まる場所を照会する

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%をクエリに追加するための '比較'を持っていますが、タイトルはそうではありません。

4
Mark

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' );
4
Jacob Peattie