首先在Woocommerce

时间:2018-04-23 05:36:26

标签: php wordpress woocommerce hook-woocommerce orders

以下代码在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首先,然后在编辑项目后,它会正确显示简短描述。

以下是未经编辑添加的简单和可变产品的屏幕截图:

enter image description here

请帮助找到潜在的错误。

更新:任何人都试图提供帮助,我可以确认问题出在第一个挂钩函数即add_order_item_description_meta或Woocommerce核心中,因为即使你注释掉后来的钩子和它们各自的功能同样存在问题。

因此,当产品被添加到订单时,第一次不加载变量产品的元数据,但是当通过编辑它来刷新它时,元数据加载正常。另请注意,正如我之前提到的,元数据首次加载为简单产品的预期而无需刷新订单商品。

1 个答案:

答案 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

中添加if语句
function add_order_item_description_meta( $item_id, $item, $product ) {
    if ( !$product ) return;
    /*... rest of the code ...*/

这是一个截图: image by http://reigelgallarde.me