Пример кода для проверки пользовательских метабоксов?

8

Я нашел очень мало на этом сайте или в поисках Google примеров проверки пользовательских полей metabox.

Если кто-то хочет привести примеры, вот несколько случаев, которые были бы полезны

1) Дата, введенная как 05/02/2011, является действительным форматом даты
2) Число, введенное в текстовое поле, является числовым и находится в диапазоне от 100 до 500
3) Текст в текстовом поле имеет длину> 25 символов

У меня вопрос не столько в коде для проверки полей, сколько в том, где поставить код проверки? Использовать Javascript или PHP? Если он цепляется за сохранение сообщения, методы борьбы с ошибочной проверкой - Обновить сообщение? Не обновлять пост? - как остановить его обновление? Лучший способ уведомить пользователя о проблемах.

Все предложения приветствуются. Пример кода более полезен, чем просто описание техники. (Это была бы очень хорошая тема для кого-то, чтобы написать статью.) Спасибо

stvwlf
источник
Суть моего вопроса заключалась в том, как показать пользователю сообщения об ошибках, а не как проверить отдельные поля с помощью PHP или Javascript. Изучив несколько подходов, я, наконец, нашел тот, который мне удалось получить. Wordpress.stackexchange.com/questions/15354/… Спасибо тем, кто ответил.
stvwlf

Ответы:

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');

Затем вы определяете ту функцию, которой автоматически будет передан идентификатор сообщения. Кроме того, вы можете получить доступ к массиву $ _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');

РЕДАКТИРОВАТЬ: Я понимаю, что я не рассмотрел широту вашего вопроса, но так как я вложил время в это, я оставляю это здесь, чтобы помочь вам четверть пути туда.

tollmanz
источник
1

Там действительно нет подходящего способа проверить поле даты, все, что вы можете сделать, это разделить его и проверить его по частям.

Это так 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
}

Проверить, является ли строка определенной длины, легко, так что на самом деле я просто собираюсь связать вас с документацией PHP для strlen.

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

По моему мнению, значения даты являются самыми хитрыми, но на самом деле это тот случай, когда вы пишете свой код, соответствующий тому, что вы ожидаете от этого поля. Если у вас есть поле с форматом даты, D/M/Yнапример, вы знаете, что /(косая черта) будет (должна) присутствовать и что разделение на этом разделителе должно дать вам массив из 3 числовых значений ... (если расщепление не ' Если вы не дадите 3 значения, или любое из них не является допустимым числовым значением, то данные будут недействительными).

Надеюсь, это поможет .. (и я открыт для критики, если у кого-то есть лучший метод для любого из вышеперечисленных).

t31os
источник
1

Чтобы правильно проверить ввод, вам нужно использовать комбинацию Javascript и PHP.

Я настоятельно рекомендую использовать плагин jQuery Validation: http://docs.jquery.com/Plugins/Validation . Это позволит вам сразу же проверить входные данные и сообщить пользователю, что что-то не так.

Второй шаг - проверка данных с использованием PHP. В WordPress есть множество встроенных функций проверки , поэтому я бы начал с них, и если вы не можете найти то, что вам нужно, просто встроите необходимую логику.

Мэтью Муро
источник