#php #wordpress #woocommerce #backend #orders
#php #wordpress #woocommerce #серверная часть #заказы
Вопрос:
Я пытаюсь отсортировать все свои заказы в алфавитном порядке в пользовательском столбце, который я создал. Прямо сейчас он может быть отсортирован только по возрастанию и убыванию по времени создания заказа.
Я создал пользовательский столбец для фамилии пользователя, я передал фамилию для выставления счетов внутри этого столбца.
Прямо сейчас я пытаюсь отсортировать его в алфавитном порядке. Я использую следующее:
function add_order_new_column_header( $columns ) {
$new_columns = array();
foreach ( $columns as $column_name => $column_info ) {
$new_columns[ $column_name ] = $column_info;
if ( 'order_total' === $column_name ) {
$new_columns['billing_info'] = __( 'Billing Info', 'my-textdomain' );
}
}
return $new_columns;
}
add_filter( 'manage_edit-shop_order_columns', 'add_order_new_column_header', 20);
add_action( 'manage_shop_order_posts_custom_column', 'add_wc_order_admin_list_column_content' );
function add_wc_order_admin_list_column_content( $column ) {
global $post;
if ( 'billing_info' === $column ) {
$order = wc_get_order( $post->ID );
echo '<p>' . $order->get_billing_last_name() . '</p>';
}
}
add_filter( 'manage_edit-shop_order_sortable_columns', 'my_sortable_name_column' );
function my_sortable_name_column( $columns ) {
$columns['billing_info'] = 'billing_last_name';
return $columns;
}
add_action( 'pre_get_posts', 'name_filter' );
function name_filter( $query ) {
// if it is not admin area, exit the filter immediately
if ( ! is_admin() ) return;
$orderby = $query->get( 'orderby');
if( $orderby == 'billing_info' ) {
$query->set('meta_key', 'billing_last_name' );
$query->set('orderby', 'meta_value');// or meta_value_num
$query->set('order', 'ASC');
}
return $query;
}
Пользовательский столбец можно сортировать, так что это работает, но порядок сортировки, который я хочу, применяется неправильно. Кто-нибудь, кто может сказать мне, почему?
Ответ №1:
У вас есть некоторые незначительные ошибки в вашей pre_get_posts
функции, также правильный мета-ключ _billing_last_name
— нет billing_last_name
.
Поэтому вместо этого используйте следующее:
- Объяснение с помощью тегов комментариев, добавленных в код
// Add a header
function filter_manage_edit_shop_order_columns( $columns ) {
$new_columns = array();
// Loop trough columns
foreach ( $columns as $column_name => $column_info ) {
$new_columns[ $column_name ] = $column_info;
// Compare, add after
if ( $column_name === 'order_total' ) {
$new_columns['billing_info'] = __( 'Billing info', 'woocommerce' );
}
}
return $new_columns;
}
add_filter( 'manage_edit-shop_order_columns', 'filter_manage_edit_shop_order_columns', 10, 1 );
// Populate the custom column
function action_manage_shop_order_posts_custom_column( $column, $post_id ) {
// Compare
if ( $column == 'billing_info' ) {
// Get an instance of the WC_Order object from an Order ID
$order = wc_get_order( $post_id );
// Is a WC_Order
if ( is_a( $order, 'WC_Order' ) ) {
// Get billing last name
$billing_last_name = $order->get_billing_last_name();
// NOT empty
if ( ! empty ( $billing_last_name ) ) {
echo '<p>' . $billing_last_name . '</p>';
}
}
}
}
add_action( 'manage_shop_order_posts_custom_column' , 'action_manage_shop_order_posts_custom_column', 10, 2 );
// Make custom column sortable
function filter_manage_edit_shop_order_sortable_columns( $sortable_columns ) {
return wp_parse_args( array( 'billing_info' => '_billing_last_name' ), $sortable_columns );
}
add_filter( 'manage_edit-shop_order_sortable_columns', 'filter_manage_edit_shop_order_sortable_columns', 10, 1 );
// Orderby for custom column
function action_pre_get_posts( $query ) {
// If it is not admin area, exit
if ( ! is_admin() ) return;
global $pagenow;
// Compare
if ( $pagenow === 'edit.php' amp;amp; isset( $_GET['post_type'] ) amp;amp; $_GET['post_type'] === 'shop_order' ) {
// Get orderby
$orderby = $query->get( 'orderby' );
// Set query
if ( $orderby == '_billing_last_name' ) {
$query->set( 'meta_key', '_billing_last_name' );
$query->set( 'orderby', 'meta_value' );
}
}
}
add_action( 'pre_get_posts', 'action_pre_get_posts', 10, 1 );