web-dev-qa-db-ja.com

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

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

実際には、ホームページはWordPress内の特定の「ページ」のスタックになります。 イントロ ブログ 会社概要 ポートフォリオ 、および お問い合わせ 。あなたはあるページから別のページへスクロールすることができるようにそれらはすべて互いの上に積み重ねられるでしょう。

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

My ideal 解決策は、エンドユーザーがドラッグアンドドロップでページを配置し、CPTにレイアウトやナビゲーションなどの面倒を見させるカスタム投稿タイプ( Stack と呼ばれる)を作成することです。 。

私の理想的な解決策の問題は設定です。 WordPressでは、サイトのデフォルトのホームページのページを選択できます。しかし、それは page の投稿タイプに結びついています、そしてそれを修正するためにどこにフックするべきかわからないので、ユーザーがデフォルトのホームページとして Stack を選択することもできます。

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

20
EAMann

有用な答えをくれた@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/testhttp://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' );
11
EAMann

たぶんそう? の洗練されたバージョン 私の以前の解決策 - /。

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 );
}
8
fuxia

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

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

設定を簡単にするために、Settings APIを介したregister_settingへの呼び出しで "Reading"オプショングループを使用して、Themeオプションをsettings-readingにフックし、既存のFront Pageオプションを表示するようにすることができます。

5
Chip Bennett

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"です。

2

私は このテクニック を使っています/ /プラグインからテンプレートをインクルードするために。そのため、@ ChipBennettのソリューションは適用されません。

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

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 );
1
brasofilo