获取Woocommerce自定义电子邮件内容的自定义电子邮件占位符值

时间:2018-11-22 23:06:53

标签: php wordpress woocommerce placeholder email-notifications

我已经在WooCommerce中创建了自己的电子邮件课程。因为我的电子邮件内容中需要一个自定义参数,所以我在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();
}

在他完成之后,我在内容PHP文件中完成了此操作:

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

在选项中,我写了%s,以便可以将全名添加到内容中。但是可悲的是我得到的是占位符的名称,而不是内容:

  

Blaaaaaaa {full_name} blaaaa

但是我需要这里:

  

Blaaaaaaa乔·马丁blaaaa

更新

这里的名称不是订单中的客户名称。这是我通过按钮触发的do_action传递的名称。因此,当我页面上的某人单击此按钮时,我正在获取其用户ID并从单击该按钮的用户那里获取名称。这是我使用的自定义电子邮件触发器:

$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 );

然后我在电子邮件课程中这样做:

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

此后,您可以返回顶部触发功能。

1 个答案:

答案 0 :(得分:1)

已更新

  

电子邮件中的占位符仅适用于Woocommerce中的电子邮件主题

因此,您尝试执行的操作无法通过这种方式进行。

相反,您将需要对trigger()函数进行一些更改,并在类中添加另一个方法:

/**
 * 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 );
}

这次,在模板(内容)中使用占位符时,应将其替换为动态$firstname . ' ' . $lastname;

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

原始答案

请尝试使用WC_Order方法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();
}

应该可以。之前,您的代码$firstname$lastname未定义;