Answers:
在的开头wp_insert_post
,用于保存/更新帖子的功能有一个名为的过滤器wp_insert_post_empty_content
。默认情况下,此过滤器检查标题,编辑器和摘录字段是否都为空,在这种情况下,保存过程将被暂停。
但是,由于所有要保存的字段都传递给此过滤器,因此您可以扩展此过滤器以包括任何其他测试以确定该帖子是否应视为空。就像这样:
add_filter ('wp_insert_post_empty_content','wpse312975_check_unique_url',10,2);
function wpse312975_check_unique_url ($maybe_empty, $postarr) {
// extract custom field from $postarr, check uniqueness
if ($unique) return false else return true;
}
注意:该函数必须返回“ true”以停止保存过程。
如果自定义字段不是唯一的,则您可能还需要回显警告。
wp_insert_post_empty_content
在语义上意为空内容。话虽如此,我也没有找到任何在语义上合适的钩子。
wp_insert_post_valid_content
来表达这一点,但对于其他过滤器来说,它恰好在正确的位置。
wp_insert_post_empty_content
过滤器?
在提交帖子进行发布之前使用AJAX检查唯一性如何?
$( '#post' ).on( 'submit', function( event ) {
event.preventDefault(); // Prevent publishing
//Now do some AJAX Checks
$.post( ajaxurl, data, function(response) {
if ( response === 'success' ) {
$( this ).off( event ).submit();
} else {
alert( 'The custom field must be unique' );
}
});
});
虽然该代码未经测试,但是应该可以工作。您可能需要使用它才能获得所需的结果。
我会加入wp_insert_post_data过滤器,并尽可能减少干扰,因为据我了解您不想阻止帖子的插入,您只是想避免发布具有重复元值的帖子。
在这种情况下,我不能多余,因为您没有共享任何代码,但是下面是可以使用的过滤器伪代码:
function wp8193131_check_if_meta_value_is_unique ( $data, $postarr ) {
// setup an uniqueness flag.
$meta_is_unique = true;
// check if the meta is unique and modify the `$meta_is_unique` flag accordingly.
// {...} <- your code
// if the meta is NOT unique keep the post status in draft.
if ( ! $meta_is_unique ) {
// you can force the current post to be draft until the meta value will became unique.
$data['post_status'] = 'draft';
// maybe, update the meta value with a hint of the fact that it's not unique.
// or display a dashboard notice about it.
}
return $data;
}
add_filter( 'wp_insert_post_data', 'wp8193131_check_if_meta_value_is_unique' );
此过滤器的另一个好处是,它与附件one分离wp_insert_attachment_data
。
希望对您有所帮助,无论您做什么,听起来都很棒!
$data['post_status']
是publish
并且用户正在更新该怎么办?不会将帖子设为该帖子draft
的404
问题吗?
支票应该去wp_insert_post
。每当发布或编辑帖子时都会触发此挂钩。
在那里,您可以执行自定义查询以检查是否有任何帖子已经具有相同的xxxx_url
值。
add_action('wp_insert_post', function($post_id) {
$meta_key = 'xxxx_url';
$meta_value = get_post_meta($post_id, $meta_key, true);
$query = new WP_Query([
'post_type' => get_post_type($post_id), // This might be unnecessary, if you check `post` post type only. Or use `any`.
'meta_query' => [
[
'meta_key' => $meta_key,
'meta_value' => $meta_value,
]
]
]);
if ($query->have_posts()) {
// invalid key, post with the same value already exists
} else {
// valid, key was not found anywhere
}
});
wp_insert_post
一旦保存了帖子,动作就会触发,它不会阻止发布或插入帖子。
If it isn't unique it should reject publishing post.
在问题中明确提到了这一点。
132_url
在哪里132
。比起您在这里始终拥有独特的价值。除此之外:自定义字段应保存在save_post
操作中。在此操作中,您可以基于此字段检查自定义字段(如果该字段不为空,并且具有唯一值)update_post_meta
。我想您也可以检查自定义字段,如果它没有唯一值,请将设置post-status
为draft
或其他设置以禁用发布。否则,我认为您需要jQuery来执行此操作。