WordPress中如何为文章和自定义文章类型添加自定义模板

实现思路分成两部分,1,插件;2,手动操作改代码

通过插件

Pods – Custom Content Types and Fields

Pods is a framework for creating, managing, and deploying customized content types and fields

https://wordpress.org/plugins/pods/

通过手动操作改代码

操作1

WordPress 4.7将增加文章模板功能
wp-47-post-templates

WordPress允许用户自定义页面模板,已经有12年的历史了,用户使用该功能可以给特定页面设置不一样的网页布局。在WordPress 4.7中,这一功能将被扩展到文章,以及更多的文章类型。今天就给你做个详细介绍。

WordPress文章模版

在WordPress 4.7以前的版本中,模板功能仅仅局限于页面使用。利用这一功能,用户可以给页面选择使用各种不同预定义的模板。但其他类型的文章,无法使用这一功能。

在WordPress 4.7新版本中,通过将页面模板扩能扩展给所有类型的文章,WordPress的模板体系的灵活性进一步得到增强。

除了在文件头部增加 Template Name 参数外,你还需要在这里指定 Template Post Type: post, foo, bar 。下面是一个例子:

<?php
 
/*
Template Name: Full-width layout
Template Post Type: post, page, product
*/
 
// ... 模板代码

这样,你就可以在 post(文章),page(页面),product(产品) 等类型的文章中选择使用这个名字为 Full-width layout(全宽布局) 的页面模板。

只要你的主题中有一个适合文章的模板,那么在后台文章编辑页面就会出现这个“Post Attributes”选项框。这个“Post Attributes”标题,可以在注册文章类型的时候进行定义。

我们来看一下实际效果:

wp-post-attributes

回溯兼容Wordpress 4.7之前版本

假如说你想要公开发布一个WordPress主题,那么WordPress 4.7之前的版本将会忽略其中的 Template Post Type 参数,在页面模板中显示出这些模板来,哪怕这个模板中已经限制仅适用于正常文章(post)。

要防止这种情况发生,你需要钩住这个 theme_page_templates 过滤器,让它来把该模板排除在外。下面是代码示例:

/**
* Hides the custom post template for pages on WordPress 4.6 and older
*
* @param array $post_templates Array of page templates. Keys are filenames, values are translated names.
* @return array Filtered array of page templates.
*/
function makewp_exclude_page_templates( $post_templates ) {
if ( version_compare( $GLOBALS['wp_version'], '4.7', '<' ) ) {
unset( $post_templates['templates/my-full-width-post-template.php'] );
}
 
return $post_templates;
}
 
add_filter( 'theme_page_templates', 'makewp_exclude_page_templates' );

这样,既可以在WordPress 4.7中使用自定义文章模板功能,又可以回溯兼容以前的版本。

注意,现在这个 theme_page_templates 实际上是动态的 theme_{$post_type}_templates 过滤器。动态部分是指 $post_type ,是模板支持的文章类型。比如,你可以钩住 theme_product_themplates 来过滤 product 文章类型的模板。


操作2

https://www.wpdaxue.com/wordpress-adds-custom-templates-for-articles-and-custom.html

相信很多主题开发者都知道,WordPress 支持为页面(page)这种文章类型添加自定义模板,但是如何为文章和自定义文章类型添加自定义模板呢?其实, WordPress 4.7 开始就支持了,但可能不少主题开发者还不知道。

WordPress主题的模板

默认情况下,WordPress支持大量主题模板文件,但是这些文件对多种变体的支持有限。对于文章,基本上只限于single.php文件,而对于自定义文章类型,则只有single-{post-type}.php。

WordPress页面的自定义模板

长期以来,通过将下面的模板标题添加到页面模板文件中,可以向WordPress页面添加多个自定义模板。但这仅支持页面,不适用于默认文章或自定义文章类型。

<?php
/*
Template Name: Contact
*/

文章和自定义文章类型的自定义模板

从WordPress 4.7开始,有一个新的鲜为人知的功能,可以让你为文章、页面和自定义文章类型添加多个模板。

要测试此新功能,我们首先必须注册一个自定义文章类型。将以下代码复制到你主题的functions.php文件中,来创建一个新的自定义文章类型,称为“Product”

<?php
function create_product_post_type() {
  register_post_type( 'product',
    array(
      'labels' => array(
      'name' => __( 'Products' ),
      'singular_name' => __( 'Product' )
    ),
      'public' => true,
      'has_archive' => true,
      'show_in_rest' => true // 启用古腾堡编辑器
    )
  );
}
add_action( 'init', 'create_product_post_type' );

创建自定义文章类型时,有很多选项可以使用,但出于我们的目的,我们将尽可以简单。记下第12行。在这里您可以在Gutenberg和经典编辑器之间切换。在编写本文时,默认情况下,自定义文章类型将启用经典编辑器,可以通过添加第12行的代码,来启用Gutenberg编辑器。

上面的代码将注册新的自定义文章类型,该类型将在WordPress管理员中显示,如下所示。

创建文章和自定义文章类型的模板

要为我们的新的文章类型 Product 创建模板,我们可以创建一个product.php文件并为其添加布局。很好,但是如果我们需要特定产品的不同布局怎么办?好吧……就像我说的那样……从WordPress 4.7开始,你可以在模板文件中使用新的特殊注释标题。

在主题目录中创建一个名为 full-width-page-layout.php 的新文件,并在顶部添加以下代码片段。

<?php
/*
Template Name: Full-width page layout
Template Post Type: post, page, product
*/

这样就注册了新模板,用于文章、页面和自定义文章类型 Product。它将在经典和古腾堡编辑器的编辑页面右侧显示“发布属性”框,如下所示。

选择emplatein wordpress admin

请注意,你可以将“Template Post Type:”的值更改为任何已注册的文章类型。因此,如果只希望将模板应用于 Product 文章类型,请更改标题,如下所示:

<?php
/*
Template Name: Full-width page layout
Template Post Type: product
*/

看起来很简单,却是功能非常强大的功能,希望这篇小文章能帮助你为WordPress网站创建更精彩的主题。

参考: https://vanaf1979.nl/wordpress-multiple-custom-templates-for-posts-and-custom-post-types/