有什么方法可以在不使用 javascript 的情况下验证自定义元框字段。如果它不验证我想停止将帖子保存到数据库中。
问问题
4649 次
3 回答
3
由于 'save_post' 操作是在发布和更新之后运行的,因此如果没有骇人听闻的替代方案,确实无法验证自定义密钥。
但是,我认为您可以按照 Viral 建议的方式通过使用“save_post”来模仿您想要的功能,而不是在验证错误时中断或取消保存过程,您可以完全删除该帖子:
add_action('save_post', 'validate_meta');
function validate_meta($post_id)
{
if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE )
return $post_id;
/*USE THIS ONLY IF YOU ARE UTILIZING NONCE FIELDS IN A CUSTOM META BOX
if ( !wp_verify_nonce( $_POST['metabox_nonce'], basename(__FILE__) ) )
return $post_id;*/
/*Use plugin_basename(__FILE__) if this is an actual plugin, rather than
a part of your theme*/
if ( 'page' == $_POST['post_type'] )
{
if ( !current_user_can( 'edit_page', $post_id ) )
return $post_id;
}
else
{
if ( !current_user_can( 'edit_post', $post_id ) )
return $post_id;
}
/*VALIDATE YOUR METADATA HERE HOWEVER YOU LIKE
if(is_valid($_POST['metadata']))
$validated = true;
else
$validated = false;
*/
if(!$validated)
wp_delete_post($post_id, true);
else
return $post_id;
}
使用这种方法唯一需要注意的是,它将同时在发布和更新时运行。您可能需要考虑添加检查以确保仅删除新发布的帖子,更新的帖子回滚到以前的版本并删除无效的修订。
于 2012-08-13T14:50:16.697 回答
1
过滤器wp_insert_post_data
就是您要寻找的。这样的事情应该可以解决问题:
add_filter( 'wp_insert_post_data', 'my_validation_function' );
function my_validation_function( $data ) {
// Don't want to do this on autosave
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
return $data;
if ( $data['some_key'] != 'some_value' ||
$_POST['some_meta_key'] != 'some_meta_value' ) {
$data['post_status'] = 'draft'; // or whatever status to revert to
add_filter( 'redirect_post_location', 'remove_message'); // remove the publish success message
}
return $data;
}
function remove_message( $location ) {
return remove_query_arg( 'message', $location);
}
于 2014-04-22T18:53:33.820 回答
0
直接从 WP Codex @ http://codex.wordpress.org/Function_Reference/add_meta_box调用save_post
钩子并指定将运行以验证/保存数据的函数:
/* Do something with the data entered */
add_action('save_post', 'myplugin_save_postdata');
然后定义该函数,它将自动传递帖子 ID。此外,您可以访问 $_POST 数组以获取元框中的值:
/* When the post is saved, saves our custom data */
function myplugin_save_postdata( $post_id ) {
// verify if this is an auto save routine.
// If it is our form has not been submitted, so we dont want to do anything
if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE )
return $post_id;
// verify this came from the our screen and with proper authorization,
// because save_post can be triggered at other times
if ( !wp_verify_nonce( $_POST['myplugin_noncename'], plugin_basename(__FILE__) ) )
return $post_id;
// Check permissions
if ( 'page' == $_POST['post_type'] )
{
if ( !current_user_can( 'edit_page', $post_id ) )
return $post_id;
}
else
{
if ( !current_user_can( 'edit_post', $post_id ) )
return $post_id;
}
// OK, we're authenticated: we need to find and save the data
$mydata = $_POST['myplugin_new_field'];
// Do something with $mydata
// probably using add_post_meta(), update_post_meta(), or
// a custom table (see Further Reading section below)
return $mydata;
}
您对有效数据的所有例程都将在此函数中完成。最后,您可能会使用以下方式保存数据:
update_post_meta('meta_key', 'meta_value');
于 2012-08-08T05:21:09.167 回答