在WordPress的内容发布流程中,文章标题是内容标识的核心元素,但默认系统并未强制要求填写标题,容易导致无标题文章堆积,增加后续内容管理的成本。为文章标题添加必填验证,需要从前端交互和后端校验两个层面共同实现,才能确保验证的可靠性。

实现思路概述
完整的必填验证需要覆盖两个场景:一是用户在后台编辑文章时,未填写标题就尝试发布,前端给出即时提示;二是绕过前端验证的场景下,后端依然能拦截无标题的文章发布请求,避免无效数据入库。整个实现过程不需要修改WordPress核心文件,通过主题函数文件或者自定义插件即可完成。
前端验证实现
前端验证可以提升用户体验,在用户点击发布按钮时第一时间给出提示,不需要等待后端响应。我们可以通过admin_footer-post.php钩子,在文章编辑页面注入自定义的JavaScript代码,监听发布按钮的点击事件,检查标题输入框的内容。
首先需要在标题输入框的HTML结构中添加标识,WordPress的文章标题输入框默认id为title,我们可以直接通过id获取元素。以下是前端验证的完整代码:
// 监听文章发布页面的发布按钮点击事件
jQuery(document).ready(function($) {
// 针对文章编辑页面生效
if ($('#post').length > 0) {
// 发布按钮的点击事件
$('#publish').on('click', function(e) {
// 获取标题输入框的值,去除前后空格
var titleVal = $('#title').val().trim();
// 如果标题为空
if (titleVal === '') {
// 阻止默认提交行为
e.preventDefault();
e.stopPropagation();
// 检查是否已有提示元素,避免重复添加
if ($('#title-error-tip').length === 0) {
// 在标题输入框后面添加错误提示
$('#title').after('<p id="title-error-tip" style="color:#dc3232;margin-top:5px;">文章标题为必填项,请填写后再发布</p>');
}
// 聚焦到标题输入框
$('#title').focus();
return false;
}
});
// 标题输入框输入内容时,移除错误提示
$('#title').on('input', function() {
if ($(this).val().trim() !== '') {
$('#title-error-tip').remove();
}
});
}
});
将上述代码添加到当前主题的functions.php文件中,或者通过自定义插件加载,就可以实现前端即时验证。需要注意的是,这里使用了jQuery,WordPress后台默认已经加载了jQuery库,不需要额外引入。
后端验证实现
前端验证可以被用户禁用JavaScript绕过,因此必须配合后端验证才能保证规则生效。后端验证可以通过save_post钩子实现,在文章保存之前检查标题是否为空,如果为空则终止保存流程,并给出对应的错误提示。
以下是后端验证的完整实现代码:
/**
* 后端验证文章标题必填
* @param int $post_id 文章ID
* @param object $post 文章对象
* @param bool $update 是否为更新操作
*/
function validate_post_title_required($post_id, $post, $update) {
// 跳过自动保存、修订版本、以及非文章类型的保存
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (wp_is_post_revision($post_id)) {
return;
}
if (get_post_type($post_id) !== 'post') {
return;
}
// 检查当前用户是否有编辑权限
if (!current_user_can('edit_post', $post_id)) {
return;
}
// 获取文章标题,去除前后空格
$post_title = trim($post->post_title);
// 如果标题为空
if (empty($post_title)) {
// 设置错误信息
set_transient('post_title_error_' . $post_id, '文章标题为必填项,请填写后再发布', 30);
// 终止保存流程,将文章状态改为草稿
remove_action('save_post', 'validate_post_title_required', 10);
wp_update_post(array(
'ID' => $post_id,
'post_status' => 'draft'
));
add_action('save_post', 'validate_post_title_required', 10, 3);
}
}
add_action('save_post', 'validate_post_title_required', 10, 3);
/**
* 显示后端验证的错误提示
*/
function show_post_title_error() {
global $post;
if (empty($post)) {
return;
}
$error = get_transient('post_title_error_' . $post->ID);
if (!empty($error)) {
echo '<div class="error"><p>' . esc_html($error) . '</p></div>';
// 删除临时错误信息
delete_transient('post_title_error_' . $post->ID);
}
}
add_action('admin_notices', 'show_post_title_error');
这段代码首先排除了自动保存、修订版本、非文章类型以及无权限的保存操作,避免误判。当检测到标题为空时,会将文章状态强制改为草稿,并通过WordPress的临时存储机制传递错误信息,在后台顶部显示错误提示。
最佳实践注意事项
- 不要直接修改WordPress核心文件,所有代码都放在主题的
functions.php或者自定义插件中,避免系统更新后代码丢失。 - 前端和后端验证需要同时保留,前端提升体验,后端保证规则不被绕过。
- 验证逻辑需要排除自动保存、修订版本等场景,避免影响正常的编辑流程。
- 错误提示需要清晰明确,让用户知道具体需要修改的内容,同时提示样式尽量和WordPress后台默认样式保持一致。
- 如果网站除了文章之外还有其他自定义文章类型也需要标题必填,可以修改后端验证中的
get_post_type($post_id) !== 'post'判断条件,适配对应的文章类型。
常见问题排查
如果添加代码后验证不生效,可以按照以下步骤排查:
- 检查代码是否正确添加到
functions.php文件中,没有语法错误。 - 确认当前编辑的是文章类型,而不是页面或者其他自定义类型,如果是其他类型需要调整代码中的类型判断。
- 清除浏览器缓存和WordPress的缓存插件缓存,避免旧代码生效。
- 检查是否有其他插件或者主题代码修改了
save_post钩子的逻辑,导致验证代码被覆盖。
WordPress文章标题必填表单验证PHP开发WordPress钩子修改时间:2026-06-16 20:03:35