我在管理区域的列中添加了两个自定义字段,并使它们可排序。一个包含发票编号,一个包含发票价格。按价格对帖子进行排序可以正常工作。不幸的是,按发票编号对帖子进行排序根本不起作用。
这就是我添加新列的方式:
/**
* 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'。
您是否知道为什么排序可能无法使用这些值?
感谢您的帮助!
答案 0 :(得分:1)
我想知道它是否与的值有关
billed_invoice_number
,例如'2018-D22-008','2018-D28-001', '2018-D47-001','2018-D22-005'
是的。 =)
一个简单的解决方法是,将orderby
的{{1}}值从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
,1.00
,0.1
等
例如-1
,为什么不起作用?
简短答案:因为它不是数字值。
更长的答案:当-1.23
设置为2018-D22-008
时,orderby
类将指示MySQL以这种方式将元值转换为数值:{{ 1}},等效于PHP的meta_value_num
或WP_Query
。因此{meta value} + 0
有效,但intval( {meta value} )
无效,导致(int) {meta value}
。
因此,在您提供的示例'201822008' + 0
值的情况下,它们被转换为'2018-D22-008' + 0
(即第一个2018
之前的数字),从而无法对它们进行排序符合预期。 :)