WordPress忽略我的自定义帖子类型模板?

时间:2013-09-10 作者:Hugh Guiney

WordPress正在404我所有的自定义帖子类型帖子。我是不是错过了一步?

我正在使用以下设置我的CPT:

function custom_post_types() {  
  register_post_type(
    \'creativework\',
    array(
      \'labels\' => array(
        \'name\' => _x(\'Works\', \'post type general name\'),
        \'singular_name\' => _x(\'Work\', \'post type singular name\'),
        \'add_new\' => _x(\'Add New\', \'Work\'),
        \'add_new_item\' => __(\'Add New Work\'),
        \'edit_item\' => __(\'Edit Work\'),
        \'new_item\' => __(\'New Work\'),
        \'all_items\' => __(\'All Works\'),
        \'view_item\' => __(\'View Work\'),
        \'search_items\' => __(\'Search Works\'),
        \'not_found\' =>  __(\'No Works found\'),
        \'not_found_in_trash\' => __(\'No Works found in Trash\'), 
        \'parent_item_colon\' => \'\',
        \'menu_name\' => __(\'Works\')
      ),
      \'public\' => true,
      \'menu_position\' => 5,
      //\'rewrite\' => array(\'slug\' => \'work\'),
      \'supports\' => array(\'title\', \'editor\', \'thumbnail\'),
      \'has_archive\' => \'true\'
    )
  );
}

add_action( \'init\', \'custom_post_types\' );
我最初在类型中有一个下划线(creative_work), 将slug重写为“work”,但我不知道WordPress将使用哪个排列来查找模板,我尝试了以下文件名single-creative_work.php, single-creativework.php, single-work.php, 全部低于themes/roots/ (我正在使用Roots 作为基线主题),内容如下:

<?php get_template_part(\'templates/content\', \'work\'); ?>
但是themes/roots/templates/content-work.php 从未显示。相反,似乎themes/roots/page.php 被端上来了吗?当我手动编辑时page.phpget_template_part(\'templates/content\', \'work\') 作为一个测试,它似乎使用了我想要的模板,但它在显示主页的地方有帖子ID或其他错误website.com/creativework/.

为了消除所有可能的冲突,我停用了根目录,取而代之的是2133,并禁用了除一个插件之外的所有插件,我编写的插件是为了设置CPT(顶部的代码)。现在,每当我击中website.com/creativework/website.com/creativework/post-title (根据博文编辑器或搜索结果中“查看工作”的永久链接,我得到的是404而不是主页,尽管两者都有single-creativework.phparchive-creativework.php 现有于下themes/twentythirteen.

EDIT: website.com/?creativework=post-title, 然而,这是可行的。

我被这一切搞糊涂了。逐步设置自定义帖子类型模板的正确、简单的方法是什么?理想情况下,我想知道如何在根中做到这一点,但现在我将决定如何让它工作。

3 个回复
最合适的回答,由SO网友:Hugh Guiney 整理而成

明白了。我试着使用flush_rewrite_rules() 插件激活/停用时,如下所示:

function creativeworks_activate() {
  // register taxonomies/post types here
  flush_rewrite_rules();
}

function creativeworks_deactivate() {
  flush_rewrite_rules();
}

register_activation_hook( __FILE__, \'creativeworks_activate\' );
register_deactivation_hook( __FILE__, \'creativeworks_deactivate\' );
…但这似乎没有任何作用。然而,当我任意更改站点范围的永久链接选项并保存它们时,重写规则被成功刷新,我的自定义帖子类型模板再次开始工作。

感谢米洛为我指明了正确的方向。

SO网友:cybmeta

register\\u post\\u类型的参数中有错误,可能导致前端出现问题。此参数:

 \'has_archive\' => \'true\'
应为:

 \'has_archive\' => true
自定义帖子类型(creative\\u work)的单个模板的正确文件名为single-creative_work.phpshould be in your theme folder. 例如,如果主题名为“my\\u theme”,则文件single-creative_work.php 应该在wp-content/themes/my_theme/single-creative_work.php. 还可以使用包含来自不同位置的模板文件template_include() 作用

你所说的文件夹结构在Wordpress中并不常见(roots/lib/, roots/templates/, 等等)。这些文件夹是否来自插件?

SO网友:eskimo

我也使用根,我有一个小的变通方法(不是很漂亮,但对我来说,它可以使事情有条理)。在模板目录的根目录中有一个single.php. 您可以在此处放置:

if(is_singular(\'creativework\')){
    get_template_part(\'templates/creativework\', \'header\');
    get_template_part(\'templates/creativework\', \'main\');
}
然后你会把creativework-header.phpcreativework-main.php 在templates目录中。我使用这种方法是因为我有几个自定义的帖子类型,这样我就可以使用自己的命名,而不是有很多single-cptname.php 文件。我实际上删除了单曲的所有内容。php并将上述函数(以及每个帖子类型的更多函数)放在那里。接下来,我可以为每个自定义帖子类型包含多个模板部分(一些最多有5个)。这让我的东西更有条理!

PS,您确定自定义帖子类型的名称为creativework 而不是creative-work?

结束

相关推荐