Сделать избранный столбец сортируемым в списке продуктов администратора Woocommerce - PullRequest
3 голосов
/ 01 августа 2020

В бэкэнде 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' );

1 Ответ

2 голосов
/ 02 августа 2020

Начиная с WooCommerce 3, избранные продукты теперь обрабатываются product_visibility настраиваемой таксономией для термина featured. См .: Получить избранные продукты WooCommerce в WP_Query

Обычно таксономии не позволяют сортировать сообщения , как описано в этой ветке WordPress Development StackExchange: Можно ли с помощью wp_query упорядочить по таксономии? .

Но, например, с помощью фильтра 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;
}

Код входит в functions. php файл вашей активной дочерней темы (или активной темы). Проверено и работает.

...