使用WooCommerce,我正在尝试更改订单商品的下载网址。最初我使用的是订单ID,但每个订单只允许一个订阅。所以我需要客户能够购买多个订阅。
这是我目前的代码:
if ( !class_exists( 'pl_wcdf_extention' ) ) {
class pl_wcdf_extention {
public function __construct() {
add_filter( 'woocommerce_order_get_downloadable_items', array( $this, 'download_link' ), 10, 2 );
add_filter( 'woocommerce_customer_get_downloadable_products', array( $this, 'download_link' ), 10, 1 );
}
public function download_link( $downloads, $order = null ) {
$download_url_base = 'https://xxxx.com/';
// retrieve Order ID from Download array
$order_id = $downloads [0]['order_id'];
// retrieve Order data
$order = wc_get_order( $order_id );
// retrieve Order Items
$order_item = $order->get_items();
// retrieve first Order Item ID
$order_item_id = $order_item [0][order_item_id];
foreach ( $downloads as $download ) {
$download['download_url'] = $download_url_base . "xxxx-" . $order_item_id . ".svg";
$tag_item = array(
'--native-libs-dir' => '/home/Lib/',
'--type' => 'template0001style1',
'--data'=> $order_item_id,
'--join' => 'horizontal',
'--output-file' => '/home/public_html/xxxx-' . $order_item_id . '.svg'
);
$args = "";
foreach ($tag_item as $k=>$v) {
$args .= " $k " . " $v ";
}
shell_exec("/home/Python-2.7.14/Python-3.6.3/python /home/Lib/generate-code.py $args");
}
return $downloads;
}
}
}
if ( class_exists( 'pl_wcdf_extention' ) ) {
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly
}
global $wpdb;
define( 'PL_WCDFE_DIR_PATH', plugin_dir_path( __FILE__ ) );
define( 'PL_WCDFE_PLUGIN_FILE', __FILE__ );
new pl_wcdf_extention();
}
一切正常,但我无法获得订单商品ID。
任何帮助,将不胜感激。
更新
假设定义了$ order,要在代码中检索第一个订单项,您将使用:
// retrieve Order Items
$order_items = $order->get_items();
// retrieve Order Items IDs
$order_items_ids = array_keys($order_items);
// retrieve first Order Item ID
$order_item_id = reset( $order_items_ids );
或者可能更好,在订单上使用WC_Data
方法get_id()
项目:
// retrieve Order Items
$order_items = $order->get_items();
// retrieve first Order Item
$order_item = reset( $order_items );
// retrieve Order Item ID
$order_items_id = $order_item->get_id();
经过测试和工作。
更新 - 添加
由于WC_Order
对象似乎未在您的实际代码中定义,请尝试替换:
// retrieve Order ID from Download array
$order_id = $downloads [0]['order_id'];
// retrieve Order data
$order = wc_get_order( $order_id );
这样:
// When the WC_Order object $order variable is Not defined
if( is_null($order) || ! is_a($order, 'WC_Order') ) {
$order_id = $downloads [0]['order_id'];
if( is_numeric( $order_id ) && get_post_type( $order_id ) === 'shop_order' ) {
$order = wc_get_order( $order_id );
} else {
return new WP_Error( 'broke', __( "Order object is not defined", "woocommerce" ) );
}
}
// When the $order variable is defined
else {
$order_id = $order->get_id();
}
有关: