Сортировка столбцов администратора по настраиваемому полю не работает должным образом

87
7

Я добавил два настраиваемых поля в столбцы моей области администрирования и сделал их отсортированными. Один включает номер счета-фактуры, один включает цену для счета-фактуры. Сортировка сообщений по цене работает отлично. К сожалению, сортировка сообщений по номеру счета не работает вообще.

Вот как я включил новые столбцы:

/**
* Add custom columns for Projects
*/
add_filter("manage_project_posts_columns", "project_custom_columns");
function project_custom_columns($columns){
$new = array();
foreach($columns as $key => $title) {
if ($key=='date') {
$new["invoice_id"] = "Invoice Number";
$new["price"] = "Price";
}
$new[$key] = $title;
}
return $new;
}

/**
* Make project list sortable for invoice id and price
*/
add_filter( 'manage_edit-project_sortable_columns', 'project_custom_sort' );
function project_custom_sort( $columns ) {
$columns['invoice_id'] = 'Invoice Number';
$columns['price'] = 'Price';

return $columns;
}

/**
* Manage project list sorting for invoice id and price
*/
add_action( 'pre_get_posts', 'custom_orderby' );
function custom_orderby( $query ) {
if( ! is_admin() )
return;

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

if( 'Invoice Number' == $orderby ) {
$query->set('meta_key','billed_invoice_number');
$query->set('orderby','meta_value_num');
} else if( 'Price' == $orderby ) {
$query->set('meta_key','project_price');
$query->set('orderby','meta_value_num');
$query->set( 'meta_type', 'numeric' );
}
}

Интересно, связано ли это с значениями billed_invoice_number, например '2018-D22-008', '2018-D28-001', '2018-D47-001', '2018-D22-005'.

Вы не знаете, почему сортировка может не работать с этими значениями?

Спасибо за вашу помощь!

спросил(а) 2021-01-28T00:05:25+03:00 3 месяца, 1 неделя назад
1
Решение
62

Интересно, имеет ли это отношение к значениям billed_invoice_number, например '2018-D22-008', '2018-D28-001', '2018-D47-001', '2018-D22-005'

Да, это имеет. знак равно

Таким образом, простое исправление, чтобы изменить orderby значение для billed_invoice_number от meta_value_num до meta_value как в:

if( 'Invoice Number' == $orderby ) {
$query->set('meta_key','billed_invoice_number');
$query->set('orderby','meta_value'); // <- this
} else if( 'Price' == $orderby ) {
...
}

Вы не знаете, почему сортировка может не работать с этими значениями?

Поскольку мы используем meta_value_num только для мета (или настраиваемого поля), где значение представляет собой числовое значение, например 1, 1.00, 0.1, -1, -1.23 и т.д.

Так, например, 2018-D22-008, почему это не работает?

    Короткий ответ: потому что это не числовое значение.

    Более длинный ответ: Когда orderby установлен в meta_value_num, то WP_Query класс будет инструктировать MySQL для преобразования мета значение в числовое значение следующим образом: {meta value} + 0, что эквивалентно PHP intval( {meta value} ) или (int) {meta value}. Таким образом, '201822008' + 0 работает, но не '2018-D22-008' + 0 что приводит к 2018.

Таким образом, с примером billed_invoice_number значений, предоставленных, они были преобразованы в 2018 (то есть число перед первым -), который, в свою очередь, не смогли быть отсортированы, как ожидалось. :)

ответил(а) 2021-01-28T00:05:25+03:00 3 месяца, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема