[英]Empty order item metadata for variable product at first in Woocommerce
以下代碼將產品的可編輯簡短描述添加為Woocommerce中的訂單項元數據。 對於簡單產品,代碼按預期工作,但對於可變產品, $item->get_formatted_meta_data('')
返回空數組,並且僅在編輯項目后才返回空數組,簡短說明按預期顯示。
<?php
/**
* Add product description meta to order item
*/
add_action( 'woocommerce_before_order_itemmeta', 'add_order_item_description_meta', 10, 3 );
function add_order_item_description_meta( $item_id, $item, $product ) {
// Add only if not present
$product_description_meta = wc_get_order_item_meta( $item_id, '_product_short_desc', true );
if( empty( $product_description_meta ) ) {
if( $product->is_type('variation') ) {
$parent_product = wc_get_product( $product->get_parent_id() );
$excerpt = $product->get_description();
$excerpt = empty($excerpt) ? $parent_product->get_short_description() : $excerpt;
} else {
$excerpt = $product->get_short_description();
}
wc_add_order_item_meta( $item_id, '_product_short_desc', $excerpt );
}
}
/**
* Hide product description meta
*/
add_filter( 'woocommerce_hidden_order_itemmeta', 'custom_hidden_order_itemmeta' );
function custom_hidden_order_itemmeta( $hidden_order_itemmeta ) {
$hidden_order_itemmeta[] = '_product_short_desc';
return $hidden_order_itemmeta;
}
/**
* Add custom column to display product description meta
*/
add_action( 'woocommerce_admin_order_item_headers', 'custom_admin_order_items_headers', 20, 1 );
function custom_admin_order_items_headers( $order ) {
echo '<th class="item_short_description">';
echo __('Short Description', 'woocommerce') . '</th>';
}
/**
* Custom column content in table
*/
add_action( 'woocommerce_admin_order_item_values', 'custom_admin_order_item_values', 20, 3 );
function custom_admin_order_item_values( $product, $item, $item_id ) {
?>
<td class="product_short_desc">
<?php
if( $meta_data = $item->get_formatted_meta_data( '' ) ) {
$meta = array_filter( $meta_data, function( $value, $key ) {
return '_product_short_desc' === $value->key;
}, ARRAY_FILTER_USE_BOTH );
if( ! empty( $meta ) ) {
// Get the key of first value
$meta_id = 0;
foreach( $meta as $key => $value) {
$meta_id = $key;
break;
}
$product_desc_meta = $meta[$meta_id];
?>
<div class="view">
<?php echo wp_kses_post( force_balance_tags( $product_desc_meta->display_value ) ); ?>
</div>
<div class="edit" style="display: none;">
<input type="hidden" placeholder="<?php esc_attr_e( 'Name (required)', 'woocommerce' ); ?>" name="meta_key[<?php echo esc_attr( $item_id ); ?>][<?php echo esc_attr( $meta_id ); ?>]" value="<?php echo esc_attr( $product_desc_meta->key ); ?>" />
<textarea placeholder="<?php esc_attr_e( 'Short Description', 'woocommerce' ); ?>" name="meta_value[<?php echo esc_attr( $item_id ); ?>][<?php echo esc_attr( $meta_id ); ?>]"><?php echo esc_textarea( rawurldecode( $product_desc_meta->value ) ); ?></textarea>
</div>
<?php
}
} else {
echo '-';
} ?>
</td>
<?php
}
對於簡單產品,“ Short Description
列在將商品添加到訂單中時顯示值,但對於可變產品,它會顯示-
當它首先進入custom_admin_order_item_values
函數的else
條件時,然后在編輯商品后,它將正確顯示簡短說明。
這是添加的未經編輯的簡單可變產品的屏幕截圖:
請幫助查找潛在的錯誤。
更新:任何試圖提供幫助的人,我都可以確認問題出在第一個鈎子函數(即add_order_item_description_meta
還是Woocommerce核心中,因為即使您注釋掉了后面的鈎子及其各自的功能,也存在相同的問題。
因此,在將產品添加到訂單時,不會第一次加載可變產品的元數據,但是在刷新(例如通過對其進行編輯)時,元數據會很好地加載。 還要注意,正如我之前提到的,元數據在第一次加載時就可以像簡單產品那樣加載,而無需刷新訂單項。
我已經嘗試過您的代碼,並且可以使用
$meta = array_filter( $meta_data, function( $value ) {
return '_product_short_desc' === $value->key;
} );
代替
$meta = array_filter( $meta_data, function( $value, $key ) {
return '_product_short_desc' === $value->key;
}, ARRAY_FILTER_USE_BOTH );
並在add_order_item_description_meta
添加if語句
function add_order_item_description_meta( $item_id, $item, $product ) {
if ( !$product ) return;
/*... rest of the code ...*/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.