In PayPal möchte ich das Standard-Gateway von Woocommerce machen Woocommerce
sendet nur “Bestellnummer” als einziger Artikel im Warenkorb anstelle der aufgeschlüsselten Produktliste.
Dafür habe ich versucht, die Klasse zu bearbeiten, die für eine PayPal-Anfrage hier verantwortlich ist:
woocommerce/includes/gateways/paypal/includes/class-wc-gateway-paypal-request.php
Ich habe versucht zu bearbeiten get_order_item_names()
Funktion zurückzugeben "invoice" . $order->get_order_number()
als Name des einzigen Artikels, aber es war nicht erfolgreich, da bei mehreren Artikeln nur der erste mit der Bestellnummer zurückgegeben wurde und andere Artikel übrig blieben.
Außerdem habe ich das genagelt add_line_item()
Funktion, denn um dem Zweck näher zu kommen, sollte es praktisch nur “Artikelname_1” mit dem Betrag des Gesamtbetrags der Karte.
$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 );
Auch hier kein Erfolg.
Ich würde mich über Ihre Hilfe freuen.
Empfehlung: Sie sollten es wirklich vermeiden, Woocommerce-Kerndateien zu überschreiben.
Stattdessen könnten Sie verwenden in diesem speziellen Fall der Filterhaken woocommerce_paypal_args
wo Sie werden in der Lage sein, die Argumente zu manipulieren die darin verwendet werden get_request_url()
Funktion (die die PayPal-Anforderungs-URL für eine Bestellung erhält).
1) TESTEN UND VERSENDETE DATEN ERHALTEN
Nur um mich zu registrieren und die Argumente an Paypal zu senden, habe ich den Hook folgendermaßen verwendet:
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;
}
Code geht in die function.php-Datei Ihres aktiven Child-Themes (oder Themes) oder auch in jede Plugin-Datei.
Jetzt kann ich die Daten einfach so abrufen (Einstellung der richtigen Auftrags-ID):
$order_id = 648;
$data_sent_to_paypal = get_post_meta( $order_id, '_test_paypal' );
echo '<pre>'; print_r( $data_sent_to_paypal ); echo '</pre>';
Oder in einem Hook (in Shopseiten in diesem Beispiel nur für Admins sichtbar):
// 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 );
Dies gibt mir eine Ausgabe wie diese (für 2 Produkte und unterschiedliche Mengen):
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] =>
)
)
Wie Sie jetzt sehen können, mit woocommerce_paypal_args
Sie können alle Argumente ändern oder entfernen.
Es gibt immer nur einen: 'item_name_1'
, 'quantity_1'
, 'amount_1'
und 'item_number_1'
mit Always-Index 1
an Paypal geschickt.
2 MANIPULATION DER GESENDETEN DATEN (Beispiel):
Können wir noch verwenden woocommerce_paypal_args
Filterhaken zum Beispiel an 'item_name_1'
Taste, um die Artikelnamen nach Belieben durch die Bestellnummer zu ersetzen:
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;
}
Code geht in die function.php-Datei Ihres aktiven Child-Themes (oder Themes) oder auch in jede Plugin-Datei.
Der Code ist getestet und funktioniert auf WooCommerce 3+
Beenden: Wenn Sie das WC_Order-Objekt als Argument in Ihrer Hook-Funktion erhalten, können Sie damit beliebige Daten aus der Bestellung abrufen und die an das Paypal-Gateway gesendeten Daten nach Belieben bearbeiten.
Siehe diese verwandte Antwort: So erhalten Sie WooCommerce-Bestelldetails
Ich verwende die unten stehende Funktion, um die Bestell-ID zu erhalten. Sie können die unten stehende Funktion für Ihre Bedürfnisse bearbeiten und verwenden.
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 )
);