根据 WooCommerce 订单商品产品标签更改 PayPal 电子邮件

Posted

技术标签:

【中文标题】根据 WooCommerce 订单商品产品标签更改 PayPal 电子邮件【英文标题】:Change PayPal email based on WooCommerce order items product tags 【发布时间】:2021-04-21 16:41:12 【问题描述】:

我正在努力寻找解决问题的方法。我想根据 WooCommerce 产品标签更改 PayPal 电子邮件。 示例:对于服装、鞋类和箱包标签,请发送电子邮件 emailpaypal1@domain.com ..... 如果标签是雪、阳光、花园,则将电子邮件发送到 paypal2@domain.com 等...

我在多次搜索后找到了这段代码,但我无法让它与标签一起使用。我都试过了,但都失败了:(。谁能给我修改后的标签代码?非常感谢!!

// 1. Switch PayPal email for Product ID
add_filter( 'woocommerce_paypal_args' , 'switch_paypal_email_based_product', 9999, 2 );
function switch_paypal_email_based_product( $paypal_args, $order ) 
 
    foreach ( $order->get_items() as $item_id => $item ) 

        // ENTER PRODUCT ID HERE
        if ( 123456 == $item->get_product_id() ) 
            // ENTER OTHER PAYPAL EMAIL HERE
            $paypal_args['business'] = 'another-paypal@example.com';
            break;
        
    
    return $paypal_args;

 
// 2. Avoid IPN Failure after switching PayPal email for Product ID
require_once WC()->plugin_path() . '/includes/gateways/paypal/includes/class-wc-gateway-paypal-ipn-handler.php';
 
class WC_Gateway_Paypal_IPN_Handler_Switch extends WC_Gateway_Paypal_IPN_Handler  
    
    protected function validate_receiver_email( $order, $receiver_email ) 
 
        if ( strcasecmp( trim( $receiver_email ), trim( $this->receiver_email ) ) !== 0 ) 
 
            // ENTER HERE SAME PAYPAL EMAIL USED ABOVE
            if ( $receiver_email != 'another-paypal@example.com' ) 
 
                WC_Gateway_Paypal::log( "IPN Response is for another account: $receiver_email. Your email is $this->receiver_email" );
                $order->update_status( 'on-hold', sprintf( __( 'Validation error: PayPal IPN response from a different email address (%s).', 'woocommerce' ), $receiver_email ) );
                exit;
            
        
    

 
new WC_Gateway_Paypal_IPN_Handler_Switch();

更新

我把它放在子主题的function.php 文件中,但它在我附加给你的那一行中给了我一个错误。我抄得不好? :(。我是不是忘记了什么?非常感谢!!

Error: syntax error, unexpected 'array' (T_ARRAY), expecting ')' 

if ( ! in_array( $receiver_email array('paypal1@domain.com', 'paypal2@domain.com') ) 

他在这一行给我的错误......但老实说,我不知道 wordpress 的程序是否理解它是否在这一行中,或者你是否错了:(。它不会让我保存代码对于这个问题...

Error: syntax error, unexpected 'array' (T_ARRAY), expecting ')'

【问题讨论】:

【参考方案1】:

要处理订单商品上的特定产品标签,您可以通过这种方式使用 WordPress has_term() 函数,将您的第一个挂钩函数替换为以下内容:

add_filter( 'woocommerce_paypal_args' , 'switch_paypal_email_based_product_tags', 9999, 2 );
function switch_paypal_email_based_product_tags( $paypal_args, $order ) 
    // Here define your product tags
    $tag_terms1 = array('clothing', 'footwear', 'bags'); 
    $tag_terms2 = array('snow', 'sun', 'garden');

    // Here define your emails
    $email1     = 'paypal1@domain.com';
    $email2     = 'paypal2@domain.com';
 
    foreach ( $order->get_items() as $item_id => $item ) 
        if ( has_term( $tag_terms1, 'product_tag', $item->get_product_id() ) ) 
            $paypal_args['business'] = $email1;
            break;
         elseif ( has_term( $tag_terms2, 'product_tag', $item->get_product_id() ) ) 
            $paypal_args['business'] = $email2;
            break;
        
    
    return $paypal_args;


// Avoid IPN Failure after switching PayPal email for order items product tags 
require_once WC()->plugin_path() . '/includes/gateways/paypal/includes/class-wc-gateway-paypal-ipn-handler.php';
 
class WC_Gateway_Paypal_IPN_Handler_Switch extends WC_Gateway_Paypal_IPN_Handler  
    
    protected function validate_receiver_email( $order, $receiver_email ) 
 
        if ( strcasecmp( trim( $receiver_email ), trim( $this->receiver_email ) ) !== 0 ) 
 
            // Here set same paypal emails used above in the array
            if ( ! in_array( $receiver_email array('paypal1@domain.com', 'paypal2@domain.com') ) ) 
 
                WC_Gateway_Paypal::log( "IPN Response is for another account: $receiver_email. Your email is $this->receiver_email" );
                $order->update_status( 'on-hold', sprintf( __( 'Validation error: PayPal IPN response from a different email address (%s).', 'woocommerce' ), $receiver_email ) );
                exit;
            
        
    

 
new WC_Gateway_Paypal_IPN_Handler_Switch();

代码进入活动子主题(或活动主题)的functions.php 文件中。它应该可以工作。

重要提示:这将无法正常工作,例如,如果您有一个来自 "clothing" 的订单商品和另一个来自 "garden" 的订单商品> 以相同的顺序。

相关:Sending only order number instead of item names to PayPal in Woocommerce

【讨论】:

以上是关于根据 WooCommerce 订单商品产品标签更改 PayPal 电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

当订单中有缺货商品时,在 WooCommerce 电子邮件通知中显示消息

获取 WooCommerce 订单的每个项目的产品类别

根据 WooCommerce 中的付款方式提高购物车商品价格

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

在 WooCommerce 3 中获取订单商品和 WC_Order_Item_Product

在Woocommerce管理订单页面中保存订单商品自定义字段