Очистить массив обратных вызовов для API настроек WordPress

Вопрос или проблема

Я привык регистрировать настройки плагина следующим образом:

$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',  // Используем вашу функцию
    )
);

Пояснения к коду

  1. Функция sanitize_array():

    • Эта функция принимает массив и применяет sanitize_text_field ко всем его элементам с помощью array_map(). Если массив будет вложенным, данный подход не обработает его корректно.
  2. Использование 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.

Оцените материал
Добавить комментарий

Капча загружается...