我希望能够在付款完成后为订单中的每个商品添加元数据。以下是我到目前为止的代码:
add_action('woocommerce_order_status_completed', array($this, 'action_fuck_it_all'));
public function action_fuck_it_all($order_id)
{
$order = new WC_Order( $order_id );
$items = $order->get_items();
foreach ( $items as $item ) {
$product_id = $item['product_id'];
$item_id = $item['item_id'];
$licence = $this->_getProductLicenseCode($product_id);
if( !$licence ){
return false;
}
woocommerce_add_order_item_meta($item_id, 'attribute_licence_code', $licence->licence_code);
$this->_setLicenceCodeStatus($licence->licence_id, 'assigned');
}
}
protected function _getProductLicenseCode($product_id)
{
global $wpdb;
$query = "SELECT licence_id, product_id, licence_code, licence_status FROM {$wpdb->prefix}wc_product_licences
WHERE product_id = $product_id
AND licence_code <> ''
AND licence_status = 'available'
ORDER BY creation_date ASC
LIMIT 1";
//print $query.'<br/>';
return $wpdb->get_row($query);
}
protected function _setLicenceCodeStatus($licence_id, $status)
{
global $wpdb;
$data = array('licence_status' => $status);
if( $status == 'assigned' )
{
}
$wpdb->update($wpdb->prefix . 'wc_product_licences',
$data,
array('licence_id' => (int)$licence_id));
}
根据我的测试,一切似乎都有效(获取许可证,设置许可证,将许可证状态更改为已分配等),但许可证代码未作为每个项目的元数据插入。有什么想法发生了什么?
谢谢!
答案 0 :(得分:0)
尝试在另一个钩子上执行此操作,例如:
add_action('woocommerce_add_order_item_meta', 'my_order_item_meta'), 10, 2);
function my_order_item_meta( $item_id, $values, $cart_item_key ) {
$product_id = $values['data']->id;
$licence = $this->_getProductLicenseCode($product_id);
if( !$licence ){
return false;
}
wc_add_order_item_meta($item_id, 'attribute_licence_code', $licence->licence_code);
$this->_setLicenceCodeStatus($licence->licence_id, 'assigned');
}
答案 1 :(得分:0)
add_action('woocommerce_order_status_completed', array($this, 'my_machine'));
public function my_machine($order_id)
{
$order = new WC_Order( $order_id );
$items = $order->get_items();
foreach ( $items as $key=>$item ) {
$product_id = $item['product_id'];
$item_id = $key;
$licence = $this->_getProductLicenseCode($product_id);
if( !$licence ){
return false;
}
woocommerce_add_order_item_meta($item_id, 'attribute_licence_code', $licence->licence_code);
$this->_setLicenceCodeStatus($licence->licence_id, 'assigned');
}
}