我想使用挂钩或筛选器来自定义电子邮件模板

时间:2020-07-05 作者:J3ck

几年前,当我没有今天的编码经验时,我雇佣了一个承包商来帮助我处理我的站点。承包商最终几乎为每封电子邮件都制作了新的模板,而且这些模板都已经过时了。当我意识到我应该在函数中进行自定义更改时,我开始对它们进行更新。php页面,所以每次WooCommerce进行更新时,我不必更新十亿个模板。

我在这里迈出了一小步,我想做的第一件事是管理新订单。php电子邮件模板。

在模板的顶部有一个部分包含此信息。

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

<?php /* translators: %s: Customer billing full name */ ?>
<p><?php printf( esc_html__( \'You’ve received the following order from %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 /* translators: %s: Customer billing full name */ ?>
<p><?php printf( esc_html__( \'You’ve received the following order from %s:\', \'woocommerce\' ), $order->get_formatted_billing_full_name() ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?></p>
    return $example;
}
不管上面的语法是什么,我只是复制/粘贴了它,让人感觉到我在寻找什么。不管我是否要修复上面的语法,它都不起作用。我仍然在电子邮件模板中看到相同的内容。

我的问题是如何使用挂钩和/或过滤器来替换电子邮件模板的某些内容?特别是;您已从UserXYZ收到以下订单:“quot;部分

谢谢

1 个回复
SO网友:mozboz

对于我提到的这个答案this article 里面有很多有用的信息

所以这里有很多关于你要做的事情的要点。

修复代码首先,在第二个代码块中,您可能没有注意到此电子邮件模板通过直接输出HTML工作,因此修复此代码的更改如下:

这是一个操作,而不是筛选器(因为模板中有“do\\u action”)

  • 在此模板中,您应该echoprintf 直接装东西,不要退回

    该模板的工作原理

    第二点是在这些模板中,模板中有“硬编码”的内容,也有“挂钩”的内容,它使用操作/过滤器从模板外部获取内容。

    在您问题的第一个代码块中,有两部分:

    1. do_action 它将调用任何为“\'woocommerce\\u email\\u header\'”添加操作的代码。
    2. 某些代码总是打印“您已收到以下订单…”在模板中,如何连接到动作,因此,可以通过删除现有动作并添加自己的动作来连接到第一部分,如:

      remove_action( \'woocommerce_email_header\', \'email_header\');
      add_action(\'woocommerce_email_header\',\'jeck_email_header\');
      function jeck_email_header( ...) {
            // print my email header
      }
      
      但是第二部分(开始的那一行<p><?php printf( esc_html__( \'You’ve received the following order from %s:\' 硬编码到管理新订单中。php模板,这意味着如果要更改该内容或功能,必须直接编辑该模板文件。(可能有一个钩子可以在构建模板后从模板中搜索和替换此字符串,但这可能比直接更改模板文件更困难)

      实际答案是

      所以,除非你真的想在内容从管理新订单中出来后找到更改内容的正确方法。php,只需将模板直接更改为您想要的,例如:

      do_action( \'woocommerce_email_header\', $email_heading, $email ); ?>
      
      <?php /* translators: %s: Customer billing full name */ ?>
      <p><?php printf( esc_html__( \'You’ve received the following order with shipping name %s:\', \'woocommerce\' ), $order->get_formatted_shipping_full_name() ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?></p>
      
      其他注意事项也值得注意的是,我不知道你的意思$foo= <?php printf(...); ?> . 我想你想要的可能是$foo = "<p>" . printf( ...) . "</p>"; 还有任何超过我的<?php ?> 将获得输出,就像echo\'d它。