Этот ответ совершенно бесполезен: проблема не в том, как получить идентификатор заказа, а в том, как передать идентификатор заказа вместо товаров в PayPal.

ндартном шлюзе PayPal Woocommerce, я хочу сделатьWoocommerce только отправляетномер заказа"как единственный товар в корзине, вместо списка товаров.

Для этого я попытался отредактировать класс, который отвечает за выполнение запроса PayPal: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 запроса PayPal для заказа).

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;
}

Код помещается в файл function.php вашей активной дочерней темы (или темы), а также в любой файл плагина.

Теперь я могу получить данные, просто используя это (установив правильный идентификатор заказа):

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

Или в хуке (видимый на страницах магазина в этом примере только для администраторов):

// 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 );

Это дает мне такой вывод (для 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 отправлено в PayPal.

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.

Смотрите этот связанный ответ:Как получить детали заказа WooCommerce

 DummyBeginner18 сент. 2017 г., 21:39
Спасибо, дорогой Лоик, о манипулировании$argsнеобходимо удалить все остальные элементы на карте после первого элемента. Кроме того, установите цену первого товара, равную всей цене корзины (потому что есть только один товар). Так что это отредактированная пользовательская функция. Вы можете добавить это в своем ответе:Пользовательская функция для изменения$args

Ваш ответ на вопрос