将自定义字段添加到产品库存选项卡并仅在 WooCommerce 管理订单编辑页面上显示值

Add custom field to product inventory tab and display value only on WooCommerce admin order edit page

我已将此代码添加到 functions.php,我希望自定义字段的内容显示在 WooCommerce 后端的订单页面上。

具体来说,填写了此字段信息的每个产品都应向履行订单的管理员用户显示特殊字段信息。 (每个产品在列出SKU和其他数据的区域需要自己的)

此自定义字段出现在 WooCommerce 中每个产品的“库存”选项卡上:

// Add Custom Field to woocommerce inventory tab for variable product

add_action( 'woocommerce_product_options_inventory_product_data', 'wc_custom_add_custom_fields' );

function wc_custom_add_custom_fields() {
  // Print a custom text field
  woocommerce_wp_text_input( array(
  'id' => '_custom_text_field',
  'label' => 'Custom Text Field',
  'description' => 'This is a custom field, you can write here anything you want.',
  'desc_tip' => 'true',
  'placeholder' => 'Custom text'
  ));
}
add_action( 'woocommerce_process_product_meta', 'wc_custom_save_custom_fields' );
function wc_custom_save_custom_fields( $post_id ) {
  if ( ! empty( $_POST['_custom_text_field'] ) ) {
  update_post_meta( $post_id, '_custom_text_field', esc_attr( $_POST['_custom_text_field'] ) );
  }
}

我不希望用户看到此字段中的信息,只希望将在 WooCommerce 订单后端部分完成订单的管理员用户看到。

我找到了将信息获取到订单详细信息部分的挂钩 woocommerce_admin_order_data_after_order_details,但我正在寻找单个产品的挂钩。有什么建议吗?

要仅在 WooCommerce 管理订单编辑页面中显示元数据,您可以使用 woocommerce_before_order_itemmeta 挂钩

要保存字段,您可以使用 woocommerce_admin_process_product_object 挂钩,与过时的 woocommerce_process_product_meta 挂钩相反

所以你得到:

// Add custom field
function action_woocommerce_product_options_inventory_product_data() {
    woocommerce_wp_text_input( array(
        'id'            => '_custom_text_field',
        'label'         => __( 'Custom Text Field', 'woocommerce' ),
        'description'   => __( 'This is a custom field, you can write here anything you want.', 'woocommerce' ),
        'desc_tip'      => 'true',
        'placeholder'   => __( 'Custom text', 'woocommerce' )
    ) );
}
add_action( 'woocommerce_product_options_inventory_product_data', 'action_woocommerce_product_options_inventory_product_data' );

// Save custom field
function action_woocommerce_admin_process_product_object( $product ) {
    // Isset
    if ( isset( $_POST['_custom_text_field'] ) ) {        
        // Update
        $product->update_meta_data( '_custom_text_field', sanitize_text_field( $_POST['_custom_text_field'] ) );
    }
}
add_action( 'woocommerce_admin_process_product_object', 'action_woocommerce_admin_process_product_object', 10, 1 );

// Add before item meta
function action_woocommerce_before_order_itemmeta( $item_id, $item, $product ) { 
    // Only on backend order edit pages
    if ( ! is_admin() ) return; 

    // Targeting line items type only
    if ( $item->get_type() !== 'line_item' ) return;

    // Finds whether a variable is null
    $product = is_null( $product ) ? $item->get_product() : $product;

    // Get meta
    $value = $product->get_meta( '_custom_text_field' );

    // NOT empty
    if ( ! empty ( $value ) ) {
        echo '<p>' . $value . '</p>';
    }
}
add_action( 'woocommerce_before_order_itemmeta', 'action_woocommerce_before_order_itemmeta', 10, 3 );