Woocommerce 可排序列不起作用

Woocommerce sortable columns not working

我使用以下方法在 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 排序,两者看似随机但一致。请记住,这两个字段都是自定义字段,可能有也可能没有定义值。我怎样才能使它可排序?

custom sortable columns 上有一个很好的教程。注册列后,您需要处理实际的排序。可悲的是,那部分不会自动发生。未经测试,但改编自上述教程:

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;

      }

   }

}