Как сделать кастомное поле в списке товаров Woocommerce сортируемым
В прошлой статье мы рассмотрели возможность программного создания кастомного поля для товара на примере номера складской ячейки или коробки.
Улучшим это решение, сделав созданную колонку сортируемой. Сделать это можно в три шага:
- Указать Woocommerce, что созданная ячейка сортируемая
- Отсортировать вывод по значениям
- Дополнить список записями с пустым значением
Некоторые решения в интернете ограничиваются первыми двумя пунктами, но в таком случае, если значение прописано не у всех товаров, при сортировке по столбцу вы увидите ТОЛЬКО заполненные поля. Если вас устраивает такой вариант, просто не включайте фильтр "posts_where" в ваш код.
Код включается в файл functions.php дочерней темы:
add_filter( 'manage_edit-product_sortable_columns', 'woocommerce_admin_products_box_column_sortable' ); function woocommerce_admin_products_box_column_sortable( $columns ){ $columns['box'] = 'box'; return $columns; } add_action('pre_get_posts', 'add_box_sort', 11, 1); function add_box_sort($query){ $order_by = $_GET['orderby']; $direction = $_GET['order']; if ($order_by == 'box'){ //Overwrite query arguments $query->set('meta_query', array( array( 'key' => '_box_number', 'compare' => 'NOT EXISTS', ) )); $query->set('orderby', 'meta_value_num'); $query->set('order', $direction); } } add_filter('posts_where', 'add_box_where'); function add_box_where($where = ''){ global $wpdb, $wp_query; if(!$wp_query->is_main_query()) return $where; $order_by = $_GET['orderby']; if ($order_by == 'box'){ $where .= " OR ( $wpdb->postmeta.meta_key = '_box_number' )"; } // Don't run this twice remove_filter('posts_where', 'add_box_where'); return $where; } |
Как результат, колонка подсвечена как доступная к сортировке: