Reputation: 1125
I've added a custom column to the "Orders" section of WooCommerce for the shipping zip code. The column and its values appear correctly.
What I cannot figure out is how to make the sorting of this field work (clicking on the column header). Other code examples I could find mention using the hook "manage_edit-shop_order_sortable_columns", but this doesn't seem to be working for this field.
Note: I've seen the other StackOverflow issues about this, but none seem to have sorting working.
/**
* 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 );
}
Upvotes: 5
Views: 9987
Reputation: 1125
I figured it out. Will leave this up here for anyone else trying to add a sorted zip code column. Just add this additional action.
// 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');
}
}
Upvotes: 2
Reputation: 253919
Update 2020:
You can try this too which make it sortable and searchable:
// 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;
}
Code goes in functions.php file of the active child theme (or active theme). Tested and works.
Upvotes: 11
Reputation: 1
Column name order_actions
doesn't exist anymore.
Instead of this use wc_actions
.
I am using WooCommerce v3.6.2
Upvotes: 0