Come agganciarsi al salvataggio delle opzioni di un plugin in WordPress?
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?

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);

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.

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
.

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

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.

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;
}

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.
