Хук при сохранении настроек плагина
Я написал плагин с различными настройками, и при сохранении этих настроек должен генерироваться CSS файл. Моя цель - чтобы CSS создавался только при сохранении настроек, а не при каждом посещении страницы, когда CSS генерируется каждый раз.
Мне нужен хук, который срабатывает при сохранении настроек. Я попробовал сделать так:
public function __construct( $file ) {
$this->options = get_option('clb_plugin_options');
add_filter( 'pre_update_option_clb_plugin_options', array( $this, 'generate_options_css' ) );
}
public function generate_options_css() {
[выполнение всех CSS операций]
return $this->options;
}
Но в этом случае изменения, внесенные в форму, не учитываются, так как я просто сохраняю уже существующие настройки из $this->options. Как правильно подключить хук после сохранения настроек плагина?

Хотя я не согласен с вашей целью, вот хуки действий, которые вы можете использовать (вы не показали, что используете для сохранения настроек, поэтому я не могу сказать, какой вариант лучше).
Если вы используете add_option
для сохранения настроек:
add_option_{option_name}: Срабатывает после добавления опции с именем "option_name" с помощью функции add_option()
. Например, для опции с именем "foo":
add_action('add_option_foo', function( $option_name, $option_value ) {
//....
}, 10, 2);
add_option: Срабатывает перед добавлением опции в базу данных. Пример:
add_action('add_option', function( $option_name, $option_value ) {
//....
}, 10, 2);
added_option: Срабатывает после добавления опции. Пример:
add_action('added_option', function( $option_name, $option_value ) {
//....
}, 10, 2);
Также существуют аналогичные хуки для delete_option()
: delete_option_{option_name}
, delete_option
и deleted_option
Если вы используете update_option
для сохранения настроек:
(update_option
можно использовать и для создания/сохранения новых опций)
update_option_{option_name}: Срабатывает после обновления опции с именем "option_name". Например, для опции с именем "foo":
add_action('update_option_foo', function( $old_value, $value ) {
//....
}, 10, 2);
update_option: Срабатывает перед обновлением опции. Пример:
add_action('update_option', function( $option_name, $old_value, $value ) {
//....
}, 10, 3);
updated_option: Срабатывает после обновления опции. Пример:
add_action('updated_option', function( $option_name, $old_value, $value ) {
//....
}, 10, 3);

Хороший ответ, однако параметры указаны в неправильном порядке. Сначала идет старое значение, затем новое, а option_name — последний. Возможно, со временем это изменилось.

В ответе упомянуто несколько хуков действий, о каком именно идет речь? Я проверил документацию, и, кажется, вы ошибаетесь. Смотрите документацию для хуков update_option
и updated_option
.

Запустите скрипт и увидите сами. Предполагаю, что документация тоже ошибочна, я уже предложил её исправить. Посмотрите -> http://berend.biz/debug.png

Вы путаете понятия. Ваше изображение показывает отладку действия update_option_{$option}
, а не действия update_option
. Так что ответ кажется правильным, перепроверьте его ещё раз. В любом случае, спасибо за интерес.

Вы можете использовать register_setting
для подключения функции валидации и проверки значений.
Вот код из моего проекта.
function gmbt_register_settings() {
register_setting( 'gmbt_time_plugin_options', 'gmbt_time_plugin_options', 'gmbt_time_plugin_options_validate' );
add_settings_section( 'gmbt_settings', 'Установите Your Location Goolge Place ID', 'gmbt_plugin_section_text', 'gmbt_time_plugin' );
add_settings_field( 'gmbt_plugin_setting_ggl_place_id', 'Google Place ID', 'gmbt_plugin_setting_ggl_place_id', 'gmbt_time_plugin', 'gmbt_settings' );
}
add_action( 'admin_init', 'gmbt_register_settings' );
function gmbt_plugin_section_text() {}
function gmbt_plugin_setting_ggl_place_id() {
$options = get_option( 'gmbt_time_plugin_options' );
echo "<input id='gmbt_plugin_setting_ggl_place_id' name='gmbt_time_plugin_options[ggl_place_id]' type='text' value='" . esc_attr( !empty($options['ggl_place_id']) ? $options['ggl_place_id'] : '' ) . "' />";
}
function gmbt_time_plugin_options_validate( $input ) {
$options = get_option( 'gmbt_time_plugin_options' );
$ggl_place_id = trim( $input['ggl_place_id'] );
if($ggl_place_id != $options['ggl_place_id']) {
delete_transient( 'gmb_business_hours' );
wp_die('был удален');
}
return $input;
}

Я обнаружил, что хук update_option_{option_name} не выполнялся при последующих изменениях настроек, только один раз.
В итоге я решил эту проблему, добавив скрипт генерации в функцию обратного вызова add_options_page. Таким образом, генерация происходит при каждом открытии страницы настроек, и такое решение выглядит приемлемым с точки зрения производительности.
