Изменение заголовка писем WooCommerce с помощью собственного плагина

9 нояб. 2017 г., 14:14:51
Просмотры: 15.6K
Голосов: 1

Я хочу заменить стандартный шаблон заголовка писем WooCommerce на новый, чтобы можно было добавлять условия в шаблон заголовка для получения значений из админки (например, для изменения цвета заголовка на основе пользовательских настроек). Для этого я создал файл плагина.

Я следовал нескольким руководствам, но получал только ошибки. У меня есть класс со следующим кодом:

public function __construct(){
    // Добавляем действие для перехвата email в WooCommerce
    add_action('woocommerce_email',array($this,'woocommerce_email'));
}

Теперь я добавил код для удаления стандартного хука заголовка

public function woocommerce_email($mailer){
    // Удаляем стандартное действие для заголовка письма
    remove_action('woocommerce_header',array($mailer,'email_header'));
    // Добавляем собственное действие для заголовка
    add_action('woocommerce_header',array($this,'email_header'));

Теперь вызываем шаблон

public function email_header() {          
    // Загружаем кастомный шаблон заголовка письма
    wc_get_template( 'emails/email-header.php');
}

Я не передаю никаких параметров в файл шаблона. Просто хочу убедиться, что используется мой шаблон. Также я предполагаю, что $mailer является частью класса WooCommerce. Буду благодарен за любую помощь.

Обратите внимание, что это функциональность плагина, поэтому мне не интересна замена стандартных шаблонов писем WooCommerce.

4
Комментарии

вам не нужно отключать и подключать заново. просто создайте файл в директории вашей темы woocommerce/emails/email-header.php, и оригинальная отправка email будет использовать его

mmm mmm
9 нояб. 2017 г. 15:10:10

Но я пытаюсь создать плагин, а не разрабатывать тему. Этот плагин будет использоваться для всех тем. Поэтому вместо использования шаблонов email из плагина woocommerce, он должен брать кастомные шаблоны, созданные в директории моего плагина

melvin melvin
9 нояб. 2017 г. 18:45:46

Тогда в методе email_header вашего класса просто выводите файл из вашего плагина с помощью require, например

mmm mmm
9 нояб. 2017 г. 19:18:17

это не работает

melvin melvin
9 нояб. 2017 г. 19:44:49
Все ответы на вопрос 2
14

Вам нужно удалить действие woocommerce_email_header

remove_action( 'woocommerce_email_header', 'email_header');

Которое было зарегистрировано в

wp-content\plugins\woocommerce\includes\class-wc-emails.php

Затем добавить свое собственное действие

add_action('woocommerce_email_header','your_function_name');

Ваша функция должна выводить HTML

По умолчанию в шаблоне заголовка используется следующий код:

<?php
/**
 * Шапка email
 *
 * Этот шаблон может быть переопределен путем копирования в yourtheme/woocommerce/emails/email-header.php.
 *
 * ОДНАКО, иногда WooCommerce потребуется обновить файлы шаблонов, и вам
 * (разработчику темы) нужно будет скопировать новые файлы в вашу тему, чтобы
 * сохранить совместимость. Мы стараемся делать это как можно реже, но это случается.
 * Когда это происходит, версия файла шаблона будет обновлена, а в readme
 * будет перечислены важные изменения.
 *
 * @see     https://docs.woocommerce.com/document/template-structure/
 * @author  WooThemes
 * @package WooCommerce/Templates/Emails
 * @version 2.4.0
 */

if ( ! defined( 'ABSPATH' ) ) {
    exit; // Выход, если доступ осуществляется напрямую
}

?>
<!DOCTYPE html>
<html <?php language_attributes(); ?>>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=<?php bloginfo( 'charset' ); ?>" />
        <title><?php echo get_bloginfo( 'name', 'display' ); ?></title>
    </head>
    <body <?php echo is_rtl() ? 'rightmargin' : 'leftmargin'; ?>="0" marginwidth="0" topmargin="0" marginheight="0" offset="0">
        <div id="wrapper" dir="<?php echo is_rtl() ? 'rtl' : 'ltr'?>">
            <table border="0" cellpadding="0" cellspacing="0" height="100%" width="100%">
                <tr>
                    <td align="center" valign="top">
                        <div id="template_header_image">
                            <?php
                                if ( $img = get_option( 'woocommerce_email_header_image' ) ) {
                                    echo '<p style="margin-top:0;"><img src="' . esc_url( $img ) . '" alt="' . get_bloginfo( 'name', 'display' ) . '" /></p>';
                                }
                            ?>
                        </div>
                        <table border="0" cellpadding="0" cellspacing="0" width="600" id="template_container">
                            <tr>
                                <td align="center" valign="top">
                                    <!-- Шапка -->
                                    <table border="0" cellpadding="0" cellspacing="0" width="600" id="template_header">
                                        <tr>
                                            <td id="header_wrapper">
                                                <h1><?php echo $email_heading; ?></h1>
                                            </td>
                                        </tr>
                                    </table>
                                    <!-- Конец шапки -->
                                </td>
                            </tr>
                            <tr>
                                <td align="center" valign="top">
                                    <!-- Тело письма -->
                                    <table border="0" cellpadding="0" cellspacing="0" width="600" id="template_body">
                                        <tr>
                                            <td valign="top" id="body_content">
                                                <!-- Контент -->
                                                <table border="0" cellpadding="20" cellspacing="0" width="100%">
                                                    <tr>
                                                        <td valign="top">
                                                            <div id="body_content_inner">
10 нояб. 2017 г. 07:56:38
Комментарии

Но это не показывает мне новый контент.

melvin melvin
10 нояб. 2017 г. 08:22:03

ваша функция должна выводить код

Malay Solanki Malay Solanki
10 нояб. 2017 г. 08:35:54

Он по-прежнему использует заголовок по умолчанию WooCommerce

melvin melvin
10 нояб. 2017 г. 08:36:29

Где ты пишешь код? В теме?

Malay Solanki Malay Solanki
10 нояб. 2017 г. 08:38:27

Файл плагина. Я создал файл плагина

melvin melvin
10 нояб. 2017 г. 09:00:07

Тогда должно работать

Malay Solanki Malay Solanki
10 нояб. 2017 г. 09:05:18

Код выглядит отлично. Дайте мне проверить свой код еще раз.

melvin melvin
10 нояб. 2017 г. 09:20:48

Если мой файл шаблона заголовка email содержит только echo, будет ли WooCommerce использовать шаблон по умолчанию? @malaysolanki

melvin melvin
10 нояб. 2017 г. 09:37:36

да, должно работать

Malay Solanki Malay Solanki
10 нояб. 2017 г. 10:08:11

Спасибо, брат. Работает. Ошибка была в названии хука действия. С уважением, @Malaysolanki

melvin melvin
10 нояб. 2017 г. 11:07:22

Ты не знаешь, почему изображение не отображается в заголовке письма? Тег img виден при инспектировании в браузере

melvin melvin
16 нояб. 2017 г. 14:42:18

Укажи фиксированные высоту и ширину inline

Malay Solanki Malay Solanki
17 нояб. 2017 г. 06:31:19

Давай попробую и дам тебе знать. Ты лучший помощник. Спасибо за твою готовность помочь @Malay

melvin melvin
20 нояб. 2017 г. 05:55:16

Это работает. Большое спасибо. Так как у меня низкая репутация, я не могу отметить этот ответ. Я сделаю это, когда у меня будет достаточная репутация @malaysolanki

melvin melvin
20 нояб. 2017 г. 13:06:32
Показать остальные 9 комментариев
0

Для тех, кто делает это из своей темы.

  1. Скопируйте содержимое шаблона электронного письма, который можно найти здесь:

https://github.com/woocommerce/woocommerce/blob/master/templates/emails/email-header.php

  1. Вставьте содержимое файла из пункта 1 по следующему пути:

yourtheme/woocommerce/emails/email-header.php

  1. Опционально, если вам нужен объект заказа для получения данных, добавьте следующее в functions.php:
    add_action( 'woocommerce_email_header', 'email_header_before', 1, 2 );
    function email_header_before( $email_heading, $email ){
        $GLOBALS['email'] = $email;
    }
  1. Опционально, затем в созданном вами шаблонном файле используйте это следующим образом:
// Вызываем глобальный объект WC_Email
global $email;

// Получаем экземпляр объекта WC_Order
$order = $email->object;

Шаги 3 и 4 взяты из этого ответа:

https://stackoverflow.com/questions/49739353/get-the-order-object-in-woocommerce-email-header-template

автор @LoicTheAztec

19 июн. 2020 г. 00:36:23