在WordPress中,创建自定义文章类型(Custom Post Types, CPT)不仅可以通过直接编辑主题的functions.php
文件来实现,更推荐的方式是通过开发一个独立的插件来完成。这种方式不仅可以保持主题代码的整洁,还允许您在更换主题时依然可用。下面我们将详细介绍如何以插件的形式来开发一个新的WordPress自定义文章类型。
步骤1:规划您的插件
首先明确您想要创建的自定义文章类型的名称、功能和所需的功能特性。例如,假设我们正在为一个图集类网站开发一个名为“impression”的自定义文章类型。
步骤2:创建插件的基本结构
- 在
wp-content/plugins/
目录下创建一个新的文件夹,比如叫做impression
。 - 在该文件夹内创建一个主PHP文件,通常命名为与文件夹同名,如
impression.php
。
步骤3:编写插件头部信息
在impression.php
文件的顶部添加标准的插件头信息:
<?php
/**
* Plugin Name: 印象笔记
* Plugin URI: https://blog.ivup.cn/
* Description: 一款笔记类插件
* Version: 1.0.0
* Author: ivup.cn
* Author URI: https://blog.ivup.cn/
*/
步骤4:注册自定义文章类型
接下来,在同一文件中加入以下代码来注册新的自定义文章类型:
function addAdminMenu() {
$labels = array(
'name' => '印象列表',
'all_items' => '所有印象',
'singular_name' => '印象',
'add_new' => '添加印象',
'add_new_item' => '添加印象',
'edit_item' => '编辑印象',
'new_item' => '新的印象',
'view_item' => '查看印象',
'search_items' => '搜索印象',
'not_found' => '没有找到印象',
'not_found_in_trash' => '回收站中没有印象',
'menu_name' => '印象',
);
$args = array(
'labels' => $labels,
'description' => '记录印象,及时分享',
'public' => true,
'menu_position' => 5,
'supports' => array('title', 'comments'),
'has_archive' => true,
'taxonomies' => array('post_tag'),//支持的分类法
'rewrite' => array('slug' => 'impression'),
'show_in_rest' => true
);
register_post_type('impression', $args);
}
add_action('init', 'addAdminMenu');
这段代码将注册一个名为“impression”的自定义文章类型,并设置了相应的标签和参数。
步骤5:注册自定义文章表单
接下来,在同一文件中加入以下代码来注册新的自定义文章表单:
function checkImpressionCustomForm() {
// 获取当前屏幕的信息
$screen = get_current_screen();
// 检查是否在文章编辑页面,并且文章类型是'impression'
if ($screen && 'post' === $screen->base && 'impression' === $screen->post_type) {
// 在这里添加你的action
add_action('edit_form_after_title', [&$this, 'renderImpressionCustomForm']);
}
}
public function renderImpressionCustomForm($post) {
echo '<div class="impression-add-form__header">图集:</div><ul id="impression-add-form__gallery-wrap" class="impression-add-form__gallery">';
$impressionGalleryIds = get_post_meta($post->ID, 'impression_gallery_ids', true);
if ($impressionGalleryIds) {
$impressionGalleryIdsArr = maybe_unserialize($impressionGalleryIds);
if (is_array($impressionGalleryIdsArr)) {
$attachments = get_posts(['post__in' => $impressionGalleryIdsArr, 'post_type' => 'attachment', 'posts_per_page' => count($impressionGalleryIdsArr)]);
$attachmentsGroup = [];
foreach ($attachments as $attachment) {
$attachmentsGroup[$attachment->ID] = $attachment;
}
foreach ($impressionGalleryIdsArr as $attId) {
if (isset($attachmentsGroup[$attId])) {
echo '<li class="impression-add-form__gallery-li"><div class="impression-add-form__gallery-li__img" style="background-image:url(' . $attachmentsGroup[$attId]->guid . ')"><img src="' . plugins_url('/assets/images/delete_icon.svg', dirname(__FILE__)) . '" class="impression-add-from__gallery-li__icon-delete"></div><input type="hidden" name="impression_gallery_ids[]" value="' . $attachmentsGroup[$attId]->ID . '"></li>';
}
}
}
}
echo '<li class="impression-add-form__gallery-li impression-add-form__gallery-li__noSortableItem"><div id="upload_media_button" data-target="#impression-add-form__gallery-wrap" class="impression-add-form__gallery-li__uploader"><img src="' . plugins_url('/assets/images/add_image.svg', dirname(__FILE__)) . '" class="impression-add-form__gallery-li__uploader-icon"><div class="impression-add-form__gallery-li__uploader-text">选择和上传</div></div></li>';
echo '</ul>';
echo '<div class="impression-add-form__header">内容正文:</div>';
echo '<div><textarea id="impression_post_content" name="post_content" class="impression-add-form__textarea-postContent">' . $post->post_content .'</textarea></div>';
}
function saveImpressionCustomForm($post_id) {
if (!isset($_POST['impression_gallery_ids'])) {
return;
}
// 如果这是自动保存,则不执行下面的操作
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
// Check the user's permissions.
if (!current_user_can('edit_page', $post_id)) {
return;
}
// 清理和保存数据
$sanitized_data = maybe_serialize($_POST['impression_gallery_ids']);
update_post_meta($post_id, 'impression_gallery_ids', $sanitized_data);
}
add_action('load-post.php', 'checkImpressionCustomForm');
add_action('load-post-new.php', 'checkImpressionCustomForm');
add_action('save_post', 'saveImpressionCustomForm');
步骤5:激活插件
保存上述文件后,前往WordPress后台的“插件”页面,找到“impression”,然后点击“启用”。
步骤6:扩展功能
根据需求,您可以进一步扩展此插件的功能,例如添加自定义字段、元框或短代码等。
步骤7:测试
确保对新创建的文章类型进行全面测试,包括添加、编辑和删除内容,以及检查前端显示是否符合预期。
通过以上步骤,您就可以成功地以插件形式开发并部署了一个自定义文章类型。这不仅提高了代码的可维护性,也为您的WordPress项目增添了灵活性。希望这篇指南能帮助您顺利开展开发工作!