Вопрос или проблема
Я просмотрел страницу кодекса Settings API, https://codex.wordpress.org/Settings_API, и не могу найти ничего, что связано с установкой autoload
в no
для каких-либо опций с использованием Settings API.
Есть ли способ добиться этого с помощью Setttings API? Спрашиваю, потому что у меня много записей в таблице БД options
, которые были созданы с использованием register_setting
, и все options
имеют autoload
, установленный в yes
.
Мне нужно оптимизировать это, потому что сотни записей загружаются на каждую загрузку страницы без необходимости.
Единственный способ достичь этого — добавить опцию в базу данных самостоятельно до того, как это сделает Settings API. Для этого добавьте ‘sanitize_callback’ в функцию register_settings:
register_setting ('my_options', 'my_option_name', array ('type' => 'string', 'sanitize_callback' => 'my_function_name'));
Затем в своей функции обновите опцию самостоятельно:
function my_function_name ($value) {
update_option ('my_option_name', $value, false);
return $value;
}
После попыток многих возможных решений (большинство из них приводят к бесконечному циклу) это работает для меня.
Я использую хук add_option_{$option}, а затем выполняю следующее:
public function change_autoload_to_no( $option, $value )
{
update_option( $option, '', 'no' );
update_option( $option, $value, 'no' );
}
Это может быть не самое “изящное” решение, но оно работает. Думаю, есть еще вариант изменить значение напрямую с помощью SQL.
Начиная с версии WordPress 6.6.0, существует фильтр, который можно использовать, чтобы по умолчанию отключить значение autoload.
add_filter('wp_default_autoload_value', '__return_false');
Конечно, если вы хотите нацелиться только на опции из вашего плагина или темы, вам понадобится правильный callback для выполнения этой функции. Callback может принимать до четырех (4) параметров. Возвращаемое значение должно быть true, false или null. Если true, autoload будет включен. Если false, autoload будет отключен. Если null, он установит значение auto
и выполнит то, что должен.
/**
* Изменить значение Autoload по умолчанию
*
* @since 6.6.0
*
* @param bool|null $autoload Текущее значение autoload для фильтрации.
* @param string $option Переданное имя опции.
* @param mixed $value Переданное значение опции для сохранения.
* @param mixed $serialized_value Сериализованное значение опции для проверки значения autoload.
*
* @return bool|null Возвращает true, если будет установлено как 'auto-on' в базе данных,
* false будет установлено как 'auto-off', а null будет установлено как 'auto'.
*/
function au_default_autoload_value($autoload, $option, $value, $serialized_value) {
// Сделать что-нибудь
return $autoload;
}
add_filter('wp_default_autoload_value', 'au_default_autoload_value', 10, 4);
Вот более полный пример, где вы можете установить значение autoload в false только для вашей опции и оставить все остальные значения как есть:
/**
* Регистрация Моей Опции
*
* @return void
*/
function au_register_setting() {
register_setting('general', 'my_option_name', array(
'type' => 'string',
'description' => __('Моя Опция'),
'sanitize_callback' => 'sanitize_text_field',
'default' => ''
));
}
add_action('admin_init', 'au_register_setting');
/**
* Всегда отключать autolaod для Моей Опции
*
* @param bool|null $autoload Текущее значение autoload для фильтрации.
* @param string $option Переданное имя опции.
*
* @return bool|null Возвращает false, если `$option` равно `my_option_name`.
* В противном случае возвращаемое значение `$autoload`.
*/
function au_disable_autoload($autoload, $option) {
if($option != 'my_option_name') return $autoload;
return false;
}
add_filter('wp_default_autoload_value', 'au_disable_autoload', 10, 2);
.
Ответ или решение
Работа с API настроек (Settings API) в WordPress зачастую оказывается сложным процессом, особенно когда требуется оптимизация конфигурации автозагрузки (autoload) параметров в базе данных. Автозагрузка опций — это механизм WordPress, позволяющий загружать значения ряда параметров при каждом загрузке страницы. По умолчанию многие параметры, созданные через register_setting
, становятся частью автозагрузки, что может негативно сказаться на производительности, если число таких параметров велико.
Теоретическая часть
Настройка автозагрузки к опциям важна для обеспечения быстрой работы сайта. Когда autoload
установлена в значение yes
, WordPress загружает эту опцию на каждом запросе, что может существенно замедлить работу, если таких опций сотни. Напротив, установка autoload
в значение no
позволит загружать данные только тогда, когда они действительно нужны, тем самым экономя ресурсы.
Практическая часть
На практике, важность управления автозагрузкой заключается в оптимизации количества данных, загружаемых при каждом вызове страницы. Несанкционированная или чрезмерная автозагрузка может привести к перегрузке сервера, увеличению времени отклика и даже к сбою производительности на пользовательском уровне.
При разработке решения, разберём несколько подходов:
-
Использование
sanitize_callback
: Присоединяя коллбэк к процессу регистрации опции, можно добиться нужного поведения. В примере создается функция, которая обновляет значение опции и устанавливаетautoload
вfalse
. Это решение выглядит так:function my_function_name($value) { update_option('my_option_name', $value, false); return $value; } register_setting('my_options', 'my_option_name', array( 'type' => 'string', 'sanitize_callback' => 'my_function_name' ));
-
Хук
add_option_{$option}
: Этот подход позволяет изменить состояниеautoload
после создания опции. Хотя код может показаться не самым элегантным решением, его практическая ценность в простоте и эффективности. Код выглядит так:public function change_autoload_to_no($option, $value) { update_option($option, '', 'no'); update_option($option, $value, 'no'); }
-
Использование фильтра в WordPress 6.6.0 и выше: С появлением версии 6.6.0, WordPress предоставляет возможность через фильтр
wp_default_autoload_value
управлять поведением автозагрузки более гибко. Это делает возможным таргетирование конкретных опций или применяемых плагинов:function au_default_autoload_value($autoload, $option, $value, $serialized_value) { if($option !== 'my_option_name') return $autoload; return false; } add_filter('wp_default_autoload_value', 'au_default_autoload_value', 10, 4);
Применение на практике
Эти подходы необходимо внедрять с учетом специфики каждого проекта. Например, если у вас много пользовательских опций, которые не требуется загружать на каждый запрос, изменение состояния автозагрузки будет оправдано и поможет значительно повысить производительность. Это особенно критично для крупных и высоконагруженных сайтов, где малейшие оптимизации могут быть критичными для быстродействия.
Подводя итог, можно сказать, что управление автозагрузкой в WordPress — неотъемлемая часть процесса оптимизации, и правильное использование API настроек позволит вам контролировать процессы загрузки более эффективно. Вы должны тщательно протестировать каждое изменение на тестовом сервере, чтобы удостовериться, что ваш сайт работает без нарушений бизнес-логики и функциональности.