我正在尝试在管理面板"编辑帖子"页面中验证自定义帖子类型的字段.
当用户单击"发布"时,我想验证POST数据中的字段,如果数据未通过测试,则将post_status更改为"pending".发生这种情况时,我还想在管理通知区域中向页面添加错误.
我一直在尝试使用"wp_insert_post"动作的附加钩子,这也保存了我们自己的数据.我不确定操作的顺序,但我假设wp_insert_post事件首先发生,然后我的函数通过钩子调用.
问题是它是Wordpress函数正在进行发布后的操作,所以当我获得验证数据时,Wordpress已经保存了状态为"发布"的帖子.我需要做的是阻止更新,或者将状态更改回"待定",但我在API中找到一种方法没有成功.
所以,这是我想要影响的操作顺序:
1. admin user edits post data and clicks "Publish"
2. via wp_insert_post, my data validation and post meta save routine is called
3. If data passes validation, post status is "published"
4. Otherwise, post status set to "pending" & message shown in admin notice area
Run Code Online (Sandbox Code Playgroud)
当然有人已经做到了这一点,但广泛的谷歌搜索引导我看到相同的看似无关紧要的页面.有人能指出我在正确的方向吗?提前致谢-
更新:
所以,RichardML确实是正确的,挂钩到wp_insert_post_data过滤器给了我正确的位置来验证管理员帖子编辑页面字段.我正在更新这个,但要注意解决方案的其余部分,特别是在管理通知区域中报告原因.
首先,您不能只输出数据或设置字段,因为管理页面是重定向的结果,当您再次呈现管理员帖子页面时,admin_notices操作已经消失.这个伎俩是我从另一个论坛中挑选出来的,而且它是hackish,但它确实有效.
您需要做的是在验证过滤器功能中,如果您确定需要显示错误,请使用set_option()添加具有唯一名称的博客选项(我使用'publish_errors').这应该是带有"错误"类的div中的HTML代码.
您还需要为'admin_notices'添加一个动作挂钩,指向检查'publish_errors'选项是否存在的函数,如果找到它,则将其打印到页面并使用delete_option()删除它.
在wp_insert_post_data将数据插入数据库之前,您可以使用过滤器检查和修改后期数据.
为了响应您的更新,我认为不必临时向数据库添加选项.应该可以简单地将查询字符串变量添加到Wordpress重定向,如下所示:
add_filter('wp_insert_post_data', 'my_post_data_validator', '99');
function my_post_data_validator($data) {
if ($data['post_type'] == 'post') {
// If post data is invalid then
$data['post_status'] = 'pending';
add_filter('redirect_post_location', 'my_post_redirect_filter', '99');
}
return $data;
}
function my_post_redirect_filter($location) {
remove_filter('redirect_post_location', __FILTER__, '99');
return add_query_arg('my_message', 1, $location);
}
add_action('admin_notices', 'my_post_admin_notices');
function my_post_admin_notices() {
if (!isset($_GET['my_message'])) return;
switch (absint($_GET['my_message'])) {
case 1:
$message = 'Invalid post data';
break;
default:
$message = 'Unexpected error';
}
echo '<div id="notice" class="error"><p>' . $message . '</p></div>';
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6918 次 |
| 最近记录: |