从 WooCommerce 中的订单项目中获取变体的自定义值

Get custom values of variations from order items in WooCommerce

我正在尝试获取客户在结账时从订单中选择的变化值(通过 id 或其他方式)以映射到用于构建 API [=39 的变量 $storage 和 $tier =].

我尝试了多种方法将数据添加到变量中,但是 API url 失败了,这让我相信我的变量没有缩进值。

我目前的代码如下(摘录):

add_action( 'woocommerce_order_status_processing', 'my_function' );
    function my_function( $order_id ) {
    $order = wc_get_order( $order_id );
    $items = $order->get_items();
        foreach ( $items as $key => $item ) {
                $storage = get_post_meta( $key, 'attribute_addon-storage' );
                $tier = get_post_meta( $key, 'attribute_subscription-type' );

有谁知道我将如何获取这两个变量 addon-storage 和订阅类型的值?

我可以在 woocommerce_order_itemmeta table 中看到我想在我的数据库中获取的值。

我可以从那里获取值吗?

编辑:

因此,根据 LoicTheAztec 的建议,获取我在 woocommerce_order_itemmeta table 中看到的数据值的正确方法是 $meta_key:

add_action( 'woocommerce_order_status_processing', 'my_function', 10, 1 );
    function my_function( $order_id ) {
    $order = wc_get_order( $order_id );
    $items = $order->get_items();
        foreach ( $items as $key => $item ) {
                $storage = wc_get_order_item_meta( $key, 'addon-storage', true );
                $tier = wc_get_order_item_meta( $key, 'subscription-type', true );
                $anyMetaValue = wc_get_order_item_meta( $key, '$meta_key', true );

// Then I can create the variable I need in the the API url with:

$package = "$tier$storage";

更新: 您混淆了订单 post 元数据和订单项元数据,它们是非常不同的东西,位于不同的数据库表中。

此外,您的代码不完整,使用 get_post_meta()$key(这是项目 ID)将无法获得任何东西...

  • get_post_meta( $order_id, 'meta_key', true ) 函数将查找订单 post 元数据(与订单项目无关)并使用订单 ID 作为参数。
  • wc_get_order_item_meta( $item_id, 'meta_key', true ) 函数将查找相关的订单项目元数据,并将使用项目 ID 作为参数(代码中的 $key)...
    所以这个函数应该需要在 foreach 循环中使用,而不是在 foreach 循环中获取订单项目数据。

然后2种方式:

  1. 您应该在您的数据库中检查 wp_postmetawp_woocommerce_order_itemmeta 表中的最后一个订单 ID(通过 phpMyAdmin),以查看数据位于何处……
  2. 或者您可以使用以下代码(仅用于测试)输出您的数据所在的订单项目原始数据。
    此原始数据将输出在商店存档产品页面,仅可见对于已登录的管理员。您将需要在其中定义订单 ID。

这是这个测试函数

add_action( 'woocommerce_before_main_content', 'my_testing_order_function' );
function my_testing_order_function() {

    // Define an Order ID
    $order_id = 724;

    // Only for admin user role
    if( ! current_user_can('edit_products')) return;

    $order = wc_get_order( $order_id ); // The order object

    foreach ( $order->get_items() as $item_id => $item ) {
        // Order item meta data Raw output
        echo "<pre>ORDER ITEM META DATA - (Item_id $item_id):"; print_r($item->get_data()); echo'</pre>';
        echo "<pre>ORDER ITEM META META DATA - (Item_id $item_id):"; print_r($item->get_meta_data()); echo'</pre>';
    }
}

现在您拥有了定位和获取数据所需的一切。下面的代码通常应该适合您,允许您从您的变体中获取数据:

add_action( 'woocommerce_order_status_processing', 'my_function', 10, 1 );
function my_function( $order_id ) {
    $order = wc_get_order( $order_id );
    foreach ( $order->get_items() as $key => $item ) {
        // get the data
        $storage = wc_get_order_item_meta( $item_id, 'attribute_addon-storage', true );
        $tier = wc_get_order_item_meta( $item_id, 'attribute_subscription-type', true );
    }
}