Вопрос или проблема
Я привык регистрировать настройки плагина следующим образом:
$string_sanitization = array(
'sanitize_callback' => 'sanitize_text_field',
);
// Настройка секции: просто пример строки
register_setting(
'whatever', // Название группы опций
'some_example_string', // ID опции
$string_sanitization // Обратный вызов для очистки
);
И это работает прекрасно.
Но когда дело касается опций, которые хранят массивы строк, я не знаю, что использовать.
В документации есть ключ types
для аргументов, но это недостаточно понятно, поэтому я попробовал так:
register_setting(
'whatever', // Название группы опций
'array_of_strings', // ID опции
array(
'type' => 'array',
'sanitize_callback' => 'sanitize_text_field',
)
);
В этом случае опции не сохраняются.
Один из способов, который работает, это создать пользовательскую функцию очистки, которая обрабатывает массив, следующим образом:
function sanitize_array_of_strings( $array ) {
return array_map( 'sanitize_text_field', $array );
}
register_setting(
'whatever', // Название группы опций
'array_of_strings', // ID опции
array(
'type' => 'array',
'sanitize_callback' => 'My\Namespace\sanitize_array_of_strings',
)
);
Но мне кажется странным, что у WP нет родного способа сделать это, поэтому я спрашиваю, знаете ли вы родной способ достичь этого, не создавая для этого пользовательскую функцию.
На самом деле есть функция WordPress для этого: map_deep( $value, $callback )
.
Эта функция проходит по всем элементам вашего массива, даже если они являются массивами или объектами.
Давайте изменим ваш код:
function sanitize_array( $array ) {
return map_deep( $array, 'sanitize_text_field' );
}
register_setting(
'whatever', // Название группы опций
'array_of_strings', // ID опции
array(
'type' => 'array',
'sanitize_callback' => 'My\Namespace\sanitize_array',
)
);
Хотя это выглядит почти так же, как у вас, это также позаботится о вложенных массивах и объектах. Так что если ваш массив плоский, ваша функция не будет сталкиваться с проблемами, но если он окажется вложенным или содержать объекты, они не будут очищены, но map_deep()
позаботится об этом.
Код определяет функцию sanitize_array, которая принимает массив в качестве входных данных и рекурсивно очищает каждый элемент с помощью функции sanitize_text_field. Эта функция затем регистрируется как функция очистки для опции array_of_strings, что гарантирует, что значения массива правильно очищаются перед сохранением в базе данных. Следите за нами для получения дополнительной информации: Lasik в Гранд-Рапидс
Ответ или решение
Для того чтобы корректно обработать и санитаризировать массив строк с использованием API настроек WordPress, необходимо понимать, что WordPress предоставляет возможности не только для работы с простыми типами данных, но и с более сложными структурами, такими как массивы.
Проблема
Как вы заметили, при регистрации параметра, который представляет собой массив строк, стандартная функция sanitize_text_field
не может быть использована непосредственно, так как она предназначена для обработки одиночных строк. В результате, попытка использовать ее с массивом приводит к тому, что значения не сохраняются.
Решение
Как было упомянуто, в WordPress существует функция map_deep()
, которая идеально подходит для этой задачи. Она рекурсивно проходит по всем элементам массива и применяет заданный обратный вызов к каждому из них. Это означает, что даже если массив содержит вложенные массивы или объекты, каждый элемент будет правильно обработан.
Пример реализации
Вам нужно создать функцию, использующую map_deep()
, чтобы санировать массив строк правильно. Вот как это можно реализовать:
// Функция для санитаризации массива строк
function sanitize_array( $array ) {
return array_map( 'sanitize_text_field', $array );
}
// Регистрация параметра с использованием пользовательской функции санитаризации
register_setting(
'whatever', // Имя группы параметров
'array_of_strings', // ID параметра
array(
'type' => 'array',
'sanitize_callback' => 'sanitize_array', // Используем вашу функцию
)
);
Пояснения к коду
-
Функция sanitize_array():
- Эта функция принимает массив и применяет
sanitize_text_field
ко всем его элементам с помощьюarray_map()
. Если массив будет вложенным, данный подход не обработает его корректно.
- Эта функция принимает массив и применяет
-
Использование
map_deep()
:- Чтобы учесть все вложения и обеспечить полную санитаризацию, изменим реализацию на следующую:
function sanitize_array( $array ) {
return map_deep( $array, 'sanitize_text_field' ); // С помощью map_deep() обрабатываем массив
}
// Регистрация параметра с использованием coral map_deep
register_setting(
'whatever',
'array_of_strings',
array(
'type' => 'array',
'sanitize_callback' => 'sanitize_array',
)
);
Подводя итог
Используя описанный метод, вы сможете эффективно санитаризировать массив строк в настройках вашего плагина WordPress. Это обеспечит, что все данные, даже если они вложенные, будут правильно обработаны и безопасно сохранены в базе данных.
Эта методология не только решает вашу проблему с обработкой массивов строк, но и демонстрирует использование функций WordPress, что может значительно улучшить поддержку и расширяемость вашего кода.
Заключение
Такой подход существенно упрощает задачу строительства плагинов и тем, и помогает избежать потенциальных проблем с безопасностью. Самое главное, держите этот механизм в виду при проектировании и разработке своих функций, чтобы еще лучше использовать возможности WordPress.