Cum pot folosi un hook când cineva salvează opțiunile unui plugin?
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...?

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

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.

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
.

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

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.

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

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.
