以下代码在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
列在按订单添加商品时显示值,但对于变量产品,当它进入-
函数else
条件时,它会显示custom_admin_order_item_values
首先,然后在编辑项目后,它会正确显示简短描述。
以下是未经编辑添加的简单和可变产品的屏幕截图:
请帮助找到潜在的错误。
更新:任何人都试图提供帮助,我可以确认问题出在第一个挂钩函数即add_order_item_description_meta
或Woocommerce核心中,因为即使你注释掉后来的钩子和它们各自的功能同样存在问题。
因此,当产品被添加到订单时,第一次不加载变量产品的元数据,但是当通过编辑它来刷新它时,元数据加载正常。另请注意,正如我之前提到的,元数据首次加载为简单产品的预期而无需刷新订单商品。
答案 0 :(得分:0)
我已尝试过您的代码,但它可以使用
$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
function add_order_item_description_meta( $item_id, $item, $product ) {
if ( !$product ) return;
/*... rest of the code ...*/