Connector-Plugin 1.4.0: DHL-Label an das Partnercenter übertragen

compose_label_data() liest das Meta-Feld _pr_shipment_dhl_label_tracking
(DHL for WooCommerce); write_order_items() schickt Label-URL + Sendungsnummer
beim wp/order-Transfer mit. Neuer Listener auf pr_save_dhl_label_tracking
reicht Labels nach, die erst nach der Übertragung erstellt werden (nur bei
bereits übertragenen Bestellungen, via neuem wp/label-Endpoint).
Connector-Doku auf die konkrete Umsetzung aktualisiert.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Kevin Adametz 2026-07-17 11:42:30 +00:00
parent 0eed974576
commit 4f9dca88de
5 changed files with 170 additions and 56 deletions

View file

@ -3,7 +3,7 @@
/**
* Plugin Name: PARTNERCENTER API Connector
* Description: Connect WooCommerce to PARTNERCENTER API
* Version: 1.3.3
* Version: 1.4.0
* Author: Cross Media Cloud
* Author URI: https://www.cross-media-cloud.de
* License: GNU General Public License v2 or later
@ -86,6 +86,8 @@ add_filter('PARTNERCENTER_API', 'partnercenter_api_init');
require_once 'public/shortcode.php';
// Load WooCommerce status related features
require_once 'public/woocommerce/order-status.php';
// Load DHL label forwarding ("DHL for WooCommerce" integration)
require_once 'public/woocommerce/dhl-label.php';
// Load endpoint
require_once 'public/end-point.php';

View file

@ -137,6 +137,33 @@ trait PARTNERCENTER_API_Order
return $data;
}
/**
* Helper to read the DHL label data saved by the "DHL for WooCommerce" plugin.
*
* The plugin stores label URL and tracking number(s) as order meta.
*
* @return array Empty array when no label exists yet
*
* @since 1.4.0
*/
private function compose_label_data()
{
// Get label meta written by "DHL for WooCommerce"
$label_meta = $this->order->get_meta('_pr_shipment_dhl_label_tracking');
// Check if a label was created for this order
if (! is_array($label_meta) || empty($label_meta['label_url'])) {
return [];
}
return [
'wp_label_url' => $label_meta['label_url'],
// String or array (multi parcel) - the API accepts both
'wp_tracking_number' => isset($label_meta['tracking_number']) ? $label_meta['tracking_number'] : null,
];
}
/**
* Helper to create cart data.
*
@ -317,6 +344,11 @@ trait PARTNERCENTER_API_Order
$request_body['wp_incentives'] = implode(', ', $incentives_strings_array);
}
/*
* Add DHL label + tracking number (if a label was already created)
*/
$request_body = array_merge($request_body, $this->compose_label_data());
/*
* Make the request
*/
@ -327,6 +359,39 @@ trait PARTNERCENTER_API_Order
return $this->handle_response($response);
}
/**
* Push DHL label + tracking number for an already forwarded order.
*
* Used when the label is created (or re-created) AFTER the order
* has been forwarded to the PARTNERCENTER.
*
* @return bool
*
* @since 1.4.0
*/
private function write_order_label()
{
// Get label data
$label_data = $this->compose_label_data();
// Nothing to send without a label
if (empty($label_data)) {
return false;
}
// Build body data
$request_body = array_merge([
'wp_order_number' => $this->order->get_id(),
], $label_data);
// Send to API
$response = $this->create('wp/label', $request_body);
// Handle response
return $this->handle_response($response);
}
/**
* Try to cancel order.
*

View file

@ -163,6 +163,23 @@ class PARTNERCENTER_API_Requests
return true;
}
/**
* Push the DHL label of an already forwarded order to PARTNERCENTER.
*
* @since 1.4.0
*
* @return bool
*/
public function send_order_label(int $order_id)
{
// Setup the order object
$this->setup_order($order_id);
// Send label data to API
return $this->write_order_label();
}
/**
* Handle retrieving of order from PARTNERCENTER.
*

View file

@ -0,0 +1,59 @@
<?php
/*
* Forward DHL labels created by the "DHL for WooCommerce" plugin.
*
* Normal case: the label is created BEFORE the order is forwarded - then
* write_order_items() sends label + tracking number along with the order.
* This listener covers the other case: the label is created (or re-created)
* AFTER the order has already been forwarded to the PARTNERCENTER.
*/
if (! defined('ABSPATH')) {
exit;
}
class PARTNERCENTER_API_WooCommerce_DHL_Label_Class
{
/**
* PARTNERCENTER_API_WooCommerce_DHL_Label_Class constructor.
*/
public function __construct()
{
// Listen to label creation by "DHL for WooCommerce"
// (fires once per tracking number, after the label meta was saved)
add_action('pr_save_dhl_label_tracking', [$this, 'pr_save_dhl_label_tracking'], 20, 2);
}
/**
* Push a freshly created DHL label to PARTNERCENTER.
*
* @param array $tracking_details Carrier, tracking number, ship date, tracking URL
*
* @since 1.4.0
*/
public function pr_save_dhl_label_tracking(int $order_id, $tracking_details)
{
// Only orders that have already been forwarded to the PARTNERCENTER -
// otherwise the label is sent along with the order transfer anyway
if (empty(get_post_meta($order_id, '_partnercenter_api_order_fulfillment_forwarded', true))) {
return;
}
// Load API
$partnercenter = apply_filters('PARTNERCENTER_API', false);
if ($partnercenter === false) {
return;
}
// Push label + tracking number to PARTNERCENTER
// (endpoint is idempotent - repeated calls just overwrite)
$partnercenter->send_order_label($order_id);
}
}
new PARTNERCENTER_API_WooCommerce_DHL_Label_Class;