用于验证自定义metabox的示例代码?


8

在该网站或Google搜索中,关于验证metabox自定义字段的示例的信息很少。

如果有人想举一些例子,这是一些有用的例子

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

我的问题不是验证字段的代码,而是将验证代码放在哪里?使用Java还是PHP?如果它挂在保存帖子上,那么用于验证失败的技术-更新帖子?不更新帖子?-如何停止更新?通知用户问题的最佳方法。

所有建议表示赞赏。样本代码不仅仅是对一种技术的描述,而且更有帮助。(对于某人来说,这是一个很好的话题。)谢谢




我的问题的重点是,如何向用户显示错误消息,而不是如何使用PHP或Javascript验证各个字段。在研究了几种方法之后,我终于找到了一种可以使用wordpress.stackexchange.com/questions/15354/…的方法。 感谢那些回答的人。
stvwlf

Answers:


2

直接从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');

编辑:我意识到我没有解决您的问题的广度,但由于我花了很多时间在这里,所以我把它留在这里以使您走到四分之一。


1

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

checkdate(),但正如docs页面上的注释中所述,它不能用作对日期输入进行消毒的有效手段。

我通常检查的第一件事是数据类型,如果期望一个字符串,然后转换为字符串,同样对于整数和数组值。

// 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

当然,这实际上取决于日期的存储方式以及该字段的期望值,您只需要根据自己的特定需求对其进行适当的消毒即可。

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

$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
}

检查字符串是否为特定长度很容易,因此实际上我很容易将您链接到PHP文档以获得strlen。

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

在我看来,日期值是最棘手的,但实际上是在编写代码以适合您对该字段的期望的情况。如果您有一个日期格式D/M/Y为例如的字段,则您知道/(应该)出现(正斜线),并且在该分度符上进行拆分应为您提供3个数值的数组...(如果拆分不包含) t给您3个值,或者任何无效的数字值,则数据无效)。

希望能有所帮助..(如果有人对上述任何方法有更好的方法,我很乐意提出批评)。


1

为了正确地验证输入,您将需要结合使用Javascript和PHP。

我强烈建议使用jQuery Validation插件:http : //docs.jquery.com/Plugins/Validation。它可以让您立即验证输入,并向用户提供错误提示。

第二步是使用PHP验证数据。WordPress有很多内置的验证功能,因此我从那里开始,如果您找不到所需的内容,只需按照所需的逻辑进行构建。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.