Хотел бы использовать хуки или фильтры для настройки шаблонов электронной почты.

Вопрос или проблема

Несколько лет назад я нанял подрядчика, чтобы помочь мне с моим сайтом, когда у меня не было опыта в кодировании, который есть сегодня. Подрядчик в итоге сделал новые шаблоны почти для каждого письма, и все они устарели. Я начал обновлять их, когда понял, что мне следует вносить кастомные изменения в файл functions.php, чтобы каждый раз, когда WooCommerce делает обновление, мне не приходилось обновлять миллиард шаблонов.

Я начинаю с небольших шагов, и первое, что я хотел бы сделать, это для шаблона email admin-new-order.php.

В верхней части шаблона есть раздел с этой информацией.

do_action( 'woocommerce_email_header', $email_heading, $email ); ?>

<?php /* переводчики: %s: Полное имя клиента по счету */ ?>
<p><?php printf( esc_html__( 'Вы получили следующий заказ от %s:', 'woocommerce' ), $order->get_formatted_billing_full_name() ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?></p>

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


add_filter('woocommerce_email_header', 'filter_heading_new_order');
function filter_heading_new_order($example) {

    $example = <?php /* переводчики: %s: Полное имя клиента по счету */ ?>
<p><?php printf( esc_html__( 'Вы получили следующий заказ от %s:', 'woocommerce' ), $order->get_formatted_billing_full_name() ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?></p>
    return $example;
}

Не обращайте внимания на синтаксис выше, я просто скопировал/вставил это, чтобы дать представление о том, что я ищу. Независимо от того, исправлю ли я синтаксис выше, это не работает. Я все еще вижу то же самое в шаблоне email.

Мой вопрос заключается в том, как я могу использовать хук и/или фильтр, чтобы заменить часть содержимого шаблона email? В особенности “Вы получили следующий заказ от UserXYZ:”.

Спасибо!

Для этого ответа я обратился к этой статье, в которой содержится много полезной информации

Так что здесь есть несколько моментов относительно того, что вы пытаетесь сделать.

Исправления вашего кода

Во-первых, в вашем втором блоке кода, возможно, вы упустили, что этот шаблон email работает, выводя HTML напрямую, поэтому изменения для исправления этого кода таковы:

  1. Это действие, а не фильтр (потому что в шаблоне есть ‘do_action’)
  2. В этом шаблоне вам следует echo или printf непосредственно, а не возвращать его.

Тем не менее, я не уверен, что это то, что вы хотите сделать, потому что…

Как работает этот шаблон

Второй момент заключается в том, что в этих шаблонах есть вещи, которые “жестко закодированы” в шаблоне, и вещи, которые “подключены”, где используются действия/фильтры для получения содержимого извне шаблона.

В первом блоке кода в вашем вопросе есть две части:

  1. do_action, который будет вызывать все, что добавляет действие для ‘woocommerce_email_header’
  2. Некоторый код, который всегда печатает ‘Вы получили следующий заказ …’ в шаблоне

Как подключиться к действию

Итак, вы можете подключиться к первой части, удалив существующее действие и добавив свое, как:

remove_action( 'woocommerce_email_header', 'email_header');
add_action('woocommerce_email_header','jeck_email_header');
function jeck_email_header( ...) {
      // напечатать мой заголовок email
}

Но вторая часть (строка, которая начинается с <p><?php printf( esc_html__( 'Вы получили следующий заказ от %s:') жестко закодирована в шаблоне admin-new-order.php, что означает, если вы хотите изменить это содержимое или функциональность, вам придется отредактировать этот файл шаблона напрямую. (Может быть, есть хук, чтобы искать и заменять эту строку из шаблона после его построения, но это, вероятно, сложнее, чем просто изменить сам файл шаблона напрямую)

Фактический ответ это…

Поэтому, если вы действительно не хотите искать правильный хук для изменения содержимого после его появления из admin-new-order.php, просто измените сам шаблон на то, что вы хотите, например:

do_action( 'woocommerce_email_header', $email_heading, $email ); ?>

<?php /* переводчики: %s: Полное имя клиента по счету */ ?>
<p><?php printf( esc_html__( 'Вы получили следующий заказ с именем для доставки %s:', 'woocommerce' ), $order->get_formatted_shipping_full_name() ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?></p>

Другие примечания

Также стоит отметить, что я не уверен, что вы имели в виду с $foo = <?php printf(...); ?>. Я думаю, что, вероятно, вы хотели бы $foo = "<p>" . printf( ...) . "</p>"; И все, что вне <?php ?>, будет выводиться так же, как если бы вы использовали echo.

Полезные хуки

  1. woocommerce_email_header ($email_heading, $email)
  2. woocommerce_email_order_details ($order, $sent_to_admin, $plain_text, $email)
  3. woocommerce_email_before_order_table ($order, $sent_to_admin, $plain_text, $email)
  4. woocommerce_order_item_meta_start ($item_id, $item, $order, $plain_text)
  5. woocommerce_order_item_meta_end ($item_id, $item, $order, $plain_text)
  6. woocommerce_email_after_order_table ($order, $sent_to_admin, $plain_text, $email)
  7. woocommerce_email_order_meta ($order, $sent_to_admin, $plain_text, $email)
  8. woocommerce_email_customer_details ($order, $sent_to_admin, $plain_text, $email)
  9. woocommerce_email_footer ($email)

.

Ответ или решение

Если вы хотите настроить шаблоны email на своем сайте WooCommerce, важно понять, как использовать хуки и фильтры для внесения изменений без необходимости редактировать сами файлы шаблонов. Это позволит вам сохранять свои изменения при обновлениях WooCommerce. Рассмотрим наиболее подходящий подход для вашей задачи.

Анализ текущей задачи

Вы хотите модифицировать email-шаблон admin-new-order.php, заменив отображаемое имя клиента с имени для выставления счета на имя для доставки. В шаблоне уже имеется секция с do_action, что позволяет вам подсоединиться к нужному месту через хуки.

Использование хуков для кастомизации

Для изменения содержимого email-шаблона в WooCommerce целесообразно использовать хуки. Однако, в вашем конкретном случае строка, которую вы хотите изменить, является жестко закодированной и в шаблоне нет подходящего фильтра. Тем не менее, есть выходы:

  1. Сначала создайте собственную функцию для отображения необходимой информации:
  2. function custom_email_header($email_heading, $email) {
        // Выводим новый заголовок письма
        echo <p><?php printf( __('Вы получили заказ от %s:', 'woocommerce'), $email->get_order()->get_formatted_shipping_full_name() ); ?></p>;
    }
    
  3. Замените текущий хук на ваш собственный:
  4. add_action('init', 'replace_email_header_hook');
    
    function replace_email_header_hook() {
        remove_action('woocommerce_email_header', 'woocommerce_email_header_action');
        add_action('woocommerce_email_header', 'custom_email_header', 10, 2);
    }
    

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

Другие аспекты кастомизации

Если вы хотите внести более глобальные изменения в шаблоны, стоит учесть использование дочерних тем и добавить кастомные шаблоны в свою тему, чтобы упростить процесс при будущих обновлениях.

Подведение итогов

Использование хуков и фильтров значительно упрощает процесс кастомизации в WooCommerce. Они предоставляют гибкость и кросс-совместимость при обновлениях. Убедитесь, что вы располагаете необходимыми знаниями и доступом к документации, чтобы максимально эффективно использовать Вукоммерс API.

Не забудьте протестировать ваши изменения на тестовой среде прежде чем выкатывать на продакшен, чтобы избежать ошибок и нежелательных эффектов.

Оцените материал
Добавить комментарий

Капча загружается...