Вопрос или проблема
Я пытаюсь привести свой код в соответствие со стандартами кодирования WordPress VIP. У меня возникло несколько проблем, которые я хотел бы решить, но не уверен, какая стратегия лучше.
Первая проблема возникает, когда я проверяю nonce при сохранении данных метабокса:
$nonce = isset( $_POST['revv_meta_box_nonce'] ) ? $_POST['revv_meta_box_nonce'] : '';
Ошибка, которую я получаю здесь, – 'Обработка данных без проверки nonce'
. Это довольно глупо, так как я просто сохраняю nonce в переменной, которую я потом проверяю на следующей строке.
Вторая проблема возникает, когда я сохраняю данные:
$foo = isset($_POST['foo']) ? sanitize_text_field( $_POST['foo'] ) : '';
update_post_meta( $post_id, '_foo', $foo );
На первой строке здесь анализатор жалуется, что я не использую wp_unslash
на данных перед их санитацией. Но данные сразу идут в update_post_meta
на следующей строке, который ожидает, что данные не будут unslashed.
Есть идеи по поводу лучшей стратегии для устранения этих сообщений об ошибках? Спасибо!
Вы можете использовать filter_input
, чтобы очистить ваш массив $_POST
.
$nonce = filter_input( INPUT_POST, 'revv_meta_box_nonce', FILTER_SANITIZE_STRING )
Используйте empty()
, чтобы проверить, есть ли у $nonce
значение или нет.
Вы можете использовать то же самое для второй проблемы
$foo = filter_input( INPUT_POST, 'foo', FILTER_SANITIZE_STRING )
Измените третий параметр в зависимости от ожидаемых данных в $_POST['foo']
. Ознакомьтесь с этой документацией для доступных фильтров.
Ответ или решение
Чтобы привести ваш код в соответствие со стандартами кодирования WordPress VIP и устранить указанные вами проблемы, вы можете использовать функцию filter_input
, которая помогает более безопасно и эффективно обрабатывать данные, поступающие из формы.
Проблема 1: Проверка nonce
Вместо того чтобы просто извлекать значение nonce из массива $_POST
и назначать его переменной, вы можете использовать функцию filter_input
для фильтрации и проверки значения nonce сразу. Это исключает необходимость в дополнительной проверке на наличие значения.
Вот как вы можете сделать это:
$nonce = filter_input(INPUT_POST, 'revv_meta_box_nonce', FILTER_SANITIZE_STRING);
if (empty($nonce) || !wp_verify_nonce($nonce, 'your_nonce_action')) {
// Обработка ошибки, если nonce отсутствует или неверен
return;
}
В этом примере мы используем filter_input
для получения значения nonce прямо из массивов $_POST
, очищая его от нежелательных символов, заносим в переменную, а затем проверяем ее на пустоту и валидируем с использованием wp_verify_nonce
.
Проблема 2: Сохранение данных метабокса
Что касается второго вопроса, вы правы в том, что прямое использование $_POST
без предварительного снятия слешей может вызвать предупреждения от PHP Code Sniffer. Вы можете использовать ту же функцию filter_input
, чтобы отфильтровать данные, прежде чем их сохранять, но также учтите, что нужно правильно обрабатывать данные.
Вот модифицированная версия кода, которая решает эту проблему:
$foo = filter_input(INPUT_POST, 'foo', FILTER_SANITIZE_STRING);
if ($foo !== null) {
$foo = sanitize_text_field($foo); // Применяем дополнительно к sanitization перед сохранением.
update_post_meta($post_id, '_foo', $foo);
}
Здесь мы используем filter_input
для получения значения поля foo
, а затем, если оно не равно null
, применяем sanitize_text_field
к значению, что гарантирует, что данные безопасны перед сохранением через update_post_meta
.
Заключение
Использование filter_input
в сочетании с проверками на пустоту и подходящими методами для проверки nonce и очистки данных поможет вам соответствовать стандартам WordPress VIP, устраняя предупреждения PHP Code Sniffer. Всегда следите за тем, чтобы данные из пользовательского ввода были должным образом очищены и проверены, прежде чем использовать их в вашем коде.