Obtenga un valor de marcador de posición de correo electrónico personalizado en el contenido de correo electrónico personalizado de Woocommerce

5 minutos de lectura

Obtenga un valor de marcador de posicion de correo electronico
Sr. Jo

Creé mi propia clase de correo electrónico en WooCommerce. Debido a que necesito un parámetro personalizado en el contenido de mi correo electrónico, agregué un marcador de posición con este parámetro personalizado a la función de activación de correo electrónico de wc:

public function trigger( $order_id, $firstname, $lastname, $order = false ) {
        $this->setup_locale();

        if ( $order_id && ! is_a( $order, 'WC_Order' ) ) {
            $order = wc_get_order( $order_id );
        }

        if ( is_a( $order, 'WC_Order' ) ) {
            $this->object                                = $order;
            $this->recipient                             = $this->object->get_billing_email();
            $this->placeholders['{order_date}']          = wc_format_datetime( $this->object->get_date_created() );
            $this->placeholders['{order_number}']        = $this->object->get_order_number();
            $this->placeholders['{full_name}'] = $firstname . ' ' . $lastname;
        }

        if ( $this->is_enabled() && $this->get_recipient() ) {
            $this->send( $this->get_recipient(), $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() );
        }

    $this->restore_locale();
}

Después de esto, hice esto en el archivo PHP de contenido:

<?php printf( __( get_option( 'wc_custom_email_info' ) ), '{full_name}' ); ?>

En la opción que he escrito %s para que pueda agregar el nombre completo al contenido. Pero lamentablemente obtengo el nombre del marcador de posición y no el contenido:

Blaaaaaaa {nombre_completo} blaaaa

Pero necesito esto aquí:

Blaaaaaaa Joe Martin blaaaa

Actualizar

El nombre aquí no es el nombre del cliente del pedido. Este es un nombre que paso a través de un do_action que acciono desde un botón. Entonces, cuando alguien en mi página hace clic en este botón, busco su ID de usuario y obtengo el nombre del usuario que hizo clic en el botón. Este es el activador de correo electrónico personalizado que uso:

$user      = get_userdata( get_current_user_id() );
$firstname = $user->user_firstname;
$lastname  = $user->last_name;

//Trigger email sending
do_action( 'trigger_email', $order_id, $firstname, $lastname );

Luego hago esto en la clase de correo electrónico:

//Trigger for this email.
add_action( 'trigger_email', array( $this, 'trigger' ), 10, 10 );

Después de esto, puede volver a la función de activación superior.

  • Porque he agregado allí mi texto personalizado que define el contenido. Para obtener el nombre en el contenido, lo paso como parámetro.

    – Sr. Jo

    22 de noviembre de 2018 a las 23:47

  • @LoicTheAztec Error fatal de PHP: error no detectado: usar $ esto cuando no está en el contexto del objeto

    – Sr. Jo

    22 de noviembre de 2018 a las 23:49

  • marcadores de posición[‘{full_name}’]; ?>

    – Sr. Jo

    22 de noviembre de 2018 a las 23:49


  • Continuemos esta discusión en el chat.

    – Sr. Jo

    22/11/2018 a las 23:50

Obtenga un valor de marcador de posicion de correo electronico
LoicTheAztec

Actualizado

Los marcadores de posición en el correo electrónico son solo para el asunto del correo electrónico en Woocommerce

Entonces, lo que estás tratando de hacer no puede funcionar de esta manera.

En su lugar, tendrá que hacer un pequeño cambio en su trigger() función y agregar otro método en su clase:

/**
 * Trigger the sending of this email.
*/
public function trigger( $order_id, $firstname, $lastname, $order = false ) {
    $this->setup_locale();

    if ( $order_id && ! is_a( $order, 'WC_Order' ) ) {
        $order = wc_get_order( $order_id );
    }

    if ( is_a( $order, 'WC_Order' ) ) {
        $this->object                                = $order;
        $this->recipient                             = $this->object->get_billing_email();
        $this->placeholders['{order_date}']          = wc_format_datetime( $this->object->get_date_created() );
        $this->placeholders['{order_number}']        = $this->object->get_order_number();
        $this->formatted_name                        = $firstname . ' ' . $lastname;
    }

    if ( $this->is_enabled() && $this->get_recipient() ) {
        $this->send( $this->get_recipient(), $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() );
    }

    $this->restore_locale();
}

/**
 * Get email content.
 *
 * @return string
 */
public function get_content() {
    $this->sending = true;

    if ( 'plain' === $this->get_email_type() ) {
        $email_content = preg_replace( $this->plain_search, $this->plain_replace, strip_tags( $this->get_content_plain() ) );
    } else {
        $email_content = str_replace( '{full_name}', $this->formatted_name, $this->get_content_html() );
    }

    return wordwrap( $email_content, 70 );
}

Esta vez, su marcador de posición debe ser reemplazado con su dinámica $firstname . ' ' . $lastname; al usar en su plantilla (contenido):

<?php printf( get_option( 'wc_custom_email_info' ), '{full_name}' ); ?>

respuesta original

Pruebe lo siguiente en lugar de usar WC_Order método get_formatted_billing_full_name():

public function trigger( $order_id, $firstname, $lastname, $order = false ) {
    $this->setup_locale();

    if ( $order_id && ! is_a( $order, 'WC_Order' ) ) {
        $order = wc_get_order( $order_id );
    }

    if ( is_a( $order, 'WC_Order' ) ) {
        $this->object                                = $order;
        $this->recipient                             = $this->object->get_billing_email();
        $this->placeholders['{order_date}']          = wc_format_datetime( $this->object->get_date_created() );
        $this->placeholders['{order_number}']        = $this->object->get_order_number();
        $this->placeholders['{full_name}']           = $this->object->get_formatted_billing_full_name();
    }

    if ( $this->is_enabled() && $this->get_recipient() ) {
        $this->send( $this->get_recipient(), $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() );
    }

    $this->restore_locale();
}

Debería funcionar. Antes en tu código $firstname y $lastname no se definieron;

  • Gracias por su respuesta, pero no quiero mostrar el nombre del cliente. Este es el nombre de un usuario que activa el envío de correo electrónico desde un botón en mi página. Echa un vistazo a mi pregunta, publicaré una actualización allí. Lo siento por beein no exactamente.

    – Sr. Jo

    22 de noviembre de 2018 a las 23:33

  • He añadido algo de código. La variable de objeto $order está en él, pero el nombre que necesito no proviene de esta variable. Si fuera así, la solución sería simple como la que describiste en tu respuesta.

    – Sr. Jo

    22 de noviembre de 2018 a las 23:39


¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad