2016-12-29 3 views
1

У меня есть пользовательское поле postmeta, которое хранит сообщение/product_id сериализованным способом. Пример _related_ids =>a:4:{i:0;i:2462;i:1;i:2466;i:2;i:2469;i:3;i:2472;}WooCommerce Custom Product Column Sortable Backed not working

Я покажу товар product_id _related_ids в окне списка товаров WooCommerce (Backed), который работает нормально. Теперь я хочу сделать эту колонку отсортированной. Поэтому я пишу функцию related_product_col_sort, которая подключена к manage_edit-product_sortable_columns. Короткое замыкание не работает. (не работает означает, что он не заказывает product_id правильно).

Вот мой полный код

//_related_ids => a:4:{i:0;i:2462;i:1;i:2466;i:2;i:2469;i:3;i:2472;} 
//manage_product_posts_custom_column 
add_filter('manage_edit-product_columns', 'related_product_col'); 

function related_product_col($columns) { 
    $new_columns = (is_array($columns)) ? $columns : array(); 
    $new_columns['RELATED'] = 'Related Product'; 
    return $new_columns; 
} 

add_action('manage_product_posts_custom_column', 'related_product_col_data', 2); 

function related_product_col_data($column) { 
    global $post; 
    $related_product_ids = get_post_meta($post->ID, '_related_ids', true); 
    if ($column == 'RELATED') { 
     if (isset($related_product_ids) && !empty($related_product_ids)) { 
      echo count($related_product_ids); 
     } else { 
      echo "--"; 
     } 
    } 
} 

add_filter("manage_edit-product_sortable_columns", 'related_product_col_sort'); 

function related_product_col_sort($columns) { 
    $custom = array(
     'RELATED' => '_related_ids' 
    ); 
    return wp_parse_args($custom, $columns); 
} 

Может кто-нибудь помочь мне с правильной логики/код с related_product_col_sort функции.

Спасибо.

ответ

0

Long Answer short - В принципе, если вам нужно сортировать по meta_value, вы не можете его сериализовать. Проверьте https://wordpress.stackexchange.com/questions/87265/order-by-meta-value-serialized-array.

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

Ниже приведены шаги по сортировке данных, если столбец состоит из нормальных данных вместо сериализованного массива.

Есть на самом деле 2 шага, чтобы сделать пользовательский столбец Сортируемого

  1. Зарегистрируйте столбец как Сортируемого
  2. Реализации сортировки логики

Чтобы зарегистрировать столбец как сортируется использовать manage_{YOUR_SCREEN_ID}_sortable_columns фильтра и добавьте свою колонку

Вы уже зарегистрировали свою колонку, используя функцию related_product_col_sort, чтобы выполнить nt функция сортировки у вас есть несколько способов в зависимости от типа данных.

Если данные числовые или простые алфавиты вы можете использовать pre_get_posts действие и установить meta_key и orderby значения

add_action('pre_get_posts', 'manage_wp_posts_my_custom_pre_get_posts', 1); 
function manage_wp_posts_my_custom_pre_get_posts($query) { 

    /** 
    * We only want our code to run in the main WP query 
    * AND if an orderby query variable is designated. 
    */ 
    if ($query->is_main_query() && ($orderby = $query->get('orderby'))) { 

     switch($orderby) { 

     // If we're ordering by 'film_rating' 
     case 'RELATED': 

      // set our query's meta_key, which is used for custom fields 
      $query->set('meta_key', 'RELATED'); 

      /** 
      * Tell the query to order by our custom field/meta_key's 
      * This will only work is the meta_value for the RELATED key is either a number or a simple string 
      */ 
      $query->set('orderby', 'meta_value'); 

      break; 

     } 

    } 
} 

Если сортировка значение является более сложным, как дата

add_filter('posts_clauses', 'manage_wp_posts_my_custom_posts_clauses', 1, 2); 
function manage_wp_posts_my_custom_posts_clauses($pieces, $query) { 
    global $wpdb; 

    /** 
    * We only want our code to run in the main WP query 
    * AND if an orderby query variable is designated. 
    */ 
    if ($query->is_main_query() && ($orderby = $query->get('orderby'))) { 

     // Get the order query variable - ASC or DESC 
     $order = strtoupper($query->get('order')); 

     // Make sure the order setting qualifies. If not, set default as ASC 
     if (! in_array($order, array('ASC', 'DESC'))) 
     $order = 'ASC'; 

     switch($orderby) { 

     // If we're ordering by release_date 
     case 'RELATED': 

      /** 
      * We have to join the postmeta table to 
      * include our release date in the query. 
      */ 
      $pieces[ 'join' ] .= " LEFT JOIN $wpdb->postmeta wp_rd ON wp_rd.post_id = {$wpdb->posts}.ID AND wp_rd.meta_key = '_related_ids'"; 

      // This will only work if the meta_value is a date. 
      $pieces[ 'orderby' ] = "STR_TO_DATE(wp_rd.meta_value,'%m/%d/%Y') $order, " . $pieces[ 'orderby' ]; 

     break; 

     } 

    } 

    return $pieces; 

} 
+0

Я думаю, Я понял, где я ошибаюсь, попробую это и обновит вас. и я использую родственный плагин продукта, который хранит значение в сериализованном виде, я думаю, что мне нужно отредактировать плагин, чтобы упростить упорядочиваемую логику. Благодарю. –