簡體   English   中英

首先在Woocommerce中清空可變產品的訂單商品元數據

[英]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 ...*/

這是屏幕截圖: 圖片來自http://reigelgallarde.me

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM