Получите настраиваемое значение электронного заполнителя для настраиваемого содержимого электронной почты Woocommerce. - PullRequest
0 голосов
/ 23 ноября 2018

Я создал свой собственный класс электронной почты в 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 Joe Martin blaaaa

Обновление

Имя здесь не является именем клиента из заказа.Это имя, которое я передаю через do_action, которое я нажимаю на кнопку.Поэтому, когда кто-то на моей странице нажимает эту кнопку, я выбираю его идентификатор пользователя и получаю имя от пользователя, который нажал кнопку.Это пользовательский триггер электронной почты, который я использую:

$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 голосов
/ 23 ноября 2018

Обновлено

Заполнители в электронной почте предназначены только для темы электронной почты в 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 не определялись;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...