Недавно я обновил веб-сайт Woocommerce для использования HPOS и обнаружил, что пользовательская сортировка столбцов больше не работает. В Woocommerce я настраиваю сортируемый столбец для фамилии клиента. Я скорректировал свой код, чтобы использовать мета_запрос для сортировки заказов на основе _shipping_last_name, но результаты не возвращаются. У меня есть столбец, в котором указано правильное значение фамилии, но функция сортировки не выполняет сортировку.
Вот код сортировки на данный момент:
function hpos_args( $query_vars ) {
if (isset($query_vars['orderby']) && $query_vars['orderby'] == 'customer_user'){
$query_vars['meta_query'] = array(array( 'key' => '_shipping_last_name' ));
$query_vars['orderby'] = array('meta_value' => $query_vars['order']);
}
return $query_vars;
}
add_filter( 'woocommerce_order_query_args', 'hpos_args', 10, 1 );
«customer_user» — это заголовок столбца, значения в столбце — это мета_значение для _shipping_last_name.
Этот другой вопрос не касается фильтрации по _shipping_last_name, я не могу найти информацию по этому аспекту вопроса. Я использую woocommerce_order_query_args, как упоминается в другом вопросе.
@Snuffy OP уже задавал вопрос раньше, который я отметил как дублированный, ссылка на stackoverflow.com/q/77366037/3730754 ветка… Но это не помогает при попытке отфильтровать заказы HPOS по фамилии доставки, как сейчас расположен в таблице БД wp_wc_order_addresses в двух столбцах: address_type и last_name, поэтому их больше нельзя фильтровать как метаданные.
Метаданные @phpcoder _shipping_last_name не существуют в заказах HPOS, поскольку теперь они расположены в wp_wc_order_addresses таблице БД в двух столбцах: address_type и last_name, поэтому их больше нельзя фильтровать как метаданные.
@LoicTheAztec, исходя из этой информации, какой лучший метод сортировки по Last_name из таблицы wp_wc_order_addresses из woocommerce_order_query_args? или есть другой метод, на который мне следует обратить внимание?
@phpcoder Если вы не хотите испортить производительность HPOS, вам следует сохранить «фамилию доставки» в качестве метаданных индивидуального заказа для всех существующих заказов, используя простой запрос SQL через PhpMyAdmin, и реализовать специальный код для новых заказов. Затем вы можете использовать этот пользовательский ключ метаданных для фильтрации ваших заказов с помощью хука woocommerce_order_query_args.






Я сделал, как предложил @LoicTheAztec, и создал собственные метаданные для фамилии отправителя. Затем мне удалось отсортировать столбец с помощью следующего кода:
function hpos_args( $query_vars ) {
$query_vars['meta_query'] = array(array( 'key' => '_sorting_name' ));
$query_vars['orderby'] = array('meta_value' => $query_vars['order']);
return $query_vars;
}
add_filter( 'woocommerce_order_query_args', 'hpos_args', 10, 1 );
У меня возникли проблемы с использованием ключа _shipping_last_name, поэтому я выбрал _sorting_name.
Если у вас есть только один метаключ, просто используйте вместо него аргумент запроса «meta_key».
Кроме того, вам необходимо указать аргумент строки запроса «customer_user» order_by, например:
// Define custom sortable column(s)
add_filter( "woocommerce_shop_order_list_table_sortable_columns", 'custom_admin_order_list_sortable_columns' );
function custom_admin_order_list_sortable_columns( $sortable_columns ) {
$sortable_columns['customer_user'] = 'customer_user';
return $customer_user;
}
// Alter the query for custom sortable column(s)
add_filter( 'woocommerce_order_query_args', 'filter_admin_hpos_order_lists', 10, 1 );
function filter_admin_hpos_order_lists( $query_args ) {
if ( isset($_GET['orderby']) && $_GET['orderby'] === 'customer_user' ) {
$query_args['meta_key'] = '_sorting_name';
$query_args['orderby'] = array('meta_value' => $query_args['order']);
}
return $query_args;
}
Код находится в файле function.php вашей дочерней темы (или в плагине). Протестировано и работает.
Прежде чем публиковать свой вопрос, выполните поиск — stackoverflow.com/questions/77366037/…