如何使用CPT作为默认主页?

时间:2011-05-23 作者:EAMann

我有一个客户的网站将大量使用自定义帖子类型来配置他们的网站。但对于他们要求的主页,我处于两难境地。

实际上,主页将是WordPress中特定“页面”的堆栈。基本上,将有以下页面:Intro, Blog, About Us, Portfolio, 和Contact Us. 它们都会叠在一起,这样你就可以从一页滚动到另一页。

我的第一反应是只使用一个页面(称为Home) 并嵌入一个接受页段塞并输出正确顺序(即。[pageOrder]intro, blog, about-us, portfolio, contact-us[/pageOrder]). 该页面将使用自定义页面模板来布局、控制循环,并在页面左侧添加导航。但这一切似乎都很糟糕。

我的理想解决方案是创建一个自定义的帖子类型(称为Stack) 这允许最终用户通过拖放来定位页面,并让CPT负责布局和导航等。

我理想的解决方案的问题是设置。WordPress允许您为网站的默认主页选择一个页面。但它与一种page, 我也不知道该在哪里进行修改,以便用户也可以选择Stack 作为默认主页。

那么,为了在默认主页的可用页面下拉列表中添加CPT,我应该挂接到哪里?

5 个回复
最合适的回答,由SO网友: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/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\' );

SO网友:fuxia

也许是吧?的优化版本my earlier solution.

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

SO网友:Chip Bennett

为什么不创建一个front-page.php 使用普通查询/循环的模板文件,或(如果自定义主题选项设置为在首页显示CPT)基于CPT输出自定义查询/循环?

问题是,您必须创建一个单独的主题选项来控制首页输出,同时指示用户将首页设置为静态页。

为了使事情更简单,您可以将主题选项挂接到设置阅读中,使用调用中的“阅读”选项组register_setting 通过设置API,以便显示现有的首页选项。

SO网友:Matthew Bernhardt

我认为自2011年EAMann编写更新以来,可能发生了一些变化,他提供的wpa18013\\u add\\u pages\\u to\\u dropdown()函数不再起作用。正如Dameer在评论中提到的,此函数当前(2013年12月)抛出错误“wpa18013\\u add\\u pages\\u to\\u dropdown()缺少参数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\' );
请注意,在上面的示例中,我添加的自定义帖子类型是“unbox\\u tabs”,而不是“stack”。

SO网友:brasofilo

我正在使用this technique 包含插件中的模板。所以,@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\' );
}
<小时>Core reference 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 );

结束

相关推荐

homepage loading too slow

我将一个网站转移到VPS,当我打开该网站时,主页的加载时间太长,对我来说,仅仅显示主页需要30-35秒,但当我以正常速度浏览它加载的内部页面时,我也尝试了这一方法,当时我的所有插件都已停用,但没有变化,加载需要时间。