【问题标题】:Add columns date created and order number to WooCommerce My account Orders将列创建日期和订单号添加到 WooCommerce 我的帐户订单
【发布时间】:2021-04-19 11:15:20
【问题描述】:

我想在创建订单时向订单及其 order_items 添加两种类型的元数据。我尝试了一些方法,但没有成功。

我要添加的第一个是 $order->get_date_created();作为订单的元数据。

// Add order date as order meta data
add_action( 'woocommerce_checkout_create_order', 'add_order_date_to_order_meta_data', 10, 2 );
function add_order_date_to_order_meta_data( $order, $data ) {
  $order_date = $order->get_date_created();

        $order->update_meta_data( 'order_created', $order_date );
}

第二个是$order->get_id();我想将 order_items 添加到订单本身

// Add order number as order meta data
add_action( 'woocommerce_checkout_create_order', 'add_order_number_to_order_meta_data', 10, 2 );
function add_order_number_to_order_meta_data( $order, $data ) {
  $order_id = $order->get_id();

        $order->update_meta_data( 'order_number', $order_id );
}

我对如何将其添加到订单行一无所知。不知道如何做到这一点。我发现了以下内容,但我认为这是在创建订单之前添加信息?

add_action( 'woocommerce_checkout_create_order_line_item', 'add_meta_to_line_item', 20, 4 );
 
function add_meta_to_line_item( $item, $cart_item_key, $values, $order )
{
    $_p = $item->get_product();
    $key = $order->get_id();
 
    if ( false !== ( $value = $_p->get_meta( $key, true ) ) )
        $item->add_meta_data( $key, true);
    }

然后在我创建了这些元字段之后,我还想将它们添加到前端订单概览中的一列中。

/**
 * Adds a new column to the "My Orders" table in the account.
 *
 * @param string[] $columns the columns in the orders table
 * @return string[] updated columns
 */
function metavalue_add_my_account_orders_column( $columns ) {

    $new_columns = array();

    foreach ( $columns as $key => $name ) {

        $new_columns[ $key ] = $name;

        // add meta_value after order status column
        if ( 'order-status' === $key ) {
            $new_columns['order_number'] = __( 'Order Number', 'textdomain' );
            $new_columns['order_created'] = __( 'Order Created', 'textdomain' );
        }
    }

    return $new_columns;
}
add_filter( 'woocommerce_my_account_my_orders_columns', 'metavalue_add_my_account_orders_column' );

我希望有人能在正确的方向上帮助我。

【问题讨论】:

    标签: php wordpress woocommerce metadata orders


    【解决方案1】:

    更新 - 您的代码中有一些错误和遗漏。请尝试以下方法:

    // Add order number and order date creation as order meta data
    add_action( 'woocommerce_checkout_create_order', 'add_some_order_meta_data', 10, 2 );
    function add_some_order_meta_data( $order, $data ) {
        $order->update_meta_data( '_order_number', $order->get_id() );
        $order->update_meta_data( 'order_date', current_time('Y-m-d H:i:s') );
    }
    
    // Add order Id as custom order item meta data
    add_action( 'woocommerce_checkout_create_order_line_item', 'add_meta_to_line_item', 10, 4 );
    function add_meta_to_line_item( $item, $cart_item_key, $values, $order ) {
        $item->add_meta_data( '_order_id', $order->get_id() );
    }
    
    // Include order number meta data for the method get_order_number()
    add_filter( 'woocommerce_order_number', 'wc_set_order_number', 10, 2 );
    function wc_set_order_number( $order_id, $order ) {
        // Get the order number (custom meta data)
        $order_number = $order->get_meta('_order_number');
    
        return $order_number ? $order_number : $order_id;
    }
    
    // Add columns to my account orders
    add_filter( 'woocommerce_my_account_my_orders_columns', 'add_my_account_orders_columns' );
    function add_my_account_orders_columns( $columns ) {
        $new_columns = array();
    
        foreach ( $columns as $key => $name ) {
    
            $new_columns[ $key ] = $name;
    
            // add meta_value after order status column
            if ( 'order-status' === $key ) {
                $new_columns['number'] = __( 'Order Number', 'textdomain' );
                $new_columns['date-created'] = __( 'Date Created', 'textdomain' );
            }
        }
    
        return $new_columns;
    }
    
    // Column order number content
    add_action( 'woocommerce_my_account_my_orders_column_number', 'my_account_order_number_column_content', 10, 1 );
    function my_account_order_number_column_content( $order ) {
        echo $order->get_order_number();
    }
    
    // Column order date created content
    add_action( 'woocommerce_my_account_my_orders_column_date-created', 'my_account_order_date_created_column_content', 10, 1 );
    function my_account_order_date_created_column_content( $order ) {
        echo $order->get_meta('order_date') ? $order->get_meta('order_date') : $order->get_date_created()->date('Y-m-d H:i:s');
    }
    

    代码位于活动子主题(或活动主题)的functions.php 文件中。经过测试并且可以工作。


    注意事项:

    要获取订单号,您将使用来自订单对象的WC_Order 方法get_order_number()

    您可以按照in here for WC_Date_time date() 方法的说明更改保存的日期格式。

    对于存储为自定义订单项元数据的订单 ID,元键需要以下划线开头,以使其在客户订单和电子邮件通知中不可见。因此,要从订单项目中获取它,您将在 WC_Order_Item_Product 对象 $item 变量上使用 WC_Data get_meta() 方法,例如 $item->get_meta( '_order_id'),或者您也可以使用 get_order_id() 方法,例如 $item->get_order_id()...


    相关:

    【讨论】:

    • 我了解此信息已存储在订单中。但我希望它们是静态的,所以它们不会改变。我们正在使用拆分和组合插件。所以我们希望能够回忆起原始订单的来源。这就是为什么我想将此信息添加为 meta_data
    • 在我的本地设置 (xampp) 上测试此代码(看起来很有趣)时,我在尝试结帐时收到“Internal Server Error”。
    • 不用担心。我不够熟练,无法理解 :) 将缺少的 ) 添加到 $order->update_meta_data( 'order_date', $order->update_meta_data( 'order_date', current_time('Y-m-d H:i:s') ) ); 并按预期工作,尽管创建日期为空白(空)列。
    • 抱歉,它仍然是空的/空白的。 #1:下单,#2:更改为完成 - 下单后或订单状态更改后,created 列中没有数据。
    • 它现在有效,但只适用于新订单(也许这就是意图?)。之前的所有订单都是空白的。
    猜你喜欢
    • 2021-10-27
    • 2019-07-15
    • 1970-01-01
    • 2016-03-12
    • 2021-06-20
    • 2021-06-08
    • 1970-01-01
    • 2018-11-28
    • 2021-06-05
    相关资源
    最近更新 更多