Display a product custom field only in WooCommerce Admin single orders

戏子无情 提交于 2021-02-05 08:13:18

问题


This question follows How to show a product custom field (custom SKU) in WooCommerce orders answer to my previous question.

How do I make a product custom field articleid (custom SKU) to be visible only in Admin Order edit pages for each order item?

Also, it does not work for manual orders. How to display a product custom field articleid (custom SKU) on manual orders too?


回答1:


Updated last function to avoid errors with other order item types that "line items".

To make it only visible on admin, In your last function, you will need to change the order item meta key from 'articleid' to '_articleid' (adding an underscore at the beginning of the key) like:

// Save as custom order item meta data and display on admin single orders
add_action( 'woocommerce_checkout_create_order_line_item', 'add_articleid_as_orders_item_meta', 10, 4 );
function add_articleid_as_orders_item_meta( $item, $cart_item_key, $values, $order ) {
    $articleid = $values['data']->get_meta('articleid'); // Get product "articleid"

    // For product variations when the "articleid" is not defined
    if ( ! $articleid && $values['variation_id'] > 0 ) {
        $product   = wc_get_product( $values['product_id'] ); // Get the parent variable product
        $articleid = $product->get_meta( 'articleid' );  // Get parent product "articleid"
    }

    if ( $articleid ) {
        $item->add_meta_data( '_articleid', $articleid ); // add it as custom order item meta data
    }
}

For manual orders you will use the following:

add_action( 'woocommerce_before_save_order_item', 'action_before_save_order_item_callback' );
function action_before_save_order_item_callback( $item ) {
    // Targeting only order item type "line_item"
    if ( $item->get_type() !== 'line_item' )
        return; // exit

    $articleid = $item->get_meta('articleid');

    if ( ! $articleid ) {
        $product = $item->get_product(); // Get the WC_Product Object
        
        // Get custom meta data from the product
        $articleid = $product->get_meta('articleid');
        
        // For product variations when the "articleid" is not defined
        if ( ! $articleid && $item->get_variation_id() > 0 ) {
            $product   = wc_get_product( $item->get_product_id() ); // Get the parent variable product
            $articleid = $product->get_meta( 'articleid' );  // Get parent product "articleid"
        }

        // Save it as custom order item (if defined for the product)        
        if ( $articleid ) {
            $item->update_meta_data( '_articleid', $articleid );
        }
    }
}

Code goes in functions.php file of the active child theme (or active theme). Tested and works.

Related to this thread:

  • How to show a product custom field (custom SKU) in WooCommerce orders
  • Display a product custom field only in WooCommerce Admin single orders for Manual Orders
  • Change order item displayed meta key label in WooCommerce admin order pages


来源:https://stackoverflow.com/questions/65877051/display-a-product-custom-field-only-in-woocommerce-admin-single-orders

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!