在发布上修改Wordpress帖子状态

时间:2011-02-15 18:21:59

标签: wordpress

我正在尝试在管理面板“编辑帖子”页面中验证自定义帖子类型的字段。

当用户点击“发布”时,我想验证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

肯定有人这样做了,但广泛的谷歌搜索只是让我看到了看似无关紧要的页面。有人能指出我在正确的方向吗?提前致谢 -

更新

所以,RichardML确实是正确的,挂钩到wp_insert_post_data过滤器给了我正确的位置来验证管理员帖子编辑页面字段。我正在更新这个,但要注意解决方案的其余部分,特别是在管理通知区域中报告原因。

首先,您不能只输出数据或设置字段,因为管理页面是重定向的结果,当您再次呈现管理员帖子页面时,admin_notices操作已经消失。诀窍是我从另一个论坛上捡到的东西,它是黑客的,但它确实有效。

您需要做的是在验证过滤器功能中,如果您确定需要显示错误,请使用set_option()添加具有唯一名称的博客选项(我使用'publish_errors')。这应该是div中的HTML代码,其类别为“error”。

您还需要为'admin_notices'添加一个动作挂钩,指向检查'publish_errors'选项是否存在的函数,如果找到它,则将其打印到页面并使用delete_option删除它( )。

1 个答案:

答案 0 :(得分:9)

您可以使用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>';
}