WooCommerce自定义产品列可排序支持不工作

问题描述:

我有一个自定义postmeta字段,它以序列化方式存储post/product_id。示例_related_ids =>a:4:{i:0;i:2462;i:1;i:2466;i:2;i:2469;i:3;i:2472;}WooCommerce自定义产品列可排序支持不工作

我在WooCommerce产品清单屏幕(支持)中显示_related_ids的product_id计数,该工作正常。现在我想让这个列可排序。所以我写了一个函数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功能正确的逻辑/代码。

谢谢。

Long答案总之 - 基本上,如果您需要对meta_value进行排序,则无法将其序列化。检查https://wordpress.stackexchange.com/questions/87265/order-by-meta-value-serialized-array

我认为最适合您的解决方案是将相关产品的数量存储在新的meta_key中,并使用它对列进行排序。

如果列包含普通数据而不是序列化数组,则下面是对数据进行排序的步骤。

实际上有两个步骤,以使自定义列排序

  1. 注册为排序
  2. 实现排序逻辑

要注册列排序您使用manage_{YOUR_SCREEN_ID}_sortable_columns过滤器列并添加您的列

您已使用related_product_col_sort函数注册您的列,以执行根据数据类型的不同,排序功能有几种方法。

如果数据是数字或简单的字母可以使用pre_get_posts行动,并设置meta_keyorderby

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

我想我明白了我错在哪里,会尝试一下并且会更新你。而且我正在使用相关产品插件以序列化方式存储值,我想我必须编辑该插件以使排序逻辑更容易。谢谢。 –