カスタムポストタイプアーカイブをフロントページとして使用する方法


16

カスタム投稿タイプのアーカイブをサイトのフロントページとして使用したいので、

 http://the_site.com/

私のarchive-{post-type}.phpファイルに従って表示されるカスタム投稿タイプのアーカイブです。

理想的には、クエリを使用して変更したいと思います is_front_page()functions.phpファイルでしてと思います。「ホーム」というページをフロントページとして、次のことを試しました。

 add_filter('pre_get_posts', 'my_get_posts');
 function my_get_posts($query){
     global $wp_the_query;
     if(is_front_page()&&$wp_the_query===$query){
        $query->set('post_type','album');
        $query->set('posts_per_page',-1);
     }
     return $query;
 }

ただし、フロントページは「ホーム」のコンテンツを返しているため、カスタムクエリを無視しているようです。

私は何を間違えていますか?一般的に、これについてより良い方法はありますか?


is_front_page()はpre_get_postsでは機能しません
Brad Dalton

回答:


27

静的ページをホームページとして設定した後、これを自分のページに追加できますfunctions.php。これにより、archive-POSTTYPE.phpテンプレートも正しく呼び出されます。

add_action("pre_get_posts", "custom_front_page");
function custom_front_page($wp_query){
    //Ensure this filter isn't applied to the admin area
    if(is_admin()) {
        return;
    }

    if($wp_query->get('page_id') == get_option('page_on_front')):

        $wp_query->set('post_type', 'CUSTOM POST TYPE NAME HERE');
        $wp_query->set('page_id', ''); //Empty

        //Set properties that describe the page to reflect that
        //we aren't really displaying a static page
        $wp_query->is_page = 0;
        $wp_query->is_singular = 0;
        $wp_query->is_post_type_archive = 1;
        $wp_query->is_archive = 1;

    endif;

}

この機能はif(is_admin()) return;最初に必要です。それ以外の場合は、管理領域に干渉します。
ブラソフィロ

1
これでうまくいきましたが、結果としてプライマリメニューとセカンダリメニューが消えました。
super9

それはほぼ正確です。このコードはすべてのwp_queriesを変更しているため、if($ wp_query-> get .....)ではなくif(is_home())
Leo Caseiro

私は同じを使用していますが、フロントページの代わりにカスタムページテンプレートで、結果が表示されません(カスタム投稿が追加されていないかのように)。何かご意見は?
trainoasis

このソリューションはページングをサポートしていません。/ page / 2 URLには、最初の10件の投稿が引き続き表示されます。
rg89

6

CPTアーカイブの名前をhome.phpに変更します

次に、pre_get_postsを使用してホームページのクエリを変更し、CPTのみが表示されるようにします

function wpsites_home_page_cpt_filter($query) {
if ( !is_admin() && $query->is_main_query() && is_home() ) {
$query->set('post_type', array( 'your-cpt' ) );
    }
  }

add_action('pre_get_posts','wpsites_home_page_cpt_filter');

your-cptをカスタム投稿タイプの名前に置き換えます。


2
最後に、明確で実行可能な説明!
ジャック

1

ljaasの回答に感謝します。この正確な問題を解決しようとしていました。カスタムの投稿タイプのアーカイブテンプレートを呼び出すには、次の条件を追加する必要がありました。

$wp_query->is_post_type_archive = 1;
$wp_query->is_archive = 1;

2
こんにちは、エリ、WPSEへようこそ。「回答」は、最初の質問に答えるためのものです(stackexchangeサイトはスレッドディスカッションフォーラムではありません)。これはコメントにはるかに合うでしょう。
ヨハネスポール

ヨハネスの説明をありがとう。「コメントの追加」機能がないため、答えにコメントする方法がわかりませんでしたが、それは私が考えたものです。これは時間に依存する機能ですか、それとも盲目ですか?
エリ

0

これは、[設定]> [閲覧]> [フロントページの表示]でブログの投稿と静的ページの両方をオーバーライドするのに適しています。

<?php
/**
 * Set custom post type archive as front page.
 *
 * @since 1.0.0
 */
function ql_set_as_front_page( $query ) {
    if ( is_admin() || ! $query->is_main_query() ) {
        return;
    }
    if ( ql_is_front_page( $query ) ) {
        $query->set( 'page_id', '' );
        $query->is_page = false;
        $query->is_singular = false;
        $query->set( 'post_type', 'MYCPT' );
        $query->is_archive = true;
        $query->is_post_type_archive = true;
    }
}
add_action( 'pre_get_posts', 'ql_set_as_front_page' );

/**
 * Taken from WP_Query::is_front_page and adapted to compare page_on_front with current page ID.
 * 
 * @since 1.0.0
 * 
 * @param object $query The main WP Query.
 */
function ql_is_front_page( $query ) {
    if ( 'posts' == get_option( 'show_on_front') && $query->is_home() )
        return true;
    elseif ( 'page' == get_option( 'show_on_front') && get_option( 'page_on_front' ) && $query->get('page_id') == get_option( 'page_on_front' ) )
        return true;
    else
        return false;
}

フィルターfront_page_templateを使用してテンプレートオーバーライドと組み合わせて使用​​しhome_template、カスタムテンプレートを返します。


0

私にとっては、ページネーションを壊します:ホームページとしてインデックスまたは静的ページを選択すると、ページネーションリンクが表示されますが、ページ2をクリックすると次のようになります:

  • インデックスページの場合(デフォルト):404ページ
  • 静的ページの場合:ページ1と同じ結果: "paged"引数は、ポストタイプリストのページネーションではなく、ページタイプのページネーションを表示するように解釈されます。

ページ化された引数をキャッチして正しく渡すには、いくつかの書き換えルールが必要だと思います。

とにかく、カスタムテンプレートページは、いくつかの追加の書き換えルールを備えたソリューションである必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.