Сортируйте товары по значению атрибута в пользовательском столбце на странице администратора WooCommerce, но также отображайте товары без атрибута

#php #wordpress #woocommerce #hook-woocommerce #wordpress-hook

Вопрос:

У меня есть настраиваемый столбец для сортировки в панели администратора WooCommerce. В этом столбце я возвращаю значение из определенного атрибута. Все работает нормально, за исключением того, что сортировка не показывает товары без этого атрибута

Так что теперь мы можем называть это только фильтрацией, а не сортировкой. И в этом-то вся проблема. Я хотел бы получить классическую функцию сортировки, которая сначала покажет элементы с этим значением, но ниже остальных элементов без этого значения.

Вероятно, проблема заключается в неправильной обработке запроса в pre_get_posts ?

В настоящее время мои функции заключаются в следующем:

 /**  * Add custom column  */ function append_column($columns) {  $columns['attribute_special'] = 'Special';  return $columns; } add_filter('manage_edit-product_columns', 'append_column');  /**  * Make column sortable  */ function column_sortable($columns) {  $columns['attribute_special'] = 'Special';  return $columns; } add_filter('manage_edit-product_sortable_columns', 'column_sortable');  /**  * Display term value in column  */ function get_value($column, $product_id) {  if ($column == 'attribute_special') {  $wooTerms = wc_get_product_terms($product_id, 'pa_status', ['fields' =gt; 'slugs']);  if (in_array('special', $wooTerms)) {  echo 'Special';  }  } } add_action('manage_product_posts_custom_column', 'get_value', 10, 2);  /**  * Sort query  */ function query_order($query) {  global $post_type, $pagenow;   if (  is_admin()  amp;amp; $post_type == 'product' amp;amp; $pagenow == 'edit.php'  amp;amp; (!empty($_GET['orderby']) || !empty($_GET['order'])) amp;amp; $_GET['orderby'] == 'Special'  ) {  $tax_query = $query-gt;get('tax_query');  if (!is_array($tax_query)) {  $tax_query = [];  }  $taxquery[] = [  'taxonomy' =gt; 'pa_status',  'field' =gt; 'slug',  'terms' =gt; 'special',  ];  $query-gt;set('tax_query', $taxquery);  } } add_action('pre_get_posts', 'query_order');