Crear correo de bienvenida personalizado sin un plugin

6 feb 2013, 01:30:44
Vistas: 17.5K
Votos: 4

¿Existe alguna manera de personalizar el contenido y el asunto de los correos de bienvenida y verificación que se envían durante el proceso de registro en WordPress? Me gustaría implementarlo mediante hooks o filtros sin usar un plugin o la función "pluggable".

Si alguien pudiera indicarme la dirección correcta, estaría muy agradecido. ¡Gracias!

4
Comentarios

Cualquier cosa que pegues en tu functions.php es un plugin potencial. Además, ¿por qué no puede ser con la función pluggable? ¿Estás seguro de que tu pregunta no es un duplicado? (revisa la columna RELACIONADO a la derecha)

brasofilo brasofilo
6 feb 2013 01:37:43

Mientras pueda realizar la acción desde mi archivo functions.php, estoy de acuerdo. El problema con los plugins es que tenemos muchos sitios en nuestra red y todos funcionan como una aplicación colectiva en lugar de sitios individuales. Todos necesitan el mismo código. Gestionar la activación de un plugin en cada uno cuando se crea parece un esfuerzo extremo continuo.

Jake Lisby Jake Lisby
6 feb 2013 17:27:56

Para eso están los plugins Must Use.

brasofilo brasofilo
6 feb 2013 17:34:57

Así que intenté seguir esta ruta y por alguna razón no sobrescribe el cuadro de contenido disponible en el menú de Configuración de Red. Así que aunque podría activarse automáticamente, en realidad no reemplaza nada. Estoy usando una Instalación Multisitio, así que no estoy seguro de cómo afecta eso a estas funciones pluggables.

Jake Lisby Jake Lisby
6 feb 2013 19:01:21
Todas las respuestas a la pregunta 3
7

Me temo que tendrás que usar la función de funciones enchufables - no hay ningún filtro o gancho dentro de esas funciones (como puedes ver en el código a continuación). Y lo que es peor, para ti, es mejor usar la función enchufable en un plugin.

Esto se debe a que definir una nueva función enchufable en el functions.php de tu tema requiere que uses una definición de una nueva función dentro de una función (para llamarla tan pronto como todos los plugins estén completamente cargados), lo cual puede ser malo (ver comentarios debajo de esta publicación), pero por otro lado, funciona - ver el código debajo del primero.

Para aquellos que no están en contra de los plugins, aquí hay uno que reescribe una función enchufable - solo guárdalo en my_plugin.php (o cualquier otro nombre) en tu directorio de plugins y actívalo desde tu administrador:

<?php
/*
Plugin Name: Nombre Del Plugin
Plugin URI: http://URI_De_La_Página_Que_Describe_El_Plugin_Y_Actualizaciones
Description: Una breve descripción del Plugin.
Version: El Número de Versión del Plugin, ej.: 1.0
Author: Nombre Del Autor Del Plugin
Author URI: http://URI_Del_Autor_Del_Plugin
License: Un "Slug" de nombre de licencia, ej. GPL2
*/
if( !function_exists('new_user_notification') ){
function new_user_notifiaction(){
        /**
         * Notifica al administrador del blog de un nuevo usuario, normalmente por correo electrónico.
         *
         * @since 2.0
         *
         * @param int $user_id ID del usuario
         * @param string $plaintext_pass Opcional. La contraseña en texto plano del usuario
         */
        function wp_new_user_notification($user_id, $plaintext_pass = '') {
            $user = get_userdata( $user_id );

            $user_login = stripslashes($user->user_login);
            $user_email = stripslashes($user->user_email);

            // La opción blogname se escapa con esc_html al guardarse en la base de datos en sanitize_option
            // queremos revertir esto para el texto plano de los correos.
            $blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);

            $message  = sprintf(__('Nuevo registro de usuario en tu sitio %s:'), $blogname) . "\r\n\r\n";
            $message .= sprintf(__('Nombre de usuario: %s'), $user_login) . "\r\n\r\n";
            $message .= sprintf(__('Correo electrónico: %s'), $user_email) . "\r\n";

            @wp_mail(get_option('admin_email'), sprintf(__('[%s] Nuevo Registro de Usuario'), $blogname), $message);

            if ( empty($plaintext_pass) )
                return;

            $message  = sprintf(__('Nombre de usuario: %s'), $user_login) . "\r\n";
            $message .= sprintf(__('Contraseña: %s'), $plaintext_pass) . "\r\n";
            $message .= wp_login_url() . "\r\n";

            wp_mail($user_email, sprintf(__('[%s] Tu nombre de usuario y contraseña'), $blogname), $message);

        }
    }
}

