CPTをデフォルトのホームページとしてどのように使用しますか?


20

私は、自分のサイトのサイトを構成するためにカスタム投稿タイプを多用するクライアントを持っています。しかし、私は彼らの要求されたホームページのための岩と難しい場所の間にいます。

実際には、ホームページはWordPress内の特定の「ページ」のスタックになります。基本的に、IntroBlogAbout UsPortfolioContact Usのページがあります。それらはすべて互いに積み重ねられるので、あるページから別のページにスクロールできます。

私の最初の本能は、ページ(Homeと呼ばれる)を使用し、ページのスラッグを受け入れて適切な順序を出力するショートコード(つまり[pageOrder]intro, blog, about-us, portfolio, contact-us[/pageOrder])を埋め込むことでした。ページはカスタムページテンプレートを使用して、レイアウト、ループの制御、ページの左側へのナビゲーションの追加を行います。しかし、それはすべてぎこちないようです。

私の理想的なソリューションは、エンドユーザーがドラッグアンドドロップでページを配置し、CPTがレイアウトやナビゲーションなどを処理できるようにするカスタム投稿タイプ(Stackと呼ばれる)を作成することです。

私の理想的なソリューションの問題は設定です。WordPressでは、サイトのデフォルトのホームページのページを選択できます。しかし、それは投稿タイプのpageに結びついており、ユーザーがデフォルトのホームページとしてスタックを選択できるように、それを変更するためにどこにフックするかわかりません。

それで、デフォルトのホームページの利用可能なページのドロップダウンにCPTを追加するためにどこにフックしますか?

回答:


11

役に立つ答えをくれた@toschoに感謝しますが、私には少しハックが感じられたので、少し調べて、代わりにフィルターを追加できると考えました。

function wpa18013_add_pages_to_dropdown( $pages, $r ){
    if('page_on_front' == $r['name']){
        $args = array(
            'post_type' => 'stack'
        );
        $stacks = get_posts($args);
        $pages = array_merge($pages, $stacks);
    }

    return $pages;
}
add_filter( 'get_pages', 'wpa18013_add_pages_to_dropdown', 10, 2 );

更新

上記のコードを追加した後、私は実際にホームページとしてカスタム投稿タイプを使用することができましたが、WordPressは「ページ」投稿タイプではないためパーマリンクをリダイレクトします。だから、http://localhost/testにリダイレクトしましたがhttp://localhost/test/stacks/home-stack、それは私が望んでいたものではありませんでした。

ただし、このアクションを追加すると、それが修正され、ホームページのページとともにカスタム投稿タイプがクエリされます。

function enable_front_page_stacks( $query ){
    if('' == $query->query_vars['post_type'] && 0 != $query->query_vars['page_id'])
        $query->query_vars['post_type'] = array( 'page', 'stack' );
}
add_action( 'pre_get_posts', 'enable_front_page_stacks' );

私もそのようなフィルターで遊んだが、それはフロントページのクエリに制限する必要があります。そして、奇妙な振る舞い/バグにbeatられました:404を受け取りました。とにかく+1。:)
fuxia

良いキャッチ。関数内の追加の条件(post_type既に設定されてpage_idいないこと、および0でないことを確認してください)は、すべての404を防ぎます。これで、すべてのカスタム投稿、すべての投稿、およびすべてのページに対して干渉なしでクエリを実行できます。
EAMann

@EAmannコードをありがとう!フロントページのタイトルを[投稿のタイトル]に変更しますが、正常に機能します。ホームページ名、これを何らかの方法でホームページ名に変更できますか?
INT

これはまったく機能しません...サーバーの警告/エラー:wpa18013_add_pages_to_dropdown()および未定義変数の
Dameer

8

たぶんそう?以前のソリューションの改良版。

add_filter( 'wp_dropdown_pages', 'add_cpt_to_front_page_dropdown', 10, 1 );


/**
 * Adds CPTs to the list of available pages for a static front page.
 *
 * @param  string $select Existing select list.
 * @return string
 */
function add_cpt_to_front_page_dropdown( $select )
{
    if ( FALSE === strpos( $select, '<select name="page_on_front"' ) )
    {
        return $select;
    }

    $cpt_posts = get_posts(
        array(
            'post_type'      => 'YOUR_POST_TYPE'
        ,   'nopaging'       => TRUE
        ,   'numberposts'    => -1
        ,   'order'          => 'ASC'
        ,   'orderby'        => 'title'
        ,   'posts_per_page' => -1
        )
    );

    if ( ! $cpt_posts ) // no posts found.
    {
        return $select;
    }

    $current = get_option( 'page_on_front', 0 );

    $options = walk_page_dropdown_tree(
        $cpt_posts
    ,   0
    ,    array(
            'depth'                 => 0
         ,  'child_of'              => 0
         ,  'selected'              => $current
         ,  'echo'                  => 0
         ,  'name'                  => 'page_on_front'
         ,  'id'                    => ''
         ,  'show_option_none'      => ''
         ,  'show_option_no_change' => ''
         ,  'option_none_value'     => ''
        )
    );

    return str_replace( '</select>', $options . '</select>', $select );
}

これはカスタム投稿タイプを選択するためだけのものですが、それはそのカスタム投稿タイプをフロントページとして表示させませんか?または私は何かが欠けていますか?
ハミードラカーン

@Hameedullah-選択すると、WordPressは、どのページをフロントページに使用するかをマークするオプションを更新します。次に、ユーザーがフロントページにアクセスすると、WordPressはデータベースから同じオプションを読み取ります。
EAMann

@Hameedullah Khanあなたは正しい。これは3.1より前に機能していましたが、今では投稿のパーマリンクにリダイレクトされています。404が表示されます。私はこれのための時間があればいいのに。:(
fuxia

5

front-page.php通常のクエリ/ループを使用するテンプレートファイルを作成するだけでなく、(カスタムテーマオプションがフロントページにCPTを表示するように設定されている場合)、CPTに基づいてカスタムクエリ/ループを出力するのはなぜですか?

そこに問題があるのは、Front Pageを静的ページに設定するようにユーザーに指示すると同時に、Front Pageの出力を制御するために個別のテーマオプションを作成する必要があることです。

物事を簡単にするregister_settingために、設定API を介して呼び出しの「読み取り」オプショングループを使用して、既存のFrontPageオプションで表示されるように、テーマオプションを設定読み取りにフックできます。


私はシンプルなソリューションとチップが好きです。あなたのは最高だと思います。Wordpressは、フロントページcodex.wordpress.org/Template_Hierarchy#Home_Page_displayのカスタムテンプレートを 許可して おり、その中で好きなことを行うことができます。
アンマリ

これは最も保守性が高く簡単なソリューションです。front-page.phpワードプレステンプレート階層の一部であるため、自動的に選択されます。なぜこれが起こっているのかを覚える必要はありません(または、次の人のために書き留める必要はありません)。
オディズ

2

EAMannが2011年に更新を書いてから何かが変更された可能性があり、彼が提供するwpa18013_add_pages_to_dropdown()関数が機能しなくなったと思います。Dameerのコメントで述べたように、この関数は現在(2013年12月)「wpa18013_add_pages_to_dropdown()の引数2がありません」というエラーをスローします。

とにかく、解決策は、2番目のパラメーターなしで関数を書き換えるか、その内容を確認することでした。コードの完全なブロックは次のようになります。

function add_unbox_tabs_to_dropdown( $pages ){
    $args = array(
        'post_type' => 'unbox_tabs'
    );
    $items = get_posts($args);
    $pages = array_merge($pages, $items);

    return $pages;
}
add_filter( 'get_pages', 'add_unbox_tabs_to_dropdown' );

function enable_front_page_unbox_tabs( $query ){
    if('' == $query->query_vars['post_type'] && 0 != $query->query_vars['page_id'])
        $query->query_vars['post_type'] = array( 'page', 'unbox_tabs' );
}
add_action( 'pre_get_posts', 'enable_front_page_unbox_tabs' );

上記の例では、追加するカスタム投稿タイプは「stack」ではなく「unbox_tabs」であることに注意してください。


1

この手法を使用して、プラグインからテンプレートを含めています。したがって、@ ChipBennettのソリューションは適用されません。

静的ページのリストにあるプラグインからCPT()を追加するために、@ EAMannのソリューションを次のように変更しました。 'hierarchical' => 'false'

add_action( 'admin_head-options-reading.php', 'wpse_18013_modify_front_pages_dropdown' );
add_action( 'pre_get_posts', 'wpse_18013_enable_front_page_stacks' );

function wpse_18013_modify_front_pages_dropdown()
{
    // Filtering /wp-includes/post-templates.php#L780
    add_filter( 'get_pages', 'wpse_18013_add_cpt_to_pages_on_front' );
}

function wpse_18013_add_cpt_to_pages_on_front( $r )
{
    $args = array(
        'post_type' => 'stack'
    );
    $stacks = get_posts( $args );
    $r = array_merge( $r, $stacks );

    return $r;
}

function wpse_18013_enable_front_page_stacks( $query )
{
    if( '' == $query->query_vars['post_type'] && 0 != $query->query_vars['page_id'] )
        $query->query_vars['post_type'] = array( 'page', 'stack' );
}

コアリファレンスv3.4.2:
3.5 RC3の行番号にわずかな違いがありますが、コードは同じままです

/**
 * wp-admin/options-reading.php#L96
 * Happens inside a <li><label>-</label></li>
 */
    wp_dropdown_pages( array( 
                'name' => 'page_on_front'
            ,   'echo' => 0
            ,   'show_option_none' => __( '&mdash; Select &mdash;' )
            ,   'option_none_value' => '0'
            ,   'selected' => get_option( 'page_on_front' ) 
        ) 
    )

/**
  * wp-includes/post-template.php#L768
  */
function wp_dropdown_pages($args = '') {
    $defaults = array( /* defaults array */ );    
    $r = wp_parse_args( $args, $defaults );
    extract( $r, EXTR_SKIP );  
    $pages = get_pages( $r );
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.