Hook si alguien guarda las opciones del plugin

6 feb 2015, 11:23:01
Vistas: 15.5K
Votos: 9

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...?

2
Comentarios

Hola @Torben, ¿sabes si las opciones se comparten entre usuarios o son datos específicos de cada usuario? ¡Gracias!

RickON RickON
20 oct 2021 18:02:05

Puedes usar register_setting para enlazar con una función de validación y allí verificar los valores. Aquí está el código de mi proyecto. Los detalles los puedes encontrar aquí https://wordpress.stackexchange.com/a/404871/63233

fdrv fdrv
17 abr 2022 07:49:32
Todas las respuestas a la pregunta 3
6
21

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);
6 feb 2015 12:31:25
Comentarios

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.

berend berend
30 may 2017 09:54:14

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.

cybmeta cybmeta
30 may 2017 10:48:47

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

berend berend
31 may 2017 10:00:24

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.

cybmeta cybmeta
31 may 2017 12:35:35

¿y si usas la API de Opciones para guardar las opciones?

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

Gracias @cybmeta

Carlos Carlos
13 mar 2025 14:14:21
Mostrar los 1 comentarios restantes
0

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;
}
17 abr 2022 02:07:28
1

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.

28 jul 2019 03:30:00
Comentarios

El gancho solo se ejecuta cuando el ajuste específico realmente cambia.

davey davey
1 oct 2019 11:29:28