В прошлой статье мы рассмотрели способ, как создать кастомное поле для товара на примере номера складской ячейки или коробки.
Улучшим это решение, сделав созданную колонку сортируемой. Сделать это можно в три шага:
- Указать 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;
}
Как результат, колонка подсвечена как доступная к сортировке: