按自定义字段对管理列进行排序无法正常工作

时间:2018-07-18 14:26:02

标签: php wordpress sorting

我在管理区域的列中添加了两个自定义字段,并使它们可排序。一个包含发票编号,一个包含发票价格。按价格对帖子进行排序可以正常工作。不幸的是,按发票编号对帖子进行排序根本不起作用。

这就是我添加新列的方式:

/**
 * 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'。

您是否知道为什么排序可能无法使用这些值?

感谢您的帮助!

1 个答案:

答案 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 }},11.000.1

例如-1为什么不起作用

  • 简短答案:因为它不是数字值。

  • 更长的答案:当-1.23设置为2018-D22-008时,orderby类将指示MySQL以这种方式将元值转换为数值:{{ 1}},等效于PHP的meta_value_numWP_Query。因此{meta value} + 0有效,但intval( {meta value} )无效,导致(int) {meta value}

因此,在您提供的示例'201822008' + 0值的情况下,它们被转换为'2018-D22-008' + 0(即第一个2018之前的数字),从而无法对它们进行排序符合预期。 :)