【问题标题】:Modifying Wordpress post status on Publish在 Publish 上修改 Wordpress 帖子状态
【发布时间】:2011-02-15 18:21:58
【问题描述】:

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

当用户单击“发布”时,我想验证 POST 数据中的字段,如果数据未通过测试,则将 post_status 更改为“待处理”。发生这种情况时,我还想在管理员通知区域的页面中添加错误。

我一直在尝试在“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 代码。

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

【问题讨论】:

    标签: wordpress


    【解决方案1】:

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

    【讨论】:

    • 太棒了,这看起来正是我需要的。谢谢你,理查德。
    • 查看我的更新答案,了解创建错误消息的另一种方法。
    • 感谢代码!我注意到如果我想从管理区域中删除待处理的自定义帖子类型记录,它不会这样做。有什么建议吗?谢谢!
    猜你喜欢
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多