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

2024-03-23

我在 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

但我这里需要这个:

布拉啊啊啊啊乔·马丁布拉啊啊

Update

此处的名称不是订单中的客户名称。这是我通过的一个名字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 );

之后您可以返回到顶部触发功能。


Updated

电子邮件中的占位符仅适用于 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 method get_formatted_billing_full_name() https://docs.woocommerce.com/wc-apidocs/source-class-WC_Order.html#802-810:

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 and $lastname没有定义;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 将日期格式(在数据库或输出中)更改为 dd/mm/yyyy - PHP MySQL

    MySQL 将日期存储在我的数据库中 默认情况下 为 YYYY MM DD 我的日期的字段类型是 DATE 我不需要任何时间存储 有没有一种简单的方法可以默认更改它到 DD MM YYYY 我在两个不同的表中调用不同的日期 并且在我的任何代
  • PHP_CodeSniffer - 显示失败的嗅探

    PHP CodeSniffer 中是否有设置来显示失败的嗅探 我将输出与我们的编码标准进行比较 并且一一使用很难破译哪个测试失败 看看我们可能想忽略哪个 如果有一种简单的方法来显示故障嗅探 那么我可以更轻松 更快地完成配置 您可以使用 s
  • 从 PHP 执行 SQL Server 存储过程

    我尝试从 PHP 调用 SQL Server 存储过程 这是我的存储过程 CREATE procedure dbo tester id NVARCHAR MAX AS BEGIN DECLARE tab TABLE myxml XML IN
  • 如何自定义 Zend_Form 正则表达式错误消息?

    我有以下代码 postcode form gt createElement text postcode postcode gt setLabel Post code postcode gt addValidator regex false
  • 使用 Gravity Forms 和 Javascript 计算一个输入字段的长度并在另一个输入字段中打印它

    我正在使用 WordPress 的重力形式 我试图弄清楚如何计算用户在我的一个输入框中键入的字符的长度 并将该数字以相同的形式打印到另一个输入框 我认为这可以用 Javascript 来完成 但我是一个完全的新手 这是我非常淡化的努力 只是
  • 从 stdin 读取后,PHP 在每行上给出尾随“=”

    stdin 的内容因自动换行和尾随 而被损坏 这显然破坏了我需要发布的 URL 我需要从电子邮件中提取 URL 链接 然后发布该 URL 因此 我使用我在互联网上看到的标准代码片段将电子邮件传输到 cpanel 中的 php 脚本 fd f
  • Magento 1.8 - 高级搜索不起作用

    我在最新版本的 magento 中发现了一个奇怪的错误 高级搜索工具无法正常工作 我做了什么 安装 magento 的新副本 在管理页面添加了一个名为 测试 1 的产品 重新索引全部 清除所有缓存 At the frontend page
  • CodeIgniter Active Record - 组 OR 语句

    这是我的问题 MySQL 或 条件 https stackoverflow com questions 8604380 mysql or condition 解决方案是将 OR 语句分组 但我正在使用 CodeIgniters Active
  • PHP 使用 use 关键字导入类

    到目前为止我还没有使用PHPuse词 但现在必须 索引 php内容 require once Classes MainClass php obj new Main echo obj gt test 类 MainClass php
  • 如何设置外键id的id #sf2 #doctrine2

    我正在尝试手动为对象设置外键 id 但没有找到如何执行此操作 class Item ORM ManyToOne targetEntity MyBundle Entity ItemType inversedBy itemTypes ORM J
  • PHP 是否有与 Java 的 RequestDispatcher.forward 等效的功能?

    在 Java 中我可以编写一个非常基本的 JSPindex jsp像这样 这样做的效果是用户请求index jsp 或者只是包含目录 假设index jsp是目录的默认文档 将会看到home action没有浏览器重定向 即 forward
  • 表单未使用 AJAX 提交

    再次更新 如果有人关心的话 我之前发布的解决方案由于某种原因停止工作 我在 ajax 请求中包含了 beforeSend 并将验证表单的 js 部分粘贴到其中 现在就像一个魅力 form on submit function e e pre
  • 使用 shell_exec Powershell 输出到 PHP 变量

    我有一个 powershell 脚本 它输出视频文件持续时间 运行这个脚本给了我预期的结果 Folder C my path to folder File sample1 1280 720 mp4 LengthColumn 27 objSh
  • Symfony 4.1 组件 - 依赖注入问题

    我正在用 PHP 重构旧应用程序 我正在尝试使用 Symfony 依赖注入组件将服务注入控制器 或其他服务 但我不知道如何实现这一点 因为 symphony 文档比框架组件更适合使用框架 我已经有了自己的内核 包含所有服务和控制器的容器 控
  • 如何在 Api-Platform 中按链接属性过滤结果?

    我有一个User实体和一个Organisation实体 存在关系ManyToOne之间Booking and User ORM ManyToOne targetEntity App Entity User inversedBy bookin
  • 使用 PHP 将子项添加到 XML 文件

    添加子项时 抛出此错误 无法添加孩子 父级不是 XML 树的永久成员 我无法解决这个问题 这是我的代码 if visited FIRST xml new SimpleXMLElement
  • CodeIgniter:使用多维 POST 数据验证表单

    所以框架是CodeIgniter 2 0 2 我有一个表单 其中包含与数据库中的行相对应的字段组 字段名称的格式为 opt 0 foo opt 0 bar opt 1 foo opt 1 bar etc 索引 1 2等 并不对应于数据库中的
  • 日期函数的奇怪行为

    我今天在 StackOverflow 上遇到了这个问题 但没有得到答案 我的问题是 echo date Y m d strtotime 2012 september 09 output 2012 09 01 echo date Y m d
  • 通过“SELECT”命令选择每组的前两条记录的最佳方法是什么?

    例如我有下表 id group data 1 1 aaa 2 1 aaa 3 2 aaa 4 2 aaa 5 2 aaa 6 3 aaa 7 3 aaa 8 3 aaa 通过 SELECT 命令选择每组的前两条记录的最佳方法是什么 如果没有
  • 在 Laravel 视图中使用 CSS?

    我刚刚开始学习 Laravel 并且可以掌握控制器和路由的基础知识 我的操作系统是 Mac OS X Lion 它位于 MAMP 服务器上 我的routes php代码 Route get function return View make

随机推荐

  • 如何配置 jdee `find-class-source-file` 以与 Cassandra 源树一起使用?

    我正在尝试为我即将开始的 Java 项目设置 Emacs JDEE 但我无法让 JDEE 正常工作 我想要解决的第一个问题是能够跳转到给定类名的源文件 我正在使用卡桑德拉 http cassandra apache orgsource 作为
  • Jquery 点击图像时切换

    我想了解 jquery 切换是如何工作的 我想切换到下一个锚点plr anchor单击带有类的图像go down 数据是使用地图填充的 Jquery代码 go down on click function e plr anchor next
  • C# 在txt文件中搜索字符串

    我想在 txt 文件中找到一个字符串 如果字符串比较 它应该继续读取行 直到我用作参数的另一个字符串 Example CustomerEN search for this string some text which has details
  • 使用 DirectShow 捕获帧并使用 OpenCV 进行处理

    我为视频到图像捕获制作了两种不同的解决方案 并且想知道是否可以将两个世界的优点结合在一起 我目前正在使用 DirectShow 加载 AVI 文件并捕获图像 然而 DirectShow 缺乏图像处理功能并且需要制作额外的滤镜 这让我陷入了困
  • 将数据从一个数据表复制到另一个具有不同结构的数据表的最佳方法

    我正在将数据从 DataTable 复制到另一个具有结构的 DataTable 我必须在循环中对列号进行硬编码 并将数据复制到对象数组中 实现这一目标的最佳方法是什么 IEnumerable
  • 重置张量流流指标的变量

    我有很多流媒体指标 tf metrics accuracy and custom http vict0rsch github io 2018 06 06 tensorflow streaming multilabel f1 流媒体micro
  • 删除嵌入的 YouTube 视频上的注释

    我发现您可以通过添加参数来禁用嵌入式 YouTube 视频上的注释 iv load policy 3到嵌入代码中的 url 例子
  • 带有 ref 对象参数的方法

    嗨 我必须调用具有此签名的方法 int MethodName ref object vIndexKey 如果我尝试用 String c 690 MethodName ref object c 这不起作用 我能怎么做 thanks 你需要这样
  • Google Maps API 3 - 在屏幕上显示所有标记,但保留中心点

    这非常类似于这个问题 https stackoverflow com questions 2818984 google map api v3 center zoom on displayed markers 我想确保所有标记都以当前缩放级别
  • 展开操作视图时导航抽屉图标(汉堡包和箭头)动画

    我在用着AppCompat and Toolbar 我确保当导航抽屉图标从汉堡包转变为箭头时会有动画 反之亦然 我使用以下技术https stackoverflow com a 26469738 72437 https stackoverf
  • 使用boost创建线程池

    是否可以使用boost的线程创建线程池 我正在查看 boost 的库 但找不到线程池管理器 或类似的东西 有办法做到吗 tnx 我知道答案已被接受 如果您现在需要这个 并且您懒得编写自己的线程池 您可以尝试使用带有并发提示的 boost a
  • Phoenix 频道:向特定客户端发送推送

    您好 我正在尝试使用 Elixir phoenix 重新实现 Whatsapp 功能 我在计算以下内容时遇到问题 如果聊天室中的所有人都收到了消息 我想向消息所有者发送 已收到 状态 以便他可以显示双勾号 但是 如何向某一特定客户端进行广播
  • 如何使用 .yml 文件更新现有 Conda 环境

    如何使用另一个 yml 文件更新预先存在的 conda 环境 当处理具有多个需求文件的项目时 这非常有用 即base yml local yml production yml etc 例如 下面是一个base yml文件有 conda fo
  • Gremlin 删除所有顶点

    我知道如何在 Gremlin 中通过 id 删除顶点 但现在我需要清理数据库 如何删除多个顶点 删除1v是这样的 ver g v 1 g removeVertex ver 我的意思是类似SQL的东西TRUNCATE 如何在不删除类的情况下删
  • 使用 pd.read_html 解析 html 表,其中单元格本身包含完整表

    我需要从 html 解析一个表 该表在较大的表中嵌套有其他表 如下所示pd read html 每个嵌套表都会被解析 然后作为行 插入 连接 我希望将这些嵌套表分别解析为自己的表pd DataFrames并将插入的对象作为相应列的值 如果这
  • 我的视频没有关键帧,怎么可能?

    当我在视频上运行以下行时 它仅输出 P 帧和 B 帧 没有 I 帧 ffprobe select streams v show frames show entries frame pict type of csv 00000 MTS 视频怎
  • EntityConnection 和打开的 SqlConnection

    我有一个关于采用 CodeFirst 方法的 EntityFramework 的问题 基于 EntityConnection 源代码和文档 我无法使用已打开的 SqlConnection 创建它 它要求应该关闭 我们有一些不同的数据库数据层
  • Gradle 项目刷新失败。安卓工作室

    尝试在 Android Studio 上运行我的应用程序时出现此错误 有谁知道原因可能是什么 谢谢 Gradle MyApp refresh failed Error Cannot locate factory for objects of
  • StackOverflowException 加载 XsltCompiledTransform

    加载 XslCompiledTransform 时 我遇到一些大型 xslt 崩溃 iis StackOverflowException 而旧的 已弃用的 XslTransform 工作正常 大模板是否存在一些已知问题 奇怪的是 相同的 X
  • 获取 Woocommerce 自定义电子邮件内容的自定义电子邮件占位符值

    我在 WooCommerce 中创建了自己的电子邮件课程 因为我的电子邮件内容中需要一个自定义参数 所以我已将带有此自定义参数的占位符添加到 wc 电子邮件触发函数中 public function trigger order id fir