В прошлой статье мы рассмотрели способ, как создать кастомное поле для товара на примере номера складской ячейки или коробки.

Улучшим это решение, сделав созданную колонку сортируемой. Сделать это можно в три шага:

  • Указать 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 не будет опубликован. Обязательные поля помечены *