在 XML 中循环并写出订单项目 - Woocommerce
Loop and write out order items in XML - Woocommerce
正在为 Woocommerce 写一个插件,在 XML 中写出订单信息。除了我需要循环和写出的订单项目信息外,一切都准备就绪。
现在已经尝试了几个小时,但我猜我缺乏 php 技能不知何故让我错过了显而易见的事情。
这是return数据
的代码
/**
* Return an array of items/products within this order.
*
* @param string|array $type Types of line items to get (array or string)
* @return array
*/
function get_items( $type = '' ) {
global $wpdb;
if ( empty( $type ) ) {
$type = array( 'line_item' );
}
if ( ! is_array( $type ) ) {
$type = array( $type );
}
$type = array_map( 'esc_attr', $type );
$line_items = $wpdb->get_results( $wpdb->prepare( "
SELECT order_item_id, order_item_name, order_item_type
FROM {$wpdb->prefix}woocommerce_order_items
WHERE order_id = %d
AND order_item_type IN ( '" . implode( "','", $type ) . "' )
ORDER BY order_item_id
", $this->id ) );
$items = array();
// Reserved meta keys
$reserved_item_meta_keys = array(
'name',
'type',
'item_meta',
'qty',
'tax_class',
'product_id',
'variation_id',
'line_subtotal',
'line_total',
'line_tax',
'line_subtotal_tax'
);
// Loop items
foreach ( $line_items as $item ) {
// Place line item into array to return
$items[ $item->order_item_id ]['name'] = $item->order_item_name;
$items[ $item->order_item_id ]['type'] = $item->order_item_type;
$items[ $item->order_item_id ]['item_meta'] = $this->get_item_meta( $item->order_item_id );
// Expand meta data into the array
if ( $items[ $item->order_item_id ]['item_meta'] ) {
foreach ( $items[ $item->order_item_id ]['item_meta'] as $name => $value ) {
if ( in_array( $name, $reserved_item_meta_keys ) ) {
continue;
}
if ( '_' === substr( $name, 0, 1 ) ) {
$items[ $item->order_item_id ][ substr( $name, 1 ) ] = $value[0];
} elseif ( ! in_array( $name, $reserved_item_meta_keys ) ) {
$items[ $item->order_item_id ][ $name ] = make_clickable( $value[0] );
}
}
}
}
return apply_filters( 'woocommerce_order_get_items', $items, $this );
}
然后简单地尝试输出循环并显示名称和数量。
foreach {
$this->xml->writeElement('Name', $item->name);
$this->xml->writeElement('Quantity', $item->qty);
}
如果有人能帮我解决这个问题,我会很高兴,这样我就能理解了。
解决了,这是我的解决方案
$order = new WC_Order( $order_id );
$items = $order->get_items();
foreach ( $items as $item ) {
$product_name = $item['name'];
$product_id = $item['product_id'];
$product_variation_id = $item['variation_id'];
// Output XML
$this->xml->writeElement('Shi3pmentDate', $product_name);
}
正在为 Woocommerce 写一个插件,在 XML 中写出订单信息。除了我需要循环和写出的订单项目信息外,一切都准备就绪。
现在已经尝试了几个小时,但我猜我缺乏 php 技能不知何故让我错过了显而易见的事情。
这是return数据
的代码 /**
* Return an array of items/products within this order.
*
* @param string|array $type Types of line items to get (array or string)
* @return array
*/
function get_items( $type = '' ) {
global $wpdb;
if ( empty( $type ) ) {
$type = array( 'line_item' );
}
if ( ! is_array( $type ) ) {
$type = array( $type );
}
$type = array_map( 'esc_attr', $type );
$line_items = $wpdb->get_results( $wpdb->prepare( "
SELECT order_item_id, order_item_name, order_item_type
FROM {$wpdb->prefix}woocommerce_order_items
WHERE order_id = %d
AND order_item_type IN ( '" . implode( "','", $type ) . "' )
ORDER BY order_item_id
", $this->id ) );
$items = array();
// Reserved meta keys
$reserved_item_meta_keys = array(
'name',
'type',
'item_meta',
'qty',
'tax_class',
'product_id',
'variation_id',
'line_subtotal',
'line_total',
'line_tax',
'line_subtotal_tax'
);
// Loop items
foreach ( $line_items as $item ) {
// Place line item into array to return
$items[ $item->order_item_id ]['name'] = $item->order_item_name;
$items[ $item->order_item_id ]['type'] = $item->order_item_type;
$items[ $item->order_item_id ]['item_meta'] = $this->get_item_meta( $item->order_item_id );
// Expand meta data into the array
if ( $items[ $item->order_item_id ]['item_meta'] ) {
foreach ( $items[ $item->order_item_id ]['item_meta'] as $name => $value ) {
if ( in_array( $name, $reserved_item_meta_keys ) ) {
continue;
}
if ( '_' === substr( $name, 0, 1 ) ) {
$items[ $item->order_item_id ][ substr( $name, 1 ) ] = $value[0];
} elseif ( ! in_array( $name, $reserved_item_meta_keys ) ) {
$items[ $item->order_item_id ][ $name ] = make_clickable( $value[0] );
}
}
}
}
return apply_filters( 'woocommerce_order_get_items', $items, $this );
}
然后简单地尝试输出循环并显示名称和数量。
foreach {
$this->xml->writeElement('Name', $item->name);
$this->xml->writeElement('Quantity', $item->qty);
}
如果有人能帮我解决这个问题,我会很高兴,这样我就能理解了。
解决了,这是我的解决方案
$order = new WC_Order( $order_id );
$items = $order->get_items();
foreach ( $items as $item ) {
$product_name = $item['name'];
$product_id = $item['product_id'];
$product_variation_id = $item['variation_id'];
// Output XML
$this->xml->writeElement('Shi3pmentDate', $product_name);
}