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

Php 从WooCommerce中的订单项获取变体的自定义值,php,wordpress,woocommerce,metadata,orders,Php,Wordpress,Woocommerce,Metadata,Orders,我试图从订单(通过id或其他方式)获取客户在签出时选择的变量值,以映射到用于构建API url的变量$storage和$tier 我尝试了多种方法将数据获取到变量上,但是API url失败了,这使我相信我的变量上没有缩进值 我目前的代码如下(摘录): 有人知道我将如何获取这两个变量的值吗?addon storage和subscription type 我可以在woocommerce\u order\u itemmeta表中看到我想要在数据库中获取的值 我可以从那里得到值吗 编辑: 因此,按照pe

我试图从订单(通过id或其他方式)获取客户在签出时选择的变量值,以映射到用于构建API url的变量$storage和$tier

我尝试了多种方法将数据获取到变量上,但是API url失败了,这使我相信我的变量上没有缩进值

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

有人知道我将如何获取这两个变量的值吗?
addon storage
和subscription type

我可以在
woocommerce\u order\u itemmeta
表中看到我想要在数据库中获取的值

我可以从那里得到值吗

编辑:

因此,按照per的建议,将woocommerce\u order\u itemmeta表中的数据值作为$meta\u键获取的正确方法是:

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元数据和订单项目元数据混淆了,它们是非常不同的东西,位于不同的数据库表中

此外,您的代码不完整,使用带有
$key
(即项目ID)的
get\u post\u meta()
无法获取任何内容

  • get\u post\u meta($order\u id,'meta\u key',true)
    函数将查找order post元数据(与订单项目无关),并使用order id作为参数
  • wc_get_order_item_meta($item_id,'meta_key',true)
    函数将查找已实现的订单项元数据,并将该项id用作参数(代码中的
    $key
    )。
    因此,这个函数应该在foreach循环中使用,在这里您可以获得订单项数据
然后是两种方式:

  • 您应该在数据库中检查
    wp\u postmeta
    wp\u woocommerce\u order\u itemmeta
    表中的上一个订单ID(通过phpMyAdmin),以查看数据的位置
  • 或者,您可以使用以下代码(仅用于测试),将订单项原始数据输出到数据所在的位置
    此原始数据将在商店、存档产品页面中输出,仅对登录的管理员可见。您需要在其中定义订单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>';
        }
    }
    

    谢谢你的澄清,我确实把这两个搞混了。不幸的是,当前代码也无法使API url正常工作。数据作为附加存储和订阅类型出现在数据库中的woocommerce\u order\u itemmeta下,因此我将行更改为:wc\u get\u order\u itemmeta($key,addon storage,true);wc_get_order_item_meta($key,subscription type,true);我得到的url变量是:$package='$tier$storage';但是,API调用未成功进行。我是否至少正确地提取了数据?我让它工作了!!!我是个白痴,在url变量周围使用了“而不是”。非常感谢您的帮助!!!!
    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 );
        }
    }