web-dev-qa-db-ja.com

現在のクエリにカスタム投稿タイプを追加

私は新しいカスタム投稿タイプを追加するプラグインを作成しようとしていますが、それは通常の投稿と同じ場所に表示されるべきです(フロントページ、アーカイブなど)。

CPTを変更して現在のクエリに追加できるように、現在クエリで呼び出されている投稿の種類を取得するための関数はありますか。 (私の質問がわかりにくい場合は2番目のコメントに記載されている例)

以下のコードを使用することはできません(つまり投稿タイプを一覧表示する)ことはできません。ユーザーがどの投稿タイプを持つのか予測できないためです。

add_filter( 'pre_get_posts', 'my_get_posts' );

function my_get_posts( $query ) {

if ( is_home() && $query->is_main_query() )
    $query->set( 'post_type', array( 'post', 'page', 'album', 'movie', 'quote' ) );

return $query;
}

同様に、私は以下のコードを使用することができません。なぜならそれは all postタイプを返すでしょう。

if ( !is_admin() && empty( $query->query_vars['suppress_filters'] ) && $query->is_main_query() ) {
    $post_type = get_query_var('post_type');
    $post_types = get_post_types( array( 'public' => true ) );

    if ($post_type) {
        $post_type = $post_type;
    } else {
        $post_type = $post_types;
    }

    $query->set('post_type',$post_type);
    return $query;
    }
}

では、他の投稿タイプに影響を与えずにCPTをクエリに追加する方法はありますか。助けてくれてありがとう!

4
Billy

実際にはpre_get_postsにそれほど遠くはありません。自分のものを追加する前に、まずクエリ内にある現在の投稿の種類を取得する必要があります。

また、他の$priorityフックの後にアクションがフックされるように99pre_get_postsを使用することをお勧めします。つまり、ユーザーが独自のCPTを追加すると(または投稿タイプに組み込まれると)必要に応じてそれを変更することができます)。

add_action('pre_get_posts', 'djg_includ_my_cpt_in_query', 99);
function djg_includ_my_cpt_in_query($query){

    if(is_home() && $query->is_main_query()) :              // Ensure you only alter your desired query

        $post_types = $query->get('post_type');             // Get the currnet post types in the query

        if(!is_array($post_types) && !empty($post_types))   // Check that the current posts types are stored as an array
            $post_types = explode(',', $post_types);

        if(empty($post_types))                              // If there are no post types defined, be sure to include posts so that they are not ignored
            $post_types[] = 'post';         
        $post_types[] = 'document';                         // Add your custom post type

        $post_types = array_map('trim', $post_types);       // Trim every element, just in case
        $post_types = array_filter($post_types);            // Remove any empty elements, just in case

        $query->set('post_type', $post_types);              // Add the updated list of post types to your query

    endif; 

    return $query;

}

編集

最終的なクエリを構築するとき、WordPressは 'post_type'が空かどうか調べ、そうであれば以下のコードが実行されます -

$where .= " AND $wpdb->posts.post_type = 'post'";
$post_type_object = get_post_type_object ( 'post' );

そのため、CPTを追加したときに起こることは、WordPressが明示的に宣言されていないので投稿を無視したいと想定していることです。それは私のシナリオが異なっていた - 私は以前明示的に他の投稿タイプを宣言していたのでそれらは呼び出し$post_types = $query->get('post_type');に含まれていました。

したがって、$post_typesが空の場合、ユーザーはクエリのその部分を修正したくないため、 'post'を$post_types配列に手動で追加できるようになります。これは(うまくいけば!)トリックをするべきです。

4
David Gard