2017-09-14 85 views
1

在Woocommerce的PayPal标准网关中,我想让Woocommerce只发送“订单号码”作为购物车中的唯一商品,而不是商品列表。只发送订单号码而不是商品名称到PayPal Woocommerce

对于这一点,我尝试过编辑类,这是负责使贝宝要求在这里: woocommerce/includes/gateways/paypal/includes/class-wc-gateway-paypal-request.php

我尝试编辑get_order_item_names()函数返回"invoice" . $order->get_order_number()作为唯一项目的名称,但那一点都不因为如果有多个项目,则成功,只有第一个与订单号码一起返回,而其他项目保留。

另外,为了达到目的,我钉了add_line_item()函数,实际上应该只有“item_name_1”与卡的总金额。

$this->line_items[ 'item_name_' . $index ] = $this->limit_length($item['item_name'], 127); 
$this->line_items[ 'quantity_' . $index ] = $item['quantity']; 
$this->line_items[ 'amount_' . $index ]  = $item['amount']; 
$this->line_items[ 'item_number_' . $index ] = $this->limit_length($item['item_number'], 127); 

这里也没有成功。

我很感谢您的协助。

回答

1

建议:你真的应该避免覆盖woocommerce核心文件

相反,你可以在这种特殊情况下过滤器钩woocommerce_paypal_args,其中您将能够操纵了在get_request_url()功能使用(这将让贝宝请求URL的参数使用订单)。

1)测试并获得发送的数据

只需注册并获取发送到PayPal的论点,我用钩子是这样的:

add_filter('woocommerce_paypal_args', 'custom_paypal_args', 10, 2); 
function custom_paypal_args ($args, $order) { 
    // Saving the data to order meta data (custom field) 
    update_post_meta($order->get_id(), '_test_paypal', $args); 
    return $args; 
} 

代码放在功能。你的活动儿童主题(或主题)的php文件或任何插件文件。

现在我可以简单地使用这个数据(设置正确的顺序编号):

// Only visible on shop pages by admins 
add_action('woocommerce_before_main_content', function(){ 
    // Only visible by admins 
    if(! current_user_can('manage_options')) return; 

    $order_id = 648; 
    $data_sent_to_paypal = get_post_meta($order_id, '_test_paypal'); 
    echo '<pre>'; print_r($data_sent_to_paypal); echo '</pre>'; 
}, 10, 0); 

$order_id = 648; 
$data_sent_to_paypal = get_post_meta($order_id, '_test_paypal'); 
echo '<pre>'; print_r($data_sent_to_paypal); echo '</pre>'; 

或者在钩(在这个例子中只为管理员店铺页面上看到)

这给了我这样一个输出(2个产品和不同的数量):

Array 
(
    [0] => Array 
    (
     [cmd] => _cart 
     [business] => [email protected] 
     [no_note] => 1 
     [currency_code] => EUR 
     [charset] => utf-8 
     [rm] => 2 
     [upload] => 1 
     [return] => https://example.com/checkout/order-received/8877?key=wc_order_55445ndfgbulfdf&utm_nooverride=1 
     [cancel_return] => https://example.com/cart/?cancel_order=true&order=wc_order_55445ndfgbulfdf&order_id=8877&redirect&_wpnonce=34m7kl83455 
     [page_style] => 
     [image_url] => https://example.com/wp-content/uploads/2012/06/logo.png 
     [paymentaction] => sale 
     [bn] => WooThemes_Cart 
     [invoice] => pp-8877 
     [custom] => {"order_id":8877,"order_key":"wc_order_55445ndfgbulfdf"} 
     [notify_url] => https://example.com/wc-api/WC_Gateway_Paypal/ 
     [first_name] => John 
     [last_name] => Doe 
     [address1] => Test st. 
     [address2] => 
     [city] => wef 
     [state] => AR 
     [zip] => 43242 
     [country] => US 
     [email] => [email protected] 
     [night_phone_a] => 078 
     [night_phone_b] => 653 
     [night_phone_c] => 6216 
     [no_shipping] => 1 
     [tax_cart] => 16.55 
     [item_name_1] => Test Product - Service 
     [quantity_1] => 1 
     [amount_1] => 71 
     [item_number_1] => 
     [item_name_2] => Test Product 1 
     [quantity_2] => 1 
     [amount_2] => 66 
     [item_number_2] => 
     [item_name_3] => Test Product 2 
     [quantity_3] => 1 
     [amount_3] => 120 
     [item_number_3] => 
     [item_name_4] => Test Product 3 
     [quantity_4] => 1 
     [amount_4] => 45 
     [item_number_4] => 
    ) 

) 

正如您现在所看到的,使用woocommerce_paypal_args您将能够更改或删除任何参数。

有永远只有一个:'item_name_1''quantity_1''amount_1''item_number_1'与总是发送到贝宝指数1


2操纵数据一起发送(例如)

我们仍然可以使用woocommerce_paypal_args,例如过滤钩子上'item_name_1'键,由以更换项目名称数量,只要你想:

add_filter('woocommerce_paypal_args', 'custom_paypal_args', 10, 2); 
function custom_paypal_args ($args, $order) { 
    $$args_keys = array_keys($args); 
    $i = 0; 
    // Iterating through order items 
    foreach($order->get_items() as $item_id => $item_product){ 
     $i++; // updating count. 
     if(! empty($args["item_name_$i"])){ 
      // Returning the order invoice in the item name 
      $args["item_name_$i"] = "invoice #" . $order->get_id(); 
     } 
    } 
    return $args; 
} 

代码发送到您活动的子主题(或主题)的function.php文件中,也可以放在任何插件文件中。

的代码进行测试和WooCommerce 3+工作

要完成:当你的WC_Order对象作为参数,在钩挂的函数,你可以用它来从订单获得任何数据并根据您喜欢的方式操纵发送到PayPal网关的数据。

看到这个相关答案:How to get WooCommerce order details

+0

敬爱卢瓦克,关于操纵'$ args',它需要的第一个项目后删除卡中的所有其他项目。此外,设置第一个项目的价格等于购物车的整个价格(因为只有一个单一项目)。所以这是编辑后的自定义功能。你可以在你的回答中加入:[***自定义函数修改'$ args' ***](https://paste.ubuntu.com/25567534/) – DummyBeginner

+0

** 1。**你在哪里运行上面的代码(在**测试部分**)给你的数组? WordPress/Woocommerce中的哪个文件可以放置代码来检索post_meta并打印您显示的数组? ** 2。**如果没有'woocommerce_paypal_args'过滤器钩子,我们如何重写我们编写的插件或主题的function.php中的get_request_url()?我的问题是覆盖任何插件的功能,在我们的自定义插件或主题的function.php – DummyBeginner

+0

通用谢谢,关于答案** 2 **:我想知道如何重写插件函数(如woocommerce)如果没有可用的钩子。我们如何重写函数并更改其功能而不更改插件更新后会丢失的插件核心? ... 关于答案** 3 **:当我在购物车中有多个物品时,还会有_item_name_2_,_item_name_3_,_item_name_4_ ...。 Woocommerce版本:'3.1.2' – DummyBeginner

0

我正在使用以下函数获取订单ID,您可以根据需要编辑和使用以下函数。

public function process_payment($order_id) { 
    global $woocommerce; 
    $order = new WC_Order($order_id); 
    return array(
     'result' => 'success', 
     'redirect' => $order->get_checkout_payment_url(true) 
    ); 
相关问题