在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文件中。已测试并正常工作。
相关文章