在WooCommerce管理员订单详细信息页面上显示订单项目表中的产品元

2022-07-05 00:00:00 product php wordpress woocommerce orders

我使用以下代码在WooCommerce管理员订单详细信息页面的订单项目表中显示自定义产品元:

add_action('woocommerce_admin_order_item_headers', 'tempiconsegna_admin_order_item_headers');
function tempiconsegna_admin_order_item_headers() { 
    $column_name = 'Tempi Consegna'; 
    echo '<th>' . $column_name . '</th>'; 
} 

add_action('woocommerce_admin_order_item_values', 'tempiconsegna_admin_order_item_values', 10, 3);
function tempiconsegna_admin_order_item_values($_product, $item, $item_id = null) {
    $value = get_post_meta($_product->post->ID, 'prefix-tempiconsegna', 1); 
    echo '<td>' . $value . '</td>';
}

它显示";prefix-tempiconsegna";,它们是如下所示的自定义元:

  • 3天内可用
  • 现已推出
  • 等.

我的问题是,如果我更改了产品中的可用性,它在以前的订单中也会更改。

如何才能在不更改的情况下显示订单的当前值,同时更新产品的可用性?


解决方案

您当前的代码包含两个错误:

  • 尝试读取空值上的属性&POST";
  • 尝试读取空值上的属性&id";

回答您的问题:这是因为您使用的是get_post_meta()和ProductID,所以如果您调整产品的数据,它也会更改数据的显示位置,在您的情况下,是当前和以前的订单。

为防止出现这种情况,您必须按订单行项目添加数据,这可以通过以下方式完成:

function action_woocommerce_checkout_create_order_line_item( $item, $cart_item_key, $values, $order ) {
    // The WC_Product instance Object
    $product = $item->get_product();
    
    // Get value
    $value = $product->get_meta( 'prefix-tempiconsegna' );
    
    // NOT empty
    if ( ! empty ( $value ) ) {
        $item->update_meta_data( 'prefix-tempiconsegna', $value );
    }
}
add_action( 'woocommerce_checkout_create_order_line_item', 'action_woocommerce_checkout_create_order_line_item', 10, 4 );

然后要在WooCommerce管理订单详细信息页面中显示,请使用:

// Add header
function action_woocommerce_admin_order_item_headers( $order ) {
    // Set the column name
    $column_name = __( 'Tempi Consegna', 'woocommerce' );
    
    // Display the column name
    echo '<th class="my-class">' . $column_name . '</th>';
}
add_action( 'woocommerce_admin_order_item_headers', 'action_woocommerce_admin_order_item_headers', 10, 1 );

//Add content
function action_woocommerce_admin_order_item_values( $product, $item, $item_id ) {
    // Only for "line_item" items type, to avoid errors
    if ( ! $item->is_type('line_item') ) return;

    // Get value
    $value = $item->get_meta( 'prefix-tempiconsegna' );
    
    // NOT empty
    if ( ! empty ( $value ) ) {
        echo '<td>' . $value . '</td>';
    } else {
        echo '<td>Meta not found!</td>';        
    }
}
add_action( 'woocommerce_admin_order_item_values', 'action_woocommerce_admin_order_item_values', 10, 3 );

相关文章