在WooCommerce管理产品列表中使特色列可排序

在WooCommerce后端的产品列表中,我们可以通过点击星号来使产品成为特色。

但是,如果您有很多产品,并且想在事后查看哪些产品是特色产品,我们必须搜索所有产品。

因此,我希望使此列可排序,以便在排序过程中所有特色产品都显示在前面或后面

使用我到目前为止的代码,可以对列进行排序,但在排序过程中结果会变为空,从而导致0个结果

// 'featured' column sortable on the 'product' page
function sc_sortable_column( $columns ) {
     $columns['featured'] = 'featured';

     return $columns;
}
add_filter( 'manage_edit-product_sortable_columns', 'sc_sortable_column' );


// Orderby 'featured' (product)
function filter_pre_get_posts( $query ) {
     if( ! is_admin() )
         return;

     $orderby = $query->get('orderby');

     // featured, product
     if( $orderby == 'featured') {
         $query->set( 'meta_key', '_featured' );
         $query->set( 'orderby', 'meta_value_num' );
     }
}
add_action( 'pre_get_posts', 'filter_pre_get_posts' );

解决方案

从WooCommerce 3开始,特色产品现在由product_visibility术语featured的自定义分类处理。请参阅:Get WooCommerce featured products in a WP_Query

通常分类不允许对帖子进行排序,如此WordPress Development StackExchange线程中所述:Using wp_query is it possible to orderby taxonomy?。

但例如,使用筛选器posts_clauses可以按特色对产品进行排序。

所以要使用的代码是:

// Make Product "Featured" column sortable on Admin products list
add_filter( 'manage_edit-product_sortable_columns', 'products_featured_sortable_column' );
function products_featured_sortable_column( $columns ) {
     $columns['featured'] = 'featured';

     return $columns;
}

add_filter('posts_clauses', 'orderby_product_visibility', 10, 2 );
function orderby_product_visibility( $clauses, $wp_query ) {
    global $wpdb;

    $taxonomy  = 'product_visibility';
    $term      = 'featured';

    if ( isset( $wp_query->query['orderby'] ) && $term == $wp_query->query['orderby'] ) {
        $clauses['join'] .=<<<SQL
LEFT OUTER JOIN {$wpdb->term_relationships} ON {$wpdb->posts}.ID={$wpdb->term_relationships}.object_id
LEFT OUTER JOIN {$wpdb->term_taxonomy} USING (term_taxonomy_id)
LEFT OUTER JOIN {$wpdb->terms} USING (term_id)
SQL;
        $clauses['where']   .= " AND (taxonomy = '{$taxonomy}' OR taxonomy IS NULL)";
        $clauses['groupby']  = "object_id";
        $clauses['orderby']  = "GROUP_CONCAT({$wpdb->terms}.name ORDER BY name ASC) ";
        $clauses['orderby'] .= ( 'ASC' == strtoupper( $wp_query->get('order') ) ) ? 'ASC' : 'DESC';
    }
    return $clauses;
}

代码放在活动子主题(或活动主题)的函数.php文件中。已测试并正常工作。

相关文章