Hook si alguien guarda las opciones del plugin
Escribí un plugin que tiene varias opciones y cuando el usuario guarda estas opciones se genera un archivo CSS. Mi intención es que el CSS solo se cree cuando se guardan las opciones y no cada vez que alguien visita la página y el CSS se genere repetidamente.
Necesito un hook que se dispare cuando alguien guarda las opciones. Lo intenté así:
public function __construct( $file ) {
$this->options = get_option('clb_plugin_options');
// Añadir filtro para generar CSS cuando se actualizan las opciones
add_filter( 'pre_update_option_clb_plugin_options', array( $this, 'generate_options_css' ) );
}
public function generate_options_css() {
[realizando todas las operaciones relacionadas con el CSS)
return $this->options;
}
Pero en este caso no toma en cuenta los cambios que hice en el formulario, ya que solo guardo las opciones en $this->options que ya estaban allí. ¿Cómo puedo hacer para engancharme después de que alguien guarde las opciones del plugin...?

Aunque no estoy de acuerdo con tu propósito, aquí están los hooks de acción que puedes usar (no nos has mostrado qué estás usando para guardar las opciones, así que no puedo decir cuál es mejor).
Si usas add_option
para guardar opciones:
add_option_{option_name}: Se ejecuta después de que se haya añadido una opción con el nombre "option_name" usando la función add_option()
. Por ejemplo, para la opción con nombre "foo":
add_action('add_option_foo', function( $option_name, $option_value ) {
//....
}, 10, 2);
add_option: Se ejecuta antes de que una opción se añada a la base de datos. Ejemplo:
add_action('add_option', function( $option_name, $option_value ) {
//....
}, 10, 2);
added_option: Se ejecuta después de que una opción haya sido añadida. Ejemplo:
add_action('added_option', function( $option_name, $option_value ) {
//....
}, 10, 2);
También hay acciones análogas para delete_option()
: delete_option_{option_name}
, delete_option
y deleted_option
Si usas update_option
para guardar opciones:
(update_option
también puede usarse para guardar/crear nuevas opciones)
update_option_{option_name}: Se ejecuta después de que la opción con nombre "option_name" haya sido actualizada. Por ejemplo, para la opción con nombre "foo":
add_action('update_option_foo', function( $old_value, $value ) {
//....
}, 10, 2);
update_option: Se ejecuta antes de que una opción se actualice. Ejemplo:
add_action('update_option', function( $option_name, $old_value, $value ) {
//....
}, 10, 3);
updated_option: Se ejecuta después de que una opción haya sido actualizada. Ejemplo:
add_action('updated_option', function( $option_name, $old_value, $value ) {
//....
}, 10, 3);

Buena respuesta, sin embargo los parámetros no están en el orden correcto. Primero está el valor antiguo, luego el nuevo y option_name va al final. Quizás lo cambiaron con el tiempo.

Hay varios hooks de acciones en la respuesta, ¿de cuál estás hablando exactamente? He revisado la documentación y parece que estás equivocado. Consulta la documentación de los hooks update_option
y updated_option
.

Ejecuta el script y verás, supongo que la documentación también está equivocada entonces, ya sugerí que la editaran. Echa un vistazo -> http://berend.biz/debug.png

Estás mezclando cosas. Tu imagen muestra el debug de la acción update_option_{$option}
, no de la acción update_option
. Así que la respuesta parece correcta, revísala de nuevo. De todas formas, gracias por el interés.

Puedes usar register_setting
para enlazar una función de validación y verificar los valores allí.
Aquí está el código de mi proyecto.
function gmbt_register_settings() {
register_setting( 'gmbt_time_plugin_options', 'gmbt_time_plugin_options', 'gmbt_time_plugin_options_validate' );
add_settings_section( 'gmbt_settings', 'Configura tu ID de Lugar de Google', '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('fue eliminado');
}
return $input;
}

Experimenté que update_option_{option_name} no se ejecutaba en cambios posteriores de configuración, solo una vez.
Al final lo resolví añadiendo un script de generación a la función callback de add_options_page. De esta manera se genera si la página de opciones simplemente se abre, pero la sobrecarga parece aceptable.