Solo por si tienes curiosidad, aquí está el mismo efecto logrado desde functions.php con una nueva función definida dentro de otra función:

//redefinir wp_new_user_notification tan pronto como todos los plugins estén cargados
add_action( 'plugins_loaded', 'new_user_notifiaction' );

function new_user_notifiaction(){
    /**
     * Notifica al administrador del blog de un nuevo usuario, normalmente por correo electrónico.
     *
     * @since 2.0
     *
     * @param int $user_id ID del usuario
     * @param string $plaintext_pass Opcional. La contraseña en texto plano del usuario
     */
    function wp_new_user_notification($user_id, $plaintext_pass = '') {
        $user = get_userdata( $user_id );

        $user_login = stripslashes($user->user_login);
        $user_email = stripslashes($user->user_email);

        // La opción blogname se escapa con esc_html al guardarse en la base de datos en sanitize_option
        // queremos revertir esto para el texto plano de los correos.
        $blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);

        $message  = sprintf(__('Nuevo registro de usuario en tu sitio %s:'), $blogname) . "\r\n\r\n";
        $message .= sprintf(__('Nombre de usuario: %s'), $user_login) . "\r\n\r\n";
        $message .= sprintf(__('Correo electrónico: %s'), $user_email) . "\r\n";

        @wp_mail(get_option('admin_email'), sprintf(__('[%s] Nuevo Registro de Usuario'), $blogname), $message);

        if ( empty($plaintext_pass) )
            return;

        $message  = sprintf(__('Nombre de usuario: %s'), $user_login) . "\r\n";
        $message .= sprintf(__('Contraseña: %s'), $plaintext_pass) . "\r\n";
        $message .= wp_login_url() . "\r\n";

        wp_mail($user_email, sprintf(__('[%s] Tu nombre de usuario y contraseña'), $blogname), $message);

    }
}
6 feb 2013 01:48:11
Comentarios

¿Puedes proporcionar un ejemplo de terceros de una función pluggable definida como una función dentro de una función? Es la primera vez que veo esto...

brasofilo brasofilo
6 feb 2013 02:11:16

Me temo que no puedo, pero está funcionando ;) ¿Hay alguna razón por la que este enfoque podría causar problemas? ¿Rendimiento? ¿Integridad?

david.binda david.binda
6 feb 2013 02:37:22

Quería asegurarme de que no hubiera una fuente de copiar/pegar para esto. Es mala práctica declarar una función dentro de otra función. Y para sobrescribir una pluggable solo necesitas if( !function_exists('plug_func') ) { function plug_func() {} }.

brasofilo brasofilo
6 feb 2013 02:43:35

Sí, es cierto que solo necesito el código que has proporcionado, pero en ese caso mi código debe cargarse antes del original. Y el functions.php del tema se carga después del código original en pluggable.php, de ahí el hook plugins_loaded. ¿Y alguna razón por la que declarar una función dentro de otra sea una mala idea?

david.binda david.binda
6 feb 2013 02:51:33

OK, gracias. He modificado la respuesta: ahora incluye una forma estándar hecha desde un plugin además de la forma menos preferible de definir una función dentro de otra (en este caso, creo que es mejor que crear una función directamente en un callback, que podría ser otra opción)

david.binda david.binda
6 feb 2013 08:16:04

Tienes un error tipográfico notification vs notifiaction

Slbox Slbox
15 abr 2020 23:36:31
Mostrar los 2 comentarios restantes
0
-1

Así que creo que la respuesta es no, no puedes hacer esto de manera segura.

6 feb 2013 20:40:36
0
-1

Esta parece una buena idea, que también funcionaría en functions.php:

// Añadir filtro para el cuerpo del correo de registro
add_filter('wp_mail','handle_wp_mail');

function handle_wp_mail($atts) {
    /*"Tu nombre de usuario y contraseña" es el asunto del correo que WordPress envía desde la función "wp_new_user_notification" en el archivo "wp-includes/pluggable.php"*/

    if (isset ($atts ['subject']) && substr_count($atts ['subject'],'Tu nombre de usuario y contraseña')>0 ) {
    if (isset($atts['message'])) {
       $atts['message'] = 'nuevo cuerpo';
    }
    }
    return ($atts);
}

Solo hay que tener cuidado con el idioma para obtener la cadena de asunto correcta. (Fuente: http://wordpress.org/support/topic/how-to-change-registration-email-content?replies=3)

22 ene 2014 18:22:50