过滤 Woocommerce 订单发送的 PayPal“自定义”字段

Posted

技术标签:

【中文标题】过滤 Woocommerce 订单发送的 PayPal“自定义”字段【英文标题】:Filtering PayPal 'Custom' Field Sent By Woocommerce Order 【发布时间】:2021-07-05 21:36:08 【问题描述】:

我需要在“自定义”字段中处理 Woocommerce 发送到 PayPal 的数据。当 Woocommerce 创建订单并发送数据时,可以在

$order['custom']

这个字符串是 json 编码的,我有一个我正在尝试使用的过滤器,但它似乎不起作用。这是我得到的:

add_filter('woocommerce_paypal_args', 'send_custom_paypal_data');
function send_custom_paypal_data($order) 
    error_log(print_r($order['custom'], true)); //log variable
    $order['custom'] = wp_json_encode(
        array(
            'field1' => 'some value',
            'field2' => 'more values'
        )
    );
    error_log(print_r($order['custom'], true)); //log value after updating variable
    return $order;

我第一次将 $order['custom'] 变量转储到 error_log 时,我从 Woocommerce 订单中获得了预期值。但是第二次,它的值相同,没有任何变化。

【问题讨论】:

你能分享一下第一个error_log和第二个error_log的输出是什么吗? 【参考方案1】:

$order 是第二个参数,而不是第一个。

你还应该设置钩子priorityparameters的数量。

woocommerce_paypal_args 钩子定义在:/woocommerce/includes/gateways/paypal/includes/class-wc-gateway-paypal-request.php

试试这个:

add_filter( 'woocommerce_paypal_args', 'send_custom_paypal_data', 10, 2 );
function send_custom_paypal_data( $args, $order ) 

    error_log( print_r( $args['custom'], true) ); //log variable

    $args['custom'] = wp_json_encode(
        array(
            'field1' => 'some value',
            'field2' => 'more values'
        )
    );
    
    error_log( print_r( $args['custom'], true) ); //log value after updating variable

    return $args;


代码已经过测试并且对我有用。将其添加到活动主题的 functions.php 中。

日志报告

第一个日志返回:

[10-Apr-2021 08:54:04 UTC] "order_id":145,"order_key":"wc_order_8FSKEF2hg2UVu"

第二个:

[10-Apr-2021 08:54:04 UTC] "field1":"some value","field2":"more values"

它对我很有效。

如果它不工作

您使用的是 WooCommerce 插件中包含的 PayPal 网关,对吗? 您是否检查过是否有任何其他功能覆盖您的功能?或者他们有更高的优先级? 您是否安装了另一个 PayPal 插件?在这种情况下,请停用它。

相关答案 (使用woocommerce_paypal_args 钩子)

How to dynamically change the PayPal address in Woocommerce? Adding custom args to Paypal Woocommerce Sending only order number instead of item names to PayPal in Woocommerce

【讨论】:

谢谢,将测试它是否有效。 $order 变量有我想要的数据数组,我仍然不明白为什么它不会在函数内本地更新该数组字段的值 您将$order 用作数组而不是订单对象,如此正确。我建议您将所有参数添加到函数中,因为如您所见,确实有第二个$order 参数是订单对象。为避免混淆,如果用于访问 PayPal 订单参数而不是订单对象,最好重命名 $order 变量。 按照@gautamgolakiya 的建议显示文件中的日志(第一个和第二个)也可能很有用。将它们发布在您的问题中。

以上是关于过滤 Woocommerce 订单发送的 PayPal“自定义”字段的主要内容,如果未能解决你的问题,请参考以下文章

过滤 woocommerce 取消未付订单

在 Woocommerce 中仅向 PayPal 发送订单号而不是商品名称

在保存订单并发送 WooCommerce 电子邮件通知之前,将订单 ID 添加到订单项目元数据

在 WooCommerce 中完成订单后向客户发送电子邮件

立即在 WooCommerce 中设置待处理订单并发送处理电子邮件通知

WooCommerce - 从 functions.php 文件发送新订单/客户发票电子邮件