问题描述
我正在努力为我的问题寻找解决方案。我想根据 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,expecting ')'
解决方法
要处理订单商品上的特定产品标签,您可以通过这种方式使用 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,$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