web-dev-qa-db-ja.com

Is_main_queryを使用して特定のページのカスタム投稿タイプを選択する

Andrew Nacin http://wordpress.tv/2012/06/15/andrew-nacin-wp_query/ で議論されているアイデアのいくつかを私のワークフローに実装しようとしています。代わりにquery_postsまたは新しいWP_Queryを使用してメインクエリを変更します。これまでのところ、私のホームページでは次のコードを使用してこれをうまく処理しています。

function some_name($query) {
    if ( $query->is_main_query() && $query->is_home() ) {
        $query->set( 'post_type', array( 'home_portfolio' ) );
    }
}
add_action( 'pre_get_posts', 'some_name');

これは単にデフォルトのクエリのpost_typeをhome_portfolioに変更するだけです。これを機能させるには、デフォルトのindex.phpファイルを使用し、フロントページとして使用するページを選択しないでください。

私は特定のページでもこの方法を使用したいのですが、functions.phpからどのようにページをターゲットにするかはわかりません。 $query->is_page(ID)を使用した場合、post_typeを変更しようとするたびに、ページ上の標準ループが404を返します。

言い換えれば、私はfunctions.php$query->is_home()$query->is_page(ID)に置き換えることができるはずで、その特定のページIDをターゲットにすることができるはずですが、うまくいかないのです。

任意の助けは大歓迎です。さもなければ私は私のホームページで本当に効率的ですが、他のすべてのページはまだそれらのページのメインクエリを変更するのと比較して複数のクエリを実行しています。

3
patrickzdb

is_home() 条件は、現在表示されているページがブログ投稿インデックスの場合にtrueを返します。代わりにsiteフロントページをターゲットにしたい場合は、 is_front_page() を使用する必要があります。

function wpse83754_filter_pre_get_posts( $query ) {
    if ( $query->is_main_query() && is_front_page() ) {
        $query->set( 'post_type', array( 'home_portfolio' ) );
    }
}
add_action( 'pre_get_posts', 'wpse83754_filter_pre_get_posts' );

また、is_home()is_front_page()などの呼び出しに$query->を追加する必要はありません。特定のページには必ずメインのクエリが含まれるため、is_main_query()の場合はそうする必要があります。複数のクエリ.

そのため、特定のページをターゲットにしたい場合は、is_page( $id )を呼び出してください。

function wpse83754_filter_pre_get_posts( $query ) {
    if ( $query->is_main_query() && is_page( $id ) ) {
        $query->set( 'post_type', array( 'home_portfolio' ) );
    }
}
add_action( 'pre_get_posts', 'wpse83754_filter_pre_get_posts' );
3
Chip Bennett