我使用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实际提交数据。
答案 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/