验证定制Metabox的示例代码?

时间:2011-05-03 作者:stvwlf

我在这个网站或谷歌搜索中几乎找不到验证metabox自定义字段的示例。

如果有人想举例说明,以下是一些有用的案例

1) 2011年2月5日输入的日期是有效的日期格式2)文本框中输入的数字是数字,介于100和500之间3)文本框中的文本长度>25个字符

我的问题不是验证字段的代码,而是将验证代码放在哪里?使用Javascript或PHP?如果它挂在save post上,那么处理失败验证的技术-更新post?不更新帖子?-如何阻止它更新?通知用户问题的最佳方式。

感谢所有建议。示例代码比仅仅描述一种技术更有用。(这将是一个很好的话题,有人可以写一篇文章。)非常感谢。

3 个回复
SO网友:tollmanz

直接从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\');
然后定义该函数,该函数将自动传递post id。此外,您可以访问$\\u 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\');

编辑:我意识到我没有提到你的问题的广度,但因为我花了时间,所以我把它放在这里,让你有四分之一的路要走。

SO网友:t31os

确实没有合适的方法来验证日期字段,您所能做的就是将其拆分并进行部分检查。。

checkdate(), 但正如文档页面上的评论所述,它不能作为有效的方法来清理日期输入。。

我通常检查的第一件事是数据的类型,如果需要字符串,则转换为字符串,同样地,也可以转换为整数和数组值。

// Casting example
$string = (string) $string;
$num = (int) $num;
$array = (array) $array;
对于日期字段,通常在日期的每个部分之间都有一个分隔符,根据该分隔符进行拆分,并将部分(无论您期望的部分有多少)转换为整数。

$date = explode( \'/\', (string) $string );
$date = array_map( \'intval\', $date );
// Now count the parts and validate them further - eg. you don\'t want negative values
当然,这实际上取决于您如何存储日期以及您在该字段中的期望值,您只需根据您的具体需要进行适当的清理。

数值很容易,首先转换为int。。

$num = (int) $var_with_num;
// Or
$num = absint( $var_with_expected_non_negative_num ); // absint is a WordPress function
然后检查它是否在给定范围内(根据您的问题)。

// If it\'s not in range
if( $num < 100 || $num > 500 ) {
    // Number is not in range
}
或。。

// If it is in range - including 100 & 500 as possible values
if( $num >= 100 && $num <= 500 ) {
    // Number is in range
}
检查字符串是否为特定长度很容易,事实上很容易,我只想将您链接到strlen的PHP文档。

http://php.net/manual/en/function.strlen.php

在我看来,日期值是最棘手的,但实际上,编写代码是为了满足您对该字段的期望。如果您有一个日期格式为的字段D/M/Y 例如,您知道/ (正斜杠)将(应该)出现,并且在该delimeter上的拆分应该给您一个由3个数值组成的数组。。。(如果拆分没有给您3个值,或者任何值都不是有效的数值,则数据无效)。。

希望这有帮助。。(如果有人有更好的方法来解决上述问题,我愿意接受批评)。

SO网友:Matthew Muro

要正确验证输入,需要使用Javascript和PHP的组合。

我强烈建议使用jQuery验证插件:http://docs.jquery.com/Plugins/Validation. 它将允许您立即验证输入,并向用户提供有问题的反馈。

第二步是使用PHP验证数据。WordPress有很多built-in validation functions, 因此,我从这里开始,如果你找不到你需要的东西,只需构建你需要的逻辑。

结束

相关推荐

如何向这个Metabox代码添加选择菜单?

我正在使用一个元盒脚本,它非常适合绝对控制元盒字段的设计和放置。有一个问题:我不记得在哪里找到了脚本,需要添加一个选择框。此脚本不像大多数metabox脚本那样使用数组。我可以使用什么函数成功添加选择框?// Add the Inventory Meta Boxes function add_inventory_metaboxes() { add_meta_box(\'inventory_information\', \'Inventory Information\',