Come agganciarsi al salvataggio delle opzioni di un plugin in WordPress?

6 feb 2015, 11:23:01
Visualizzazioni: 15.5K
Voti: 9

Ho sviluppato un plugin con diverse opzioni e quando l'utente salva queste opzioni viene generato un file CSS. La mia intenzione è che il CSS venga creato solo quando le opzioni vengono salvate e non ogni volta che qualcuno visita la pagina.

Quindi ho bisogno di un hook che si attivi quando qualcuno salva le opzioni. Ho provato così:

    public function __construct( $file ) {
        $this->options = get_option('clb_plugin_options');
        // Aggiunge il filtro prima dell'aggiornamento delle opzioni
        add_filter( 'pre_update_option_clb_plugin_options', array( $this, 'generate_options_css' ) );       
}

    public function generate_options_css() {
        // [tutte le operazioni relative al CSS]

        return $this->options;
}

Ma in questo caso non vengono considerate le modifiche fatte nel form, poiché salvo semplicemente le opzioni in $this->options che sono già presenti. Come posso fare per agganciarmi dopo che qualcuno ha salvato le opzioni del plugin?

2
Commenti

Ciao @Torben, sai se le opzioni sono condivise tra gli utenti o sono dati specifici per ogni utente? Grazie!

RickON RickON
20 ott 2021 18:02:05

Puoi usare register_setting per agganciarti alla funzione di validazione e lì controllare i valori. Ecco il codice dal mio progetto. I dettagli li puoi trovare qui https://wordpress.stackexchange.com/a/404871/63233

fdrv fdrv
17 apr 2022 07:49:32
Tutte le risposte alla domanda 3
6
21

Anche se non sono d'accordo con il tuo obiettivo, ecco gli action hook che potresti utilizzare (non ci hai mostrato cosa stai usando per salvare le opzioni, quindi non posso dire quale sia il migliore).

Se usi add_option per salvare le opzioni:

add_option_{option_name}: Si attiva dopo che l'opzione con nome "option_name" è stata aggiunta usando la funzione add_option(). Ad esempio, per l'opzione con nome "foo":

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

add_option: Si attiva prima che un'opzione venga aggiunta al database. Esempio:

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

added_option: Si attiva dopo che un'opzione è stata aggiunta. Esempio:

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

Ci sono anche azioni analoghe per delete_option(): delete_option_{option_name}, delete_option e deleted_option

Se usi update_option per salvare le opzioni:

(update_option può essere usato anche per salvare/creare nuove opzioni)

update_option_{option_name}: Si attiva dopo che l'opzione con nome "option_name" è stata aggiornata. Ad esempio, per l'opzione con nome "foo":

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

update_option: Si attiva prima che un'opzione venga aggiornata. Esempio:

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

updated_option: Si attiva dopo che un'opzione è stata aggiornata. Esempio:

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

Buona risposta, tuttavia i parametri non sono nell'ordine corretto. Il primo è il vecchio valore, poi il nuovo valore e option_name è l'ultimo. Forse hanno cambiato l'ordine nel tempo.

berend berend
30 mag 2017 09:54:14

Ci sono diversi action hook nella risposta, di quale stai parlando esattamente? Ho controllato la documentazione e sembra che tu abbia torto. Vedi la documentazione per gli hook update_option e updated_option.

cybmeta cybmeta
30 mag 2017 10:48:47

Esegui lo script e vedrai, suppongo che anche la documentazione sia sbagliata, ho già suggerito di modificarla. Dai un'occhiata -> http://berend.biz/debug.png

berend berend
31 mag 2017 10:00:24

Stai mischiando le cose. La tua immagine mostra il debug dell'azione update_option_{$option}, non dell'azione update_option. Quindi, la risposta sembra corretta, rivedila di nuovo. Grazie comunque per l'interesse.

cybmeta cybmeta
31 mag 2017 12:35:35

e se usi l'Options API per salvare le opzioni?

Rick Hellewell Rick Hellewell
25 ott 2022 03:46:05

Grazie @cybmeta

Carlos Carlos
13 mar 2025 14:14:21
Mostra i restanti 1 commenti
0

Puoi utilizzare register_setting per agganciarti a una funzione di validazione e verificare i valori. Ecco il codice dal mio progetto.

function gmbt_register_settings() {
    register_setting( 'gmbt_time_plugin_options', 'gmbt_time_plugin_options', 'gmbt_time_plugin_options_validate' );
    add_settings_section( 'gmbt_settings', 'Imposta il tuo Google 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('è stato eliminato');
    }
    return $input;
}
17 apr 2022 02:07:28
1

Ho riscontrato che update_option_{option_name} non veniva eseguito sulle modifiche successive delle impostazioni, ma solo una volta.

Alla fine ho risolto aggiungendo uno script di generazione alla funzione di callback di add_options_page. In questo modo viene generato quando la pagina delle opzioni viene semplicemente aperta, ma il sovraccarico sembra accettabile.

28 lug 2019 03:30:00
Commenti

L'hook viene eseguito solo quando l'impostazione specifica viene effettivamente modificata.

davey davey
1 ott 2019 11:29:28