WooCommerce 4.0 电子邮件、管理订单和感谢页面上的自定义结账和 ACF 字段值

2023-12-29

我很难将自定义字段值打印到电子邮件通知、订单管理和感谢页面。我浏览了 StackOverflow,尝试了我找到的每一个答案,但不幸的是不起作用,我无法找出问题所在: 我试图传递附加结账字段的值,它只打印带有空白值的强标签,并且在电子邮件中没有显示任何内容,这是迄今为止我的代码:

//new pickup location checkout field
add_action( 'woocommerce_before_order_notes', 'pickup_location_custom_checkout_field' );

function pickup_location_custom_checkout_field( $checkout ) {

    echo '<div><h3>' . __('Pick-up location') . '</h3>';

    woocommerce_form_field( 'pick_up_location', array(
        'type'          => 'text',
        'class'         => array('notes'),
        'label'         => __('<span style="color:red">[IMPORTANT]</span> Where should we meet you?'),
        'placeholder'   => __('Please enter your accomodation name or the nearest pick-up point if not accessible by car'),
        'required'     => true,
        ), $checkout->get_value( 'pick_up_location' ));

    echo '</div>';

}

// Save the pickup location data to the order meta
add_action( 'woocommerce_checkout_create_order', 'pickup_location_checkout_field_update_order_meta' );
function pickup_location_checkout_field_update_order_meta( $order_id ) {
    if (!empty($_POST['pick_up_location'])) {
        update_post_meta( $order_id, 'Pick-up location', sanitize_text_field( $_POST['pick_up_location']));
    }
}

// Display 'pickup location' on the order edit page (backend)
add_action( 'woocommerce_admin_order_data_after_shipping_address', 'pickup_location_checkout_field_order_page', 10, 1 );
function pickup_location_checkout_field_order_page($order){
    global $post_id;
    $order = new WC_Order( $post_id );
    echo '<p><strong style="color:red">'.__('Pickup Location').':</strong> ' . get_post_meta($order->get_id(), '_pick_up_location', true ) . '</p>';

// Display 'pickup location' in "Order received" and "Order view" pages (frontend)
add_action( 'woocommerce_order_details_after_order_table', 'display_client_pickup_data_in_orders', 10 );
function display_client_pickup_data_in_orders( $order ) {
    global $post_id;
    $order = new WC_Order( $post_id );
    echo '<p><strong style="color:red">'.__('Pickup Location').':</strong> ' . get_post_meta($order->get_id(), '_pick_up_location', true ) . '</p>';
}

// Display 'pickup location data' in Email notifications
add_filter( 'woocommerce_email_order_meta_fields', 'display_client_pickup_data_in_emails', 10, 3 );

function display_client_pickup_data_in_emails( $fields, $sent_to_admin, $order ) {
    $fields['Pickup Location'] = array(
        'label' => __( 'Pickup Location' ),
        'value' => get_post_meta( $order->get_id(), 'pick_up_location', true ),
    );
    return $fields;
}

无论我尝试什么,代码都只打印标签,而没有结账表单中的任何值。 我知道这个问题已经被问过很多次了,但我尝试了每一个答案超过 6 天,但没有任何运气。我还需要提及的是,我在这个项目中使用了 Woocommerce Bookings。 感谢您的帮助


[更新:]在购物车、管理订单、客户订单、结账和电子邮件中保存并显示 ACF 字段。 感谢@7uc1f3r的详细解释,他的回答帮助我以类似的方式显示ACF字段,它也是基于这个答案 https://stackoverflow.com/questions/60678704/woocommerce-4-0-custom-checkout-acf-field-value-on-email-admin-order-and-tha来自@LoicTheAztec。

在 ATC 上方的产品页面上显示自定义字段:

// Displaying Pick-up time custom field value in single product page
add_action( 'woocommerce_before_add_to_cart_button', 'add_pickup_time_custom_field', 0 );
function add_pickup_time_custom_field() {
    global $product;
    //(compatibility with WC +3) 
    $product_id = method_exists( $product, 'get_id' ) ? $product->get_id() : $product->id;

    echo "<div class='pickup-time-atc'>";
    echo "<span>Pick-up time: </span>";
    echo get_field( 'pick_up_time', $product_id );
    echo "</div>";

    return true;
}

在单个产品页面中显示自定义字段值 https://i.stack.imgur.com/kNQd6.png

将取货时间自定义字段保存到购物车和会话中

// Saving Pick-up time custom field into cart and session
add_filter( 'woocommerce_add_cart_item_data', 'save_pickup_time_custom_field', 10, 2 );
function save_pickup_time_custom_field( $cart_item_data, $product_id ) {
    $custom_field_value = get_field( 'pick_up_time', $product_id, true );
    if( !empty( $custom_field_value ) ) 
    {
        $cart_item_data['pick_up_time'] = $custom_field_value;
    }
    return $cart_item_data;
}

渲染购物车和结帐上的提货时间自定义字段元

// Render Pick-up time meta on cart and checkout
add_filter( 'woocommerce_get_item_data', 'render_pickuptime_meta_on_cart_and_checkout', 10, 2 );
function render_pickuptime_meta_on_cart_and_checkout( $cart_data, $cart_item ) {
    $custom_items = array();
    // Woo 2.4.2 updates
    if( !empty( $cart_data ) ) {
        $custom_items = $cart_data;
    }
    if( isset( $cart_item['pick_up_time'] ) ) {
        $custom_items[] = array( "name" => "Pickup time", "value" => $cart_item['pick_up_time'] );
    }
    return $custom_items;
}

在购物车和结帐上渲染自定义字段元 https://i.stack.imgur.com/8ni1b.png

添加自定义字段元以订购管理详细信息

// Add pickup time custom field meta to order admin
add_action( 'woocommerce_checkout_create_order_line_item', 'pickuptime_checkout_create_order_line_item', 10, 4 );
function pickuptime_checkout_create_order_line_item( $item, $cart_item_key, $values, $order ) {
  if( isset( $values['pick_up_time'] ) ) {
    $item->add_meta_data(
      __( 'Pickup time' ),
      $values['pick_up_time'],
      true
    );
  }
}

添加自定义字段元以订购管理详细信息 https://i.stack.imgur.com/MlTeZ.png

将取件时间自定义字段元添加到电子邮件

// Add pickup time custom field meta to emails
add_filter( 'woocommerce_order_item_name', 'pickuptime_order_item_emails', 10, 2 );
function pickuptime_order_item_emails( $product_name, $item ) {
  if( isset( $item['pick_up_time'] ) ) {
    $product_name .= sprintf(
      '<ul"><li>%s: %s</li></ul>',
      __( '<span style="color:red !important">Pickup time</span>' ),
      esc_html( $item['pick_up_time'] )
     ); 
  }
  return $product_name;
}

将取件时间自定义字段元添加到电子邮件 https://i.stack.imgur.com/V8aY2.png

如果您发现任何错误或改进方法,请评论, 谢谢。

Woocommerce 4.0.0 和 Wordpress 5.3.2


一步步检查你的代码

update_post_meta( $order_id, 'Pick-up location', sanitize_text_field( $_POST['pick_up_location']));
echo '<p><strong style="color:red">'.__('Pickup Location').':</strong> ' . get_post_meta($order->get_id(), '_pick_up_location', true ) . '</p>';
'value' => get_post_meta( $order->get_id(), 'pick_up_location', true ),

You use Pick-up location, _pick_up_location & pick_up_location as meta_key而这应该是相同值的 3 倍。

您还错过了结束标签pickup_location_checkout_field_order_page功能。

您还对某些钩子等使用了错误的参数。

试试这个

//new pickup location checkout field
add_action( 'woocommerce_before_order_notes', 'pickup_location_custom_checkout_field' );
function pickup_location_custom_checkout_field( $checkout ) {
    echo '<div><h3>' . __('Pick-up location') . '</h3>';

    woocommerce_form_field( 'pick_up_location', array(
        'type'          => 'text',
        'class'         => array('notes'),
        'label'         => __('<span style="color:red">[IMPORTANT]</span> Where should we meet you?'),
        'placeholder'   => __('Please enter your accomodation name or the nearest pick-up point if not accessible by car'),
        'required'     => true,
        ), $checkout->get_value( 'pick_up_location' ));

    echo '</div>';
}

// Save the pickup location data to the order meta
add_action( 'woocommerce_checkout_create_order', 'pickup_location_checkout_field_update_order_meta', 10, 2 );
function pickup_location_checkout_field_update_order_meta( $order, $data ) {    
    if ( !empty( $_POST['pick_up_location']) ) {
        $order->update_meta_data( '_pick_up_location', sanitize_text_field( $_POST['pick_up_location'] ) ); // Order meta data
    }
}

// Display 'pickup location' on the order edit page (backend)
add_action( 'woocommerce_admin_order_data_after_shipping_address', 'pickup_location_checkout_field_order_page', 10, 1 );
function pickup_location_checkout_field_order_page( $order ) {
    $pick_up_location = $order->get_meta( '_pick_up_location' );
    echo '<p><strong style="color:red">'.__('Pickup Location').':</strong> ' . $pick_up_location . '</p>';
}

// Display 'pickup location' in "Order received" and "Order view" pages (frontend)
add_action( 'woocommerce_order_details_after_order_table', 'display_client_pickup_data_in_orders', 10 );
function display_client_pickup_data_in_orders( $order ) {
    $pick_up_location = $order->get_meta( '_pick_up_location' );
    echo '<p><strong style="color:red">'.__('Pickup Location').':</strong> ' . $pick_up_location . '</p>';
}

// Display 'pickup location data' in Email notifications
add_filter( 'woocommerce_email_order_meta_fields', 'display_client_pickup_data_in_emails', 10, 3 );
function display_client_pickup_data_in_emails( $fields, $sent_to_admin, $order ) {
    $fields['Pickup Location'] = array(
        'label' => __( 'Pickup Location' ),
        'value' => $order->get_meta( '_pick_up_location' ),
    );
    return $fields;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WooCommerce 4.0 电子邮件、管理订单和感谢页面上的自定义结账和 ACF 字段值 的相关文章

随机推荐

  • 如何在光学测距仪中测量图像重合度

    我有几个 USB 网络摄像头 固定焦距 设置作为一个简单的立体测距仪 https en wikipedia org wiki Coincidence rangefinder 间隔 N 毫米 每个向中心线旋转 M 度 并且我已经校准相机 ht
  • 将 Rails 3 转换为 Rails 2:带有块的助手

    在 Rails 3 中 我使用以下助手来获得偶数 奇数颜色的表格 def bicolor table collection classes block string even 0 for item in collection string
  • 通过 UpdatePanel 异步回发后重新加载外部 javascript

    我的页面上有一个外部 javascript 例如就像是 和一个 UpdatePanel 某处 该脚本写入一些内容 并在 js 文件中的匿名 JavaScript 函数中执行此操作 也就是说 脚本中有这样的内容 function docume
  • 将文本文件过滤为新的文本文件

    很抱歉这里提出了一个虚拟问题 在 Windows 下 我希望能够将一个 txt 文件过滤为一个新文件 过滤包含特定字符串的所有行 我知道这很可能是一个非常简单的问题 但非常感谢您的一些指点 Use the findstr命令 findstr
  • find 中的谓词分组

    这部分 name txt o name html 让我在代码中感到困惑 find HOME name txt o name html print0 xargs 0 grep li vpn 有人可以解释一下括号和 o 吗 o 是命令还是参数
  • 如何检查url是图片还是视频?

    I fetchAPI 响应并解析 swift 中的选取 url 但我需要检查的是image url or video url 如果我获得图像网址 则显示图像 如果获得视频网址 则播放视频 if let url postMedia url n
  • 我是否应该根据协议前缀来区分 OpenID? http 与 https

    我已经为我的 ASP NET 应用程序实现了简单的 OpenID 支持DotNetOpenAuth http www dotnetopenauth net 然而我最近意识到实施正在治疗http johndoe example com 作为一
  • 如何通过部署管理器部署Google App Engine应用程序?是否可以做到

    我正在将所有应用程序部署到 Appengine 我在开发者控制台中找到了一个 开发 工具 并将其配置为同步我的 Appengine 项目文件 我利用在线编辑功能通过开发工具编辑appengine项目文件 我进行了更改并提交了代码 所以我想知
  • Apache/xampp 命令行启动错误:AH00436:没有安装名为“Apache2.4”的服务

    我在 Windows 7 Pro 上使用 Xampp 发行版安装了 Apache 服务器 Apache 从 XAMPP 控制面板启动正常 但我希望能够从命令提示符控制它 当我尝试从命令提示符启动它时 出现以下错误 C gt httpd k
  • 如何通过 Nginx 设置 SPDY 协议?

    我有一个 Rails 应用程序 想要设置 google SPDY 协议支持 但是在安装带有 SPDY 补丁的 Nginx 并在虚拟主机中启用 spdy 后 它不允许我重新启动 nginx 而是抛出以下错误 Restarting nginx
  • 使用 underscore.js 将数组值分组为每个数组中的 3 个对象

    下面是一个数组 我必须将每个对象中的 3 个值分组 var xyz name hi hello when test then that now 输出应位于数组下方 hi hello when test then that now 纯 Jav
  • 将两个具有不同索引的 pandas 数据帧逐个元素相加

    我有两个 pandas 数据帧 例如 df1 和 df2 每个数据帧都有一定的大小 但具有不同的索引 我想逐个元素地总结这两个数据帧 我为您提供一个简单的例子来更好地理解这个问题 dic1 a 3 1 5 2 b 3 1 6 3 c 6 7
  • IOS 7.1:UIButton 的选定标题不起作用[重复]

    这个问题在这里已经有答案了 今天我将 iPhone 操作系统升级到iOS 7 1 在新的 iOS 中一切看起来都很好 但我有一个关键问题UIButtons在我正在开发的应用程序中 每个按钮的选定状态都消失了 例如 Like按钮的标题为 Li
  • MySQL。无法创建表 errno 150

    我必须在 MySQL 中创建一个包含两个表的数据库 但脚本失败并显示 errno 150 外键问题 我仔细检查了两个表上的外键字段是否相同 但没有发现任何错误 这是脚本 SET OLD UNIQUE CHECKS UNIQUE CHECKS
  • 在 Swift 中使用 CoreGraphics 在屏幕上绘制像素

    下面的代码尝试将像素设置为离线位图并将该位图绘制到屏幕上 不幸的是 它崩溃了 import UIKit class GameView UIView required init coder aDecoder NSCoder super ini
  • 在 Node 环境中导入 SQL 转储

    我想要一个 npm 脚本来创建 配置 等等 最后导入 SQL 转储 整个创建 配置等都在工作 但是 我无法让导入工作 数据永远不会被插入 这是我所拥有的 不用介意嵌套回调 因为它们将变成承诺 connection query DROP DA
  • Play Framework 1.2:如何添加自定义模块依赖项

    我在迁移到 Play 1 2 的过程中有点迷失 我们有一套定制的 我们的应用程序中的模块 在 Play 1 1 1 中我们使用了这个结构 root module1 module2 moduleN main app 并且 applicatio
  • 如何按最近的时间日期连接两个数据框?

    我有 2 个数据集 每个数据集包含 POSIXlt 格式的日期时间值 以及一些其他数字和字符变量 我想根据日期时间列合并两个数据集 但是两个数据集的日期戳不匹配 所以我需要按最近的日期 之前或之后 将它们组合起来 在我的示例中 2016 0
  • 如何在jquery中读取json结果?

    我对 jquery 不熟悉 你能帮我一下吗 我有一个来自 url 的 json 响应 但我不知道如何读取 jquery 中的键值 例如 如何获取 HAWBItemEntity 值 请检查下面的 json 响应 waybill log Tra
  • WooCommerce 4.0 电子邮件、管理订单和感谢页面上的自定义结账和 ACF 字段值

    我很难将自定义字段值打印到电子邮件通知 订单管理和感谢页面 我浏览了 StackOverflow 尝试了我找到的每一个答案 但不幸的是不起作用 我无法找出问题所在 我试图传递附加结账字段的值 它只打印带有空白值的强标签 并且在电子邮件中没有