Woocommerce可排序列不起作用

时间:2015-12-16 12:17:47

标签: woocommerce jquery-ui-sortable

我已使用以下方法在WordPress管理员的Woocommerce订单列表中添加了几个自定义字段列,但排序无法正常工作....

add_filter( 'manage_edit-shop_order_columns', 'my_wc_columns' );
function my_wc_columns($columns){
    $new_columns = (is_array($columns)) ? $columns : array();
    unset( $new_columns['order_actions'] );
    $new_columns['program_id'] = 'Program';
    $new_columns['constituent_id'] = 'Constituent ID';
    $new_columns['order_actions'] = $columns['order_actions'];
    return $new_columns;
}
add_action( 'manage_shop_order_posts_custom_column', 'my_wc_column_values', 2 );
function my_wc_column_values($column){
    global $post;
    if ( $column == 'program_id' ) {
        $program = get_post_meta( $post->ID, '_program_id', true );
        $program_title = get_the_title($program);
        $column_val = (isset($program) && $program>0 ? $program_title : 'All');
        echo '<span>' . my_programs_get_name( $column_val ) . ' (' . $program . ')</span>';
    }
    if ( $column == 'constituent_id' ) {
        $consid = get_post_meta( $post->ID, 'constituent_id', true );
        $column_val = (isset($consid) && $consid != "") ? $consid : "";
        echo '<span>' . $column_val . '</span>';
    }
}
// Make column sortable
add_filter( "manage_edit-shop_order_sortable_columns", 'my_wc_column_sort' );
function my_wc_column_sort( $columns ) {
    $custom = array(
        'program_id'    => '_program_id',
        'constituent_id'    => 'constituent_id',
    );
    return wp_parse_args( $custom, $columns );
}

我希望程序名称可能存在问题,因为它是一个需要通过自定义函数转换为名称的id,但两列都没有正确排序。单击列标题后记录会更改顺序,但我无法确定排序是如何进行的。该程序没有对名称或ID进行排序,两者看似随机但一致。请记住,这两个字段都是自定义字段,可能有也可能没有定义值。我怎样才能对它进行排序?

1 个答案:

答案 0 :(得分:0)

这是https://msdn.microsoft.com/en-us/library/office/fp142381.aspx的一个很好的教程。注册列后,您需要处理实际的排序。可悲的是,这部分并不是自动发生的。未经测试,但改编自上述教程:

add_action( 'pre_get_posts', 'manage_wp_posts_be_qe_pre_get_posts', 1 );
function manage_wp_posts_be_qe_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 'program_id'
         case 'program_id':

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

            /**
             * Tell the query to order by our custom field/meta_key's
             * value
             *
             * If your meta value are numbers, change 'meta_value'
             * to 'meta_value_num'.
             */
            $query->set( 'orderby', 'meta_value' );

            break;

      }

   }

}