php 选择order_item meta键和值等于某值的所有订单

ou6hu8tu  于 2023-04-28  发布在  PHP
关注(0)|答案(1)|浏览(109)

我正在尝试根据选定的产品差异属性获取特定订单的列表。这是我试图在PHP中使用Woocommerce函数所做的SQL等效:

SELECT * FROM wp_woocommerce_order_items LEFT JOIN wp_woocommerce_order_itemmeta 
ON wp_woocommerce_order_items.order_item_id = wp_woocommerce_order_itemmeta.order_item_id 
WHERE wp_woocommerce_order_itemmeta.meta_key = "size" AND wp_woocommerce_order_itemmeta.meta_value = "A2"

(well,不完全是,因为我想检索一个列表,每个完整的顺序对象匹配的 meta数据,但你明白的想法)。
SQL查询返回以下结果:

基于这里找到的文档,我将其翻译成以下PHP代码:

/**
 * Handle a custom 'customvar' query var to get orders with the 'customvar' meta.
 * @param array $query - Args for WP_Query.
 * @param array $query_vars - Query vars from WC_Order_Query.
 * @return array modified $query
 */
function handle_custom_query_var( $query, $query_vars ) {
    if ( ! empty( $query_vars['size'] ) ) {
        $query['meta_query'][] = array(
            'key' => 'size',
            'value' => esc_attr( $query_vars['size'] ),
        );
    }

    return $query;
}
add_filter( 'woocommerce_order_data_store_cpt_get_orders_query', 'handle_custom_query_var', 10, 2 );

function woocommerce_orders_export()
{
    $orders = wc_get_orders(array('size' => 'A2'));
}

我觉得我错过了什么。上面代码的结果是一个空数组(var_dump($orders);返回array(0){}

42fyovps

42fyovps1#

这里有一个更快更好的解决方案。
创建一个函数,通过参数获取所有订单

function get_orders_by_size($size) {
  global $wpdb;
  $table_prefix = $wpdb->prefix;

  $query = "
    SELECT * 
    FROM {$table_prefix}woocommerce_order_items oi 
    LEFT JOIN {$table_prefix}woocommerce_order_itemmeta oim 
    ON oi.order_item_id = oim.order_item_id 
    WHERE oim.meta_key = 'size' 
    AND oim.meta_value = %s
  ";

  $results = $wpdb->get_results($wpdb->prepare($query, $size));

  return $results;
}

使用方法:

$results = get_orders_by_size('A2');

foreach ($results as $result) {
  // Do something with each order item
}

这里有一个解决方案与过滤器你尝试过

add_filter( 'woocommerce_order_data_store_cpt_get_orders_query', 'custom_get_orders_by_size', 10, 2 );

function custom_get_orders_by_size( $args, $query_vars ) {
  global $wpdb;

  $table_prefix = $wpdb->prefix;
  $meta_key = 'size';
  $meta_value = 'A2';

  $args['join'] .= " LEFT JOIN {$table_prefix}woocommerce_order_itemmeta AS oim ON oim.order_item_id = oi.order_item_id";
  $args['where'] .= $wpdb->prepare( " AND oim.meta_key = %s AND oim.meta_value = %s", $meta_key, $meta_value );

  return $args;
}

相关问题