Хук при сохранении настроек плагина

6 февр. 2015 г., 11:23:01
Просмотры: 15.5K
Голосов: 9

Я написал плагин с различными настройками, и при сохранении этих настроек должен генерироваться 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. Как правильно подключить хук после сохранения настроек плагина?

2
Комментарии

Привет @Torben, подскажи, пожалуйста, являются ли настройки общими для всех пользователей или это индивидуальные данные для каждого пользователя? Спасибо!

RickON RickON
20 окт. 2021 г. 18:02:05

Вы можете использовать register_setting для подключения функции валидации и проверки значений. Вот код из моего проекта. Подробности можно найти здесь https://wordpress.stackexchange.com/a/404871/63233

fdrv fdrv
17 апр. 2022 г. 07:49:32
Все ответы на вопрос 3
6
21

Хотя я не согласен с вашей целью, вот хуки действий, которые вы можете использовать (вы не показали, что используете для сохранения настроек, поэтому я не могу сказать, какой вариант лучше).

Если вы используете 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);
6 февр. 2015 г. 12:31:25
Комментарии

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

berend berend
30 мая 2017 г. 09:54:14

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

cybmeta cybmeta
30 мая 2017 г. 10:48:47

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

berend berend
31 мая 2017 г. 10:00:24

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

cybmeta cybmeta
31 мая 2017 г. 12:35:35

а если вы используете Options API для сохранения настроек?

Rick Hellewell Rick Hellewell
25 окт. 2022 г. 03:46:05

Спасибо, @cybmeta

Carlos Carlos
13 мар. 2025 г. 14:14:21
Показать остальные 1 комментариев
0

Вы можете использовать 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;
}
17 апр. 2022 г. 02:07:28
1

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

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

28 июл. 2019 г. 03:30:00
Комментарии

Хук срабатывает только тогда, когда изменяется конкретная настройка.

davey davey
1 окт. 2019 г. 11:29:28