如果无效,请停止提交wordpress。 (WPCasa)

时间:2017-02-12 14:20:53

标签: php wordpress

我使用WPCasa Dashboard插件允许用户提交房地产对象。我必须使用外部服务来验证对象。如果来自服务的响应有错误,我想阻止WP更新数据库。

我使用wpcasa自己的钩子来实现我的功能。

这是我孩子主题中functions.php的一部分:

function newListingAdded($ID, $post ) {

  ...

  if ($post->post_date === $post->post_modified) {
    // new post
    $response = wp_remote_post( $targetUrl.'listings/new', $options );
  } else {
    $response = wp_remote_post( $targetUrl.'listings/update', $options );
  }

  $output = json_decode($response['body']);
  if (is_array($output)) {
    $_SESSION['messages'] = [];
    foreach ($output as $error) {
      if (isset($error->msg)) {
        array_push($_SESSION['messages'], ['danger', $error->msg]);
      }
    } 
  }
}
add_action( 'publish_listing', 'newListingAdded', 10, 2 );

到目前为止一切都像预期的那样。我无法弄清楚如何阻止wordpress实际提交数据。

1 个答案:

答案 0 :(得分:0)

不是使用WPCasa的publish_listing操作(我在WPCasa文档中找不到它),而是使用WordPress中的官方wp_insert_post_data过滤器。

现在,WP没有正式支持使用动作/钩子来阻止保存帖子的方法,但是,如果你看一下WP源代码(参考:https://core.trac.wordpress.org/browser/tags/4.7/src/wp-includes/post.php#L3281),你会看到WP从$data返回wp_insert_post_data值(要保存到数据库的字段/值对的关联数组),并将其传递给$ wpdb-> update()。

如果您使用wp_insert_post_data并返回布尔值false值而不是过滤器接收的实际$data参数,则会阻止帖子更新,因为$ wpdb-> update ()检查$ data是否为有效数组而不是false,否则它不对数据库执行任何操作(参考:https://core.trac.wordpress.org/browser/tags/4.7/src/wp-includes/wp-db.php#L2023

因此,您可以尝试使用此代码:

function newListingAdded($data, $postarr) {
  if (!$data['ID']) { // If no post ID is set then it's a new post
    $response = wp_remote_post( $targetUrl.'listings/new', $options );
  } else {
    $response = wp_remote_post( $targetUrl.'listings/update', $options );
  }

  $output = json_decode($response['body']);

  if (is_array($output)) {
    $_SESSION['messages'] = [];

    foreach ($output as $error) {
      if (isset($error->msg)) {
        $_SESSION['messages'][] = ['danger', $error->msg]; // You can use the [] shorthand operator instead of the more verbose array_push()
        $data = false; // If an error is found make $data false
      }
    } 
  }

  return $data;
}

add_filter( 'wp_insert_post_data', 'newListingAdded', 10, 2);

以下是此过滤器的参考: https://developer.wordpress.org/reference/hooks/wp_insert_post_data/