Cum pot folosi un hook când cineva salvează opțiunile unui plugin?

6 feb. 2015, 11:23:01
Vizualizări: 15.5K
Voturi: 9

Am scris un plugin care are diverse opțiuni, iar atunci când utilizatorul salvează aceste opțiuni, se generează un fișier CSS. Intenția mea este ca CSS-ul să fie creat doar când se salvează opțiunile și nu de fiecare dată când cineva accesează pagina.

Deci am nevoie de un hook care să se declanșeze când cineva salvează opțiunile. Am încercat așa:

    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() {
[fac toate operațiunile legate de CSS)

        return $this->options;

}

Dar în acest caz, nu ia în considerare modificările pe care le-am făcut în formular, deoarece salvez doar opțiunile în $this->options care erau deja acolo. Deci cum pot face să mă conectez după ce cineva salvează opțiunile pluginului...?

2
Comentarii

Salut @Torben, știi dacă opțiunile sunt partajate între utilizatori sau sunt date specifice fiecărui utilizator? Mulțumesc!

RickON RickON
20 oct. 2021 18:02:05

Poți folosi register_setting pentru a te conecta la funcția de validare și acolo să verifici valorile. Iată codul din proiectul meu. Detaliile le poți găsi aici https://wordpress.stackexchange.com/a/404871/63233

fdrv fdrv
17 apr. 2022 07:49:32
Toate răspunsurile la întrebare 3
6
21

Deși nu sunt de acord cu scopul tău, iată acțiunile (hooks) pe care le poți folosi (nu ne-ai arătat ce folosești pentru a salva opțiunile, așa că nu pot spune care este mai bun).

Dacă folosești add_option pentru a salva opțiuni:

add_option_{option_name}: Rulează după ce opțiunea cu numele "option_name" a fost adăugată folosind funcția add_option(). De exemplu, pentru opțiunea cu numele "foo":

add_action('add_option_foo', function( $option_name, $option_value ) {
     //....
}, 10, 2);

add_option: Rulează înainte ca o opțiune să fie adăugată în baza de date. Exemplu:

add_action('add_option', function( $option_name, $option_value ) {
     //....
}, 10, 2);

added_option: Rulează după ce o opțiune a fost adăugată. Exemplu:

add_action('added_option', function( $option_name, $option_value ) {
     //....
}, 10, 2);

Există și acțiuni analoge pentru delete_option(): delete_option_{option_name}, delete_option și deleted_option

Dacă folosești update_option pentru a salva opțiuni:

(update_option poate fi folosit și pentru a salva/crea opțiuni noi)

update_option_{option_name}: Rulează după ce opțiunea cu numele "option_name" a fost actualizată. De exemplu, pentru opțiunea cu numele "foo":

add_action('update_option_foo', function( $old_value, $value ) {
     //....
}, 10, 2);

update_option: Rulează înainte ca o opțiune să fie actualizată. Exemplu:

add_action('update_option', function( $option_name, $old_value, $value ) {
     //....
}, 10, 3);

updated_option: Rulează după ce o opțiune a fost actualizată. Exemplu:

add_action('updated_option', function( $option_name, $old_value, $value ) {
     //....
}, 10, 3);
6 feb. 2015 12:31:25
Comentarii

Bun răspuns, dar parametrii nu sunt în ordinea corectă. Primul este vechea valoare, următoarea este noua valoare, iar option_name este ultimul. Poate s-au schimbat de-a lungul timpului.

berend berend
30 mai 2017 09:54:14

Există mai multe action hooks în răspuns, despre care anume vorbești? Am verificat documentația și se pare că greșești. Vezi documentația pentru hook-urile update_option și updated_option.

cybmeta cybmeta
30 mai 2017 10:48:47

Rulează scriptul și vei vedea, presupun că atunci și documentația este greșită, am sugerat deja să o editeze. Uită-te aici -> http://berend.biz/debug.png

berend berend
31 mai 2017 10:00:24

Amestecați lucrurile. Imaginea dumneavoastră arată depanarea acțiunii update_option_{$option}, nu a acțiunii update_option. Deci, răspunsul pare corect, revizuiți-l din nou. Oricum, mulțumesc pentru interes.

cybmeta cybmeta
31 mai 2017 12:35:35

și dacă folosești Options API pentru a salva opțiunile?

Rick Hellewell Rick Hellewell
25 oct. 2022 03:46:05

Mulțumesc @cybmeta

Carlos Carlos
13 mar. 2025 14:14:21
Arată celelalte 1 comentarii
0

Puteți folosi register_setting pentru a vă conecta la o funcție de validare și a verifica valorile acolo. Iată codul din proiectul meu.

function gmbt_register_settings() {
    register_setting( 'gmbt_time_plugin_options', 'gmbt_time_plugin_options', 'gmbt_time_plugin_options_validate' );
    add_settings_section( 'gmbt_settings', 'Setați ID-ul locației Google Place', '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('a fost șters');
    }
    return $input;
}
17 apr. 2022 02:07:28
1

Am observat că update_option_{option_name} nu se executa la modificările ulterioare ale setărilor, ci doar o singură dată.

În final, am rezolvat problema prin adăugarea unui script de generare în funcția de callback a add_options_page. Astfel, se generează atunci când pagina de opțiuni este doar deschisă, dar overhead-ul pare acceptabil.

28 iul. 2019 03:30:00
Comentarii

Cârligul se execută doar atunci când setarea specifică este de fapt modificată.

davey davey
1 oct. 2019 11:29:28