通常,您需要做出选择并决定如何实现特定功能。 WordpPress 对几乎任何问题都有相当灵活的方法,在本教程中,我们将了解自定义帖子类型 API 的灵活性。
您可以使用自定义帖子类型执行许多操作,包括在某些自定义页面、幻灯片、图库、甚至组合项目上生成和管理某些帖子。有些人还不知道它们的存在,其他人则不完全了解他们的选择以及如何使用它们。我们将在以下步骤中尝试构建一个最好使用自定义帖子类型的特定插件。更准确地说,我们将构建一个插件,用于创建一种自定义帖子类型,动态创建和管理其他自定义帖子类型(就像这里的 Inception!)。
第 1 步计划
在开始之前,我们将详细了解我们将在本教程中构建的内容、方式和原因。本教程的目的是帮助您熟悉 WordPress 中的自定义帖子类型。
为此,我们将构建一个插件,用于创建一个主要的自定义帖子类型,然后使用该自定义帖子类型中的帖子以及设置元框,根据元框创建其他动态自定义帖子类型界面选项。这将帮助您详细了解所有自定义帖子选项以及它可以提供的一些可能性。出于本教程的目的,暗示您有一个运行 PHP 和 MySQL 的工作 Apache 服务器,并且安装了 WordPress,以便您可以在 3.0+ 版本的 WordPress 上测试插件代码。
每个帖子都将被解释为新的自定义帖子类型,我们将使用元框将每个帖子的配置选项保存在自定义字段中,其中包含大量表单、复选框、下拉框和文本框,这些表单、复选框、下拉框和文本框将存储并显示数据,使用户可以轻松修改任何内容。
由于该插件有 450 行代码,教程中并非每一行代码都会存在,因为大多数代码都是重复的,只是变量不同。但该插件的所有功能都将得到解释,并以源代码为例。
第 2 步创建并理解 Hooks
如果我们想要获得自定义帖子类型功能、元框功能,并且想要在更新或发布操作时保存数据,我们需要钩子,并且需要专门实现它们以获得所需的效果。
add_action('save_post', 'cpt_save_postdata');
add_action('add_meta_boxes', 'cpt_add_meta_boxes');
add_action('init', 'init_custom_post_types');
登录后复制
在本教程中我们只需要三个钩子,没有过滤器,核心功能中没有其他任何东西。首先,我们需要一个钩子在其回调函数中生成自定义帖子类型。为此,我们将使用 init
标记挂钩和名为 'init_custom_post_types'
的回调函数。这就是所有魔法发生的地方,即我们声明自定义帖子类型的地方,以及通过从数据库中提取值并在循环中生成动态自定义帖子类型来使它们动态化的地方。这部分代码稍后讨论。
我们需要的另一个钩子是 'add_meta_boxes'
标记钩子,它指向回调函数 'cpt_add_meta_boxes'
,用于在生成所有其他自定义的主自定义帖子类型内生成元框帖子类型。这是我们创建表单的地方,该表单将存储和更新我们需要操作以创建功能的数据。
我们使用的最后一个钩子是 'save_post'
,其回调函数为 'cpt_save_postdata'
,目的是保存元框发布的数据。当用户在管理面板中提交主要自定义帖子类型的页面时,所有表单字段都会被提交,这是我们用来获取该内容并将其保存/更新到数据库中以供以后使用的钩子。
第 3 步创建主要自定义帖子类型
首先,我们需要创建一个通用的自定义帖子类型来处理所有动态内容。为此,首先我们使用硬编码数据创建一个通用的自定义帖子类型,如下例所示。首先我们创建标签。 labels 参数是解释为数组的主要参数值之一。数组值由其标识符给出,具体来说 name
表示自定义帖子类型的主要通用名称,通常是自定义帖子类型名称的复数字符串, singular_name
表示单数形式的自定义帖子类型对象名称, add_new
添加新字符串文本,add_new_item
默认添加新帖子/页面文本,edit_item
作为编辑帖子或页面的默认文本,all_items
用于显示所有自定义帖子类型名称文本根据要求(例如:所有汽车), view_items
和 search_items
的使用方式与前面的示例类似,只是出于明显不同的目的, not_found
、not_fount_in_trash
、parent_item_colon
也是替换用于某些页面的文本您可能想要为您创建的任何自定义帖子类型更改的帖子(自定义帖子类型)功能。
在下一个示例中,$labels
数组使用 CPT 替换默认的 post/posts/page/pages 文本。我想这对于某些读者来说是不必要的,但为了确保我不会错过这个想法,CPT 代表自定义帖子类型,并且在本教程中将以多种方式使用。
需要注意的是,此代码被插入到 init_custom_post_types
回调函数中才能正常工作。
$labels = array(
'name' => _x('CPT', 'post type general name'),
'singular_name' => _x('CPT', 'post type singular name'),
'add_new' => _x('Add New CPT', 'CPT'),
'add_new_item' => __('Add New Post type'),
'edit_item' => __('Edit CPT'),
'new_item' => __('New CPT'),
'all_items' => __('All CPT'),
'view_item' => __('View CPT'),
'search_items' => __('Search CPT'),
'not_found' => __('No CPT found'),
'not_found_in_trash' => __('No CPT found in Trash'),
'parent_item_colon' => '',
'menu_name' => __('CPT')
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => true,
'capability_type' => 'post',
'has_archive' => true,
'hierarchical' => false,
'menu_position' => null,
'supports' => array('title')
);
register_post_type('CPT', $args);
登录后复制
生成自定义帖子类型所需的主数组是 $args
数组,其唯一目的是设置自定义帖子类型的主要选项并管理其功能。
- 第一个数组变量名为 labels,我们之前已经处理过该值的结构。
-
public
– 一个布尔变量,true 或 false,表示自定义帖子类型的可用性(如果它对于管理界面或主题中的前端用户是公开的)。 -
publicly_queryable
– 又是一个布尔值,用于设置前端是否能够查询自定义帖子类型的结果。 -
show_ui
– 一个布尔值,指示是否为自定义帖子类型生成默认管理内容。 -
show_in_menu
– 另一个布尔变量,需要show_ui
才能正常工作,因为其目的是在 WordPress 管理面板的菜单中显示或不显示帖子类型。 -
query_var
– 为此自定义帖子类型创建查询 var 键。您可以将其用作布尔值或字符串,如果为 true 则为默认值,如果为 false 则禁用查询 var 键的使用,而 string 设置自定义键。在我们的示例中,我们使用默认值并将其设置为 true。 -
rewrite
– 这可以防止重写此帖子类型。 -
capability_type
– 最后,一个字符串,用于设置自定义帖子类型是帖子还是页面,采用纯文本字符串。我们正在使用邮寄。 -
has_archive
– 此参数启用帖子存档并默认使用post_type
作为存档 slug。 -
hierarchical
– 一个布尔值,用于设置帖子类型是否为分层结构,即是否允许指定父级。 -
menu_position
– 表示帖子类型在菜单中显示的位置的字符串。这些值大约从 5 到 100。 -
supports
– 该值再次具有数组值,这次包含标题、编辑器、缩略图、自定义字段、引用、修订、页面属性和帖子格式等值。
主 args 数组用于下一个 register_post_type
函数,该函数的第一个参数是自定义帖子类型名称(在我们的例子中是 CPT),第二个参数是 $args
变量。
这几乎涵盖了创建我们的主要自定义帖子类型,上面给出并解释了示例。
第 4 步编码元框
首先,我们介绍了钩子,其中一个钩子实现了一个标签,该标签具有专门为元框实现而设计的回调函数。该函数如下所示:
function cpt_add_meta_boxes() {
add_meta_box('cpt_meta_id', 'Custom Post Type Settings', 'cpt_inner_custom_box', 'CPT', 'normal');
}
登录后复制
在函数内部,我们有 add_meta_box
函数,它具有用于实现元框的默认参数,即唯一的元框 id、它的标题、回调函数和应应用它的自定义帖子类型,也是最后但并非最不重要的一点,位置(我们将其设置为正常,因为我们希望它位于编辑器下方)。
这就是使用 API 生成的内容,但是我们要填充什么呢?好吧,我们需要用之前讨论的第 3 步中的所有选项来填充它,为此,我们将创建表单字段并根据其类型填充数据。
有些是复选框
我们对需要布尔值的数组参数使用复选框。选中为 true,未选中为 false。