Наверх

Как сделать кастомное поле в списке товаров 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;
}

Как результат, колонка подсвечена как доступная к сортировке:

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *