【问题标题】:Keep and display product custom field value in WooCommerce Admin Order pages在 WooCommerce 管理订单页面中保留和显示产品自定义字段值
【发布时间】:2021-06-26 11:57:35
【问题描述】:

我创建了一些代码来显示 woocommerce>>订单上的库存可用性。见图片(特殊注释)。

问题是,如果我更改自定义字段文本,那么之前的所有订单都会更新为新的自定义字段文本。

例如:一位客户在 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
}

【问题讨论】:

  • 您将此自定义文本存储在产品或产品变体上,那么您期望会发生什么?如果您想要以特定顺序针对特定项目的特定内容 - 那么然后将其存储在 该项目上。
  • 如何在产品或特定项目中存储自定义文本?你能写示例代码吗?那么我很容易理解。
  • 在您的代码中,您使用的是$quantity = $item-&gt;get_quantity();,其值始终最多为1 (大于零),因此$quantity&lt;=-1或@ 987654326@ 永远是假的……这意味着在你的 IF / ELSE 语句中你总是落在 ELSE 部分。
  • 嗨 LoicTheAztec,问题不在于 if else 逻辑......逻辑运行良好并获得了我的预期输出。但是已经描述的问题是,当我在必要时更改自定义字段的文本时,它会影响所有(新+旧)订单。

标签: php wordpress woocommerce backend custom-fields


【解决方案1】:

更新

相反,您应该首先将您的产品自定义字段保存为自定义订单项元数据,以避免在您的产品自定义字段更改时发生更改。

我已经简化并优化了您的初始代码。 $item-&gt;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 文件中。它应该可以工作。

【讨论】:

  • 感谢 LoicTheAztec,但我更改了自定义字段/自定义库存消息,然后仍然显示所有订单的新文本。 'Inte tillgänglig just nu' 和 'Finns i lager' 条件我没有问题。我对自定义字段(可变产品)和自定义库存消息(简单产品)有疑问。我总是根据供应商信息修改这 2 个字段。当我在 2021 年 3 月修改文本时,它会影响 3 月之前的所有订单。我希望修改后的文本将影响三月之后的所有订单,三月之前的所有订单都将保持不变。提前致谢
  • @EyahyaKhan 我的第二个函数出现错误:将错误的$availability = $product-&gt;get_meta('_availability'); 替换为正确的$availability = $item-&gt;get_meta('_availability');... 现在我的代码只是基于您的问题代码的示例,它向您展示了正确的方法将您的产品自定义字段值保存为自定义订单项元数据,并在单个订单页面中显示“Artnr”文本的函数中使用该值。如果此答案回答了您最初的问题,请accept 回答,谢谢。
猜你喜欢
  • 2017-12-13
  • 2019-04-14
  • 2014-11-14
  • 2018-10-01
  • 1970-01-01
  • 2019-06-21
  • 1970-01-01
  • 1970-01-01
  • 2017-06-24
相关资源
最近更新 更多