Engánchate a la acción de guardar del personalizador de temas de WordPress

5 minutos de lectura

Me enfrento al siguiente problema:

Solía ​​mantener todo el estilo en una página de opciones de tema. Cuando el usuario hizo clic en el botón Guardar, tenía un script de back-end que generaba un archivo css con los cambios para que no se mostraran en línea en cada página. Esto tiene muchos beneficios, entre ellos el almacenamiento en caché.

Cambié al Personalizador de temas y todo está bien, excepto que no puedo encontrar una manera de conectarme al botón “Guardar”. Me gustaría activar una función que actualice el contenido del archivo css cuando se hace clic en ese botón en el backend.

¿Es esto posible?

Gracias !

Desde WordPress 3.6.0 ahora puedes llamar customize_save_after.

<?php
function emailAdmin(){
    mail('your@email', 'Woza!', 'You won\'t believe this but someone has updated the theme customizations!!');
}
add_action( 'customize_save_after', 'emailAdmin' );
?>

Más información: http://developer.wordpress.org/reference/hooks/customize_save_after/

  • He usado este gancho para get_theme_mod valor de control pero no devuelve ningún valor. ¿Qué equivocado?

    – huykon225

    27 de junio de 2017 a las 8:16

avatar de usuario
Dovy

Estoy enfrentando la misma situación. El customize_save funciona ANTES de que se guarden las opciones, así que eso está fuera. Le envié un correo electrónico a Otto (ottodestruct.com) al respecto.

La solución que tengo ahora mismo es la siguiente:

add_action('customize_save', 'regenCSS', 100);
function regenCSS( $wp_customize ) {
    checkCSSRegen(); // Checks if I need to regen and does so
    set_theme_mod('regen-css', time()+3); // Waits 3 seconds until everything is saved
}
function checkCSSRegen() {
    if (get_theme_mod('regen-css') != "" && get_theme_mod('regen-css') < time()) {
        makecss();
        remove_theme_mod('regen-css');
    }
}

También agrego un checkCSSRegen adicional (); a mi función customize_controls_init.

Nuevamente, esto es un pequeño truco. Desafortunadamente, es lo mejor que puedo encontrar para hacer en ese momento.

Otra opción sería usar una respuesta ajax que solo haga ping a un archivo php. Eso se siente aún más un truco que esto.

Otro truco rápido sería hacer una acción de javascript que cuando se hace clic en el botón Guardar, establece un temporizador para retrasar una llamada a un archivo PHP que ejecuta la compilación. Eso es MUY raro para mí.

El único inconveniente de lo anterior es que, a menos que se vuelva a cargar el personalizador o se guarde otro valor, es posible que no obtenga todos los valores que desea.

¿Alguien más tiene una idea mejor?

** Actualización ** Acabo de agregar la siguiente solicitud al equipo de WordPress. Esperemos que lo consigamos exprimido allí.

http://wordpress.org/ideas/topic/do-customize_save-action-hook-after-the-settings-are-saved?replies=3#post-24853

* Actualización 2 *
Parece que estará en la versión 3.6 como customize_save_after. Supongo que algunos tweets y códigos de ejemplo pueden hacer que las cosas sucedan incluso con el equipo de WordPress. 😉

  • Entonces, en el personalizador de temas, haría algo como: do_action(‘generate_css’, ‘customize_save_after’, 99); — ¿Eso parece exacto?

    – Imperativo

    21 de julio de 2013 a las 10:34


  • Nota: Si tiene un servidor mySQL dedicado, esto no funcionará directamente porque el servidor DB aún no maneja las solicitudes. He usado sleep(1) como primera función en el método de verificación, por lo que puede estar seguro de que esto funcionará después de que la base de datos haya realizado sus otras solicitudes. Esta solución solo es necesaria cuando tiene un servidor de base de datos que está completamente dedicado y los métodos no parecen funcionar.

    – Gkiokan

    19 de abril de 2017 a las 6:39

  • La página no guarda datos cuando usa este gancho. He visto un error al cargar admin-ajax.php. ¿Cuál es ese problema?

    – huykon225

    21 de julio de 2017 a las 9:36

avatar de usuario
Bajo Jobsen

Como describe @Dovy ya puedes enganchar customize_save_after para hacer esto ahora:

do_action('customize_save_after', 'savesettings', 99);

Cuando savesettings guardar la configuración en un archivo, será una mala práctica hacer esto con las funciones nativas del archivo php (como file_put_contents()) como se describe aquí: http://ottopress.com/2011/tutorial-using-the-wp_filesystem/ por @otto.

La solución para guardar archivos será usar wp_filesystem. Para usar wp_filesystem necesitará las credenciales de archivo (ftp) del usuario.

customize_save_after se llamará en una solicitud AJAX y el resultado no será visible. Debido al identificador AJAX, no puede pedirle al usuario las credenciales del archivo, lo que requiere el envío de un formulario.

La solución se puede encontrar guardando las credenciales del archivo en wp-config.php y agregándolas (temporalmente) a la base de datos. Haciendo esto savesettings puede leer las credenciales de la base de datos y usarlas para guardar el archivo usando credenciales. (esta solución se describe con más detalle aquí: https://wordpress.stackexchange.com/a/126631/31759)

  • He intentado usar este enlace para obtener el valor del control de configuración para compilar menos en CSS. Estoy usando get theme mod para obtenerlo, pero siempre devuelve el valor 0 cuando se compila. ¿Qué equivocado?

    – huykon225

    27 de junio de 2017 a las 8:22

  • La página no guarda datos cuando usa este gancho. He visto un error al cargar admin-ajax.php. ¿Cuál es ese problema?

    – huykon225

    21 de julio de 2017 a las 9:36

No probado, pero está el gancho de acción. customize_save en /wp-includes/class-wp-customize-manager.php.

esta dentro de la save() función:

/**
 * Switch the theme and trigger the save action of each setting.
 *
 * @since 3.4.0
 */

Hay algunos otros ganchos de acción interesantes (do_action) en este archivo que puede valer la pena verificar.

¿Ha sido útil esta solución?