WooCommerce:按产品属性术语过滤管理订单

Joh*_*ith 2 php wordpress orders woocommerce taxonomy-terms

我有一家商店,里面有很多不同的产品。所有订单都是专门为客户定制的。这意味着当我们在仓库收到产品时,我们需要找到特定产品的订单。现在我们只需手动检查大多数订单即可。

我们想要做的事情是通过自定义属性术语搜索订单,这将为我们节省宝贵的时间。例如:我们对定制订单使用属性“尺寸”。我们有24个“尺寸”术语(例如“12cm”,:16cm”等)。我们想根据尺寸术语查找订单。例如:查找所有尺寸为“48cm”的订单。

基于按 id 或 sku 在后端订单列表中扩展产品项目的搜索,这是我的代码尝试:

add_filter( 'woocommerce_shop_order_search_fields', function ($search_fields ) {
    $orders = get_posts( array( 'post_type' => 'shop_order' ) );

    foreach ($orders as $order_post) {
        $order_id = $order_post->ID;
        $order = new WC_Order($order_id);
        $items = $order->get_items();
    
        foreach( $order->get_items() as $item_id => $item_values ) {
            if ( version_compare( WC_VERSION, '3.0', '<' ) ) {
                $product_id = $item_values['product_id'];
            } else {
                $product_id = $item_values->get_product_id();
            }
             $attribute = $item_values->get_data();
             
            // attribute value
            $value = $attribute['value'];
            
            // attribute slug
            $slug = $attribute['size'];
            
            add_post_meta($order_id, $slug, $value, true); //
        }
    }
    return array_merge($search_fields, array($slug));
}); 
Run Code Online (Sandbox Code Playgroud)

但这没有用。任何帮助表示赞赏。

Loi*_*tec 5

您尝试做的事情在您的情况下并不能真正起作用,并且这是一个非常繁重的过程,可能会导致管理崩溃或降低整个网站的速度。

\n

您可以做的不是显示所有现有尺寸值的下拉列表,以过滤您的订单:

\n

在此输入图像描述

\n

请注意,每个产品属性分类法都以pa_+ 产品属性的 slug 开头。我已在代码中将“尺寸”的产品属性分类设置为pa_size.

\n

有关信息,下面的代码使用非常轻的 SQL 自定义查询。

\n
// Custom function where metakeys / labels pairs are defined\nfunction get_product_attribute_size_terms(){\n    $taxonomy = \'pa_size\';\n    $options  = array();\n\n    foreach ( get_terms( array(\'taxonomy\' => \'pa_size\' ) ) as $term ) {\n        $options[$term->slug] = $term->name;\n    }\n    return $options;\n}\n\n// Add a dropdown to filter orders by variations size\nadd_action( \'restrict_manage_posts\', \'display_admin_shop_order_by_meta_filter\' );\nfunction display_admin_shop_order_by_meta_filter(){\n    global $pagenow, $typenow;\n\n    if( \'shop_order\' === $typenow && \'edit.php\' === $pagenow ) {\n        $domain    = \'woocommerce\';\n        $filter_id = \'by_size\';\n        $current   = isset($_GET[$filter_id])? $_GET[$filter_id] : \'\';\n\n        echo \'<select name="\'.$filter_id.\'">\n        <option value="">\' . __(\'Filter by Size\xe2\x80\xa6\', $domain) . \'</option>\';\n\n        $options = get_product_attribute_size_terms();\n\n        foreach ( $options as $key => $label ) {\n            printf( \'<option value="%s"%s>%s</option>\', $key,\n                $key === $current ? \'" selected="selected"\' : \'\', $label );\n        }\n        echo \'</select>\';\n    }\n}\n\nadd_action( \'pre_get_posts\', \'process_admin_shop_order_product_type_filter\' );\nfunction process_admin_shop_order_product_type_filter( $query ) {\n    global $pagenow, $post_type, $wpdb;\n\n    $filter_id = \'by_size\';\n    $taxonomy  = \'pa_size\';\n\n    if ( $query->is_admin && \'edit.php\' === $pagenow && \'shop_order\' === $post_type\n         && isset( $_GET[$filter_id] ) && $_GET[$filter_id] != \'\' ) {\n\n        $attribute_taxonomy = \'attribute_\'.$taxonomy;\n\n        $order_ids = $wpdb->get_col( $wpdb->prepare("\n            SELECT DISTINCT opl.order_id\n            FROM {$wpdb->prefix}wc_order_product_lookup opl\n            INNER JOIN {$wpdb->prefix}postmeta pm\n                ON opl.variation_id = pm.post_id\n            WHERE pm.meta_key = %s\n                AND pm.meta_value = \'%s\'\n        ", $attribute_taxonomy, esc_attr($_GET[$filter_id]) ) );\n\n        $query->set( \'post__in\', count($order_ids) > 1 ? $order_ids : array(0) ); // Set queried order ids\n\n        $query->set( \'posts_per_page\', 25 ); // Set "posts per page"\n\n        $query->set( \'paged\', ( get_query_var(\'paged\') ? get_query_var(\'paged\') : 1 ) ); // Set "paged"\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

代码位于活动子主题(或活动主题)的functions.php 文件中。经过测试并有效。

\n

相关:在 WooCommerce 管理订单列表页面中按产品帖子类型过滤订单

\n