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

标签 php sql wordpress woocommerce orders

我是 WooCommerce 新手,我想自定义管理订单列表页面。所以基本上我创建了新的产品类型。现在我还限制客户可以一次购买我的定制产品类型的产品或简单产品类型的产品。

现在在管理订单列表页面中,我想显示具有简单产品类型的产品的订单。我怎样才能做到这一点?

我搜索了很多,我找到了一个插件,它具有过滤器来按产品而不是产品类型显示订单。在研究该插件时,我知道我可以使用 posts_where 操作来做到这一点。但我没有正确的想法。

最佳答案

以下功能将向管理订单列表添加额外的过滤器下拉列表,允许您根据订单项产品帖子类型过滤订单:

add_action( 'restrict_manage_posts', 'admin_shop_order_by_product_type_filter' );
function admin_shop_order_by_product_type_filter(){
    global $pagenow, $post_type;

    if( 'shop_order' === $post_type && 'edit.php' === $pagenow ) {
        $domain     = 'woocommerce';
        $filter_id  = 'filter_product_type';
        $current    = isset($_GET[$filter_id])? $_GET[$filter_id] : '';
        $query_args = ['taxonomy' => 'product_type', 'fields' => 'names', 'orderby' => 'order'];

        echo '<select name="'.$filter_id.'">
        <option value="">' . __('Filter by Product post type', $domain) . '</option>';

        foreach ( get_terms($query_args) as $term_name ) {
            printf( '<option value="%s"%s>%s</option>', $term_name,
                $term_name === $current ? '" selected="selected"' : '', ucfirst($term_name) );
        }
        echo '</select>';
    }
}

add_action( 'pre_get_posts', 'process_admin_shop_order_product_type_filter' );
function process_admin_shop_order_product_type_filter( $query ) {
    global $pagenow, $post_type, $wpdb;

    $filter_id = 'filter_product_type';

    if ( $query->is_admin && 'edit.php' === $pagenow && 'shop_order' === $post_type
         && isset( $_GET[$filter_id] ) && $_GET[$filter_id] != '' ) {

        $order_ids = $wpdb->get_col( "
            SELECT DISTINCT o.ID
            FROM {$wpdb->prefix}posts o
            INNER JOIN {$wpdb->prefix}woocommerce_order_items oi
                ON oi.order_id = o.ID
            INNER JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim
                ON oi.order_item_id = oim.order_item_id
            INNER JOIN {$wpdb->prefix}term_relationships tr
                ON oim.meta_value = tr.object_id
            INNER JOIN {$wpdb->prefix}term_taxonomy tt
                ON tr.term_taxonomy_id = tt.term_taxonomy_id
            INNER JOIN {$wpdb->prefix}terms t
                ON tt.term_id = t.term_id
            WHERE o.post_type = '$post_type'
            AND oim.meta_key = '_product_id'
            AND tt.taxonomy = 'product_type'
            AND t.name = '{$_GET[$filter_id]}'
        ");

        $query->set( 'post__in', $order_ids ); // Set the new "meta query"

        $query->set( 'posts_per_page', 25 ); // Set "posts per page"

        $query->set( 'paged', ( get_query_var('paged') ? get_query_var('paged') : 1 ) ); // Set "paged"
    }
}

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

关于php - 在 WooCommerce 管理订单列表页面中按产品帖子类型过滤订单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56132215/

相关文章:

php - 如何使用 order by 为表建立索引?

java - 具有多个条件的 JDBC 删除查询

sql - 忽略并发插入中的错误

php - 确定 PHP 下周

php - 命名空间行出现语法错误意外的 T_STRING

sql - 使用附加列在配置单元中创建表

php - 保护 PHP 文件不被直接访问

javascript - 如何检测wp_editor的变化?

wordpress - 如何修改我的自定义小部件以支持 qtranslate?

php - 有没有办法通过 Pentaho 将任何新的 MySQL 表自动复制到 HANA DB?