![](/img/trans.png)
[英]Display product custom field as order item meta on WooCommerce admin order pages
[英]Keep and display product custom field value in WooCommerce Admin Order pages
我創建了一些代碼來顯示 woocommerce>>orders 上的庫存可用性。 見圖片(特別注意)。
問題是,如果我更改自定義字段文本,那么所有以前的訂單都會更新為新的自定義字段文本。
例如:一位客戶在 2021 年 1 月確認了產品訂單,其中自定義字段文本為“產品將於 2021 年 3 月上市”。 第二位客戶在 2021 年 3 月確認了相同的產品訂單,其中新的自定義字段文本為“產品將於 2021 年 5 月上市”。
兩個訂單都顯示最后一個自定義字段文本“產品將於 2021 年 5 月上市”。
我想用舊的自定義字段文本顯示舊訂單,用新的自定義字段文本顯示新訂單。 如果任何機構可以解決它或可以給我一些想法,它將對我有幫助。
add_action( 'woocommerce_admin_order_data_after_shipping_address', 'display_order_data_in_admin' );
function display_order_data_in_admin( $order ){
?>
<h4><?php _e( 'Speciellnotering', 'woocommerce' ); ?></h4>
<?php
foreach ( $order->get_items() as $item_id => $item ) {
//fetch text from custom_field
$product = $item->get_product();
$availability = $product->get_availability();
$quantity = $item->get_quantity();
$product_id = $item->get_product_id();
$variation_id = $item->get_variation_id();
$sku = get_post_meta( $variation_id, '_sku', true );
$custom_text_message = get_post_meta( $variation_id, 'custom_field', true );
if($product->is_type('variable')){
if($custom_text_message && $quantity<=-1){
$availability['availability'] = $custom_text_message;
}elseif(!$custom_text_message && $quantity<=-1){
$availability['availability'] = __('Right now is not available', 'woocommerce');
}else{
$availability['availability'] =__('Finns i lager', 'woocommerce');
}
?>
<?php echo __( 'Artnr' ).' ('.$sku.')' .': '.$availability['availability'].'<br>';
//for simple product
}else{
$product = $item->get_product();
$sku=$product->get_sku();
$availability = $product->get_availability();
$custom_stock_message=get_post_meta( $product_id, 'custom_stock_message', true );
$quantity = $item->get_quantity();
if($product->is_type('simple')){
if($custom_stock_message && $quantity<=0){
$availability['availability'] = $custom_stock_message;
}elseif(!$custom_stock_message && $quantity<=0){
$availability['availability'] = __('Right now is not available', 'woocommerce');
}else{
$availability['availability'] =__('Finns i lager', 'woocommerce');
}
}
?>
<?php echo __( 'Artnr' ).' ('.$sku.')' .': '.$availability['availability'].'<br>';
}
}?>
<?php
}
更新
相反,您應該首先將您的產品自定義字段保存為自定義訂單項目元數據,以避免在您的產品自定義字段更改時發生更改。
我已經簡化並優化了您的初始代碼。 $item->get_quantity()
值也總是大於零。 因此,在下面的代碼中,我使用了產品庫存數量:
// Save product custom availiability text as custom hidden order item meta data
add_action( 'woocommerce_checkout_create_order_line_item', 'save_custom_image_id_to_order_item', 10, 4 );
function save_custom_image_id_to_order_item( $item, $cart_item_key, $values, $order ) {
$product = $item->get_product();
// Product variation type
if ( $item->get_variation_id() > 0 ) {
$availability = $product->get_meta('custom_field');
}
// Other product types
else {
$availability = $product->get_meta('custom_stock_message');
}
if ( empty($availability) ) {
// save as hidden order item meta data
$item->update_meta_data('_availability', array($availability) );
}
}
// Display order item availability in admin orders
add_action( 'woocommerce_admin_order_data_after_shipping_address', 'display_order_item_availability_in_admin_orders' );
function display_order_item_availability_in_admin_orders( $order ){
echo '<h4>' . __( 'Speciellnotering', 'woocommerce' ) . '</h4>';
foreach ( $order->get_items() as $item ) {
$product = $item->get_product();
$quantity = $item->get_quantity();
$stock_qty = $product->get_stock_quantity();
$sku = $product->get_sku();
$availability = $item->get_meta('_availability'); // Get order item custom field
$availability = reset($availability); // Convert array to string
if ( $stock_qty < 0 ) {
if ( empty($availability) ) {
$availability = __('Inte tillgänglig just nu', 'woocommerce');
}
} else {
$availability = __('Finns i lager', 'woocommerce');
}
echo __('Artnr', 'woocommerce') . ' (' . $sku . ')' . ': ' . $availability . '<br>';
}
}
代碼進入活動子主題(或活動主題)的functions.php文件。 它應該工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.