在 Woocommerce 管理员订单列表中添加可排序的自定义列

Add a sortable custom column in Woocommerce Admin Orders list

我已将自定义列添加到 WooCommerce 的 "Orders" 部分,用于运送邮政编码。该列及其值显示正确。

我想不通的是如何对该字段进行排序(单击 header 列)。我可以找到使用挂钩 "manage_edit-shop_order_sortable_columns" 提及的其他代码示例,但这似乎不适用于该领域。

注意:我已经看到关于此的其他 Whosebug 问题,但 none 似乎有排序工作。

/**
 * ADD ZIP CODE TO WOOCOMMERCE ORDERS LIST
 */

// Add column (working)
add_filter( 'manage_edit-shop_order_columns', 'custom_woo_columns_function' );
function custom_woo_columns_function( $columns ) {
    $new_columns = ( is_array( $columns ) ) ? $columns : array();
    unset( $new_columns[ 'order_actions' ] );

    // all of your columns will be added before the actions column
    $new_columns['zipcode'] = 'Zip Code';

    //stop editing
    $new_columns[ 'order_actions' ] = $columns[ 'order_actions' ];
    return $new_columns;
}

// Change order of columns (working)
add_action( 'manage_shop_order_posts_custom_column', 'custom_woo_admin_value', 2 );
function custom_woo_admin_value( $column ) {
    global $post;
    $zip_value = get_post_meta($post->ID, '_shipping_postcode', true);
    if ( $column == 'zipcode' ) {
        echo ( isset( $zip_value ) ? $zip_value : '' );
    }
}

// Sort by custom column (NOT WORKING)
add_filter( "manage_edit-shop_order_sortable_columns", 'custom_woo_admin_sort' );
function custom_woo_admin_sort( $columns )
{
    $custom = array(
        'zipcode'    => '_shipping_postcode',
    );
    return wp_parse_args( $custom, $columns );
}

我明白了。将把它留在这里供任何其他试图添加排序的邮政编码列的人使用。只需添加此附加操作。


// Make sorting by custom column work properly
add_action('pre_get_posts', 'custom_zipcode_orderby');
function custom_zipcode_orderby($query)
{
    if (!is_admin()) return;
    
    $orderby = $query->get('orderby');
    if ('_shipping_postcode' == $orderby) {
        $query->set('meta_key', '_shipping_postcode');
        $query->set('orderby', 'meta_value_num');
    }
}

2020 年更新:

您也可以试试这个,它可以排序和搜索:

// Add a custom column
add_filter( 'manage_edit-shop_order_columns', 'add_custom_shop_order_column' );
function add_custom_shop_order_column( $columns ) {
    $order_actions = $columns['order_actions'];
    unset($columns[ 'order_actions' ]);

    // add custom column
    $columns['postcode'] = __('Zip Code', 'woocommerce');

    // Insert back 'order_actions' column
    $columns['order_actions'] = $order_actions;

    return $columns;
}

// Custom column content
add_action( 'manage_shop_order_posts_custom_column', 'shop_order_column_meta_field_value' );
function shop_order_column_meta_field_value( $column ) {
    global $post, $the_order;

    if ( ! is_a( $the_order, 'WC_Order' ) ) {
        $the_order = wc_get_order( $post->ID );
    }

    if ( $column == 'postcode' ) {
        echo $the_order->get_shipping_postcode();
    }
}

// Make custom column sortable
add_filter( "manage_edit-shop_order_sortable_columns", 'shop_order_column_meta_field_sortable' );
function shop_order_column_meta_field_sortable( $columns )
{
    $meta_key = '_shipping_postcode';
    return wp_parse_args( array('postcode' => $meta_key), $columns );
}

// Make sorting work properly (by numerical values)
add_action('pre_get_posts', 'shop_order_column_meta_field_sortable_orderby' );
function shop_order_column_meta_field_sortable_orderby( $query ) {
    global $pagenow;

    if ( 'edit.php' === $pagenow && isset($_GET['post_type']) && 'shop_order' === $_GET['post_type'] ){

        $orderby  = $query->get( 'orderby');
        $meta_key = '_shipping_postcode';

        if ('_shipping_postcode' === $orderby){
          $query->set('meta_key', $meta_key);
          $query->set('orderby', 'meta_value_num');
        }
    }
}

// Make metakey searchable in the shop orders list
add_filter( 'woocommerce_shop_order_search_fields', 'shipping_postcode_searchable_field' );
function shipping_postcode_searchable_field( $meta_keys ){
    $meta_keys[] = '_shipping_postcode';
    return $meta_keys;
}

代码进入活动子主题(或活动主题)的 functions.php 文件。 已测试并有效。

列名称 order_actions 已不存在。

而不是使用 wc_actions.

我正在使用 WooCommerce v3.6.2