根据Wordpress中标题的一部分降序排序?

时间:2017-03-31 11:29:11

标签: php mysql wordpress

我遇到了如何在Wordpress中对标题进行排序的问题。如果我只知道如何在MySQL中解决这个问题,那就太好了。 (如果某人有特定于wordpress的答案,那对我来说会容易得多)

我有一个数据库,标题(数据库表中的一个字段)称为post_title。标题存储名称和年份,空格为

例如

Sweden 2017
Sweden 2016
Norway 2018
Norway 2019

我想按照以下方式排序:(按年份递减,按名称递增)

Norway 2019
Norway 2018
Sweden 2017
Sweden 2016

更新 我尝试使用WP_Query进行Wordpress内置排序:

$module_args = array(
                'posts_per_page' => -1,
                'post_type' => 'project',        
                'include_children' => false,   
                'orderby' => 'title',
                'order' => 'DESC',
                'no_found_rows' => true          //No pagination needed
            );

//Do the filtering and retrieve all projects with current service
$projects = get_posts( $module_args );

然后我得到了这个结果:

Yacht 2011
Vasastan 2008
Ulrikagatan 2008
Thailand 2010 (?)
Strandvägen 2007

但应该是:

Yacht 2011
Thailand 2010
Ulrikagatan 2008
Vasastan 2008
Strandvägen 2007

5 个答案:

答案 0 :(得分:2)

请使用以下代码获取您需要的内容:

$args = array(
    'orderby' => 'title',
    'order'   => 'DESC',
);
$query = new WP_Query( $args );

答案 1 :(得分:1)

在Mysql中

您可以在int中使用转换为最后四个字符,在此之后使用标题

Order by  CONVERT(right(post_title, 4),UNSIGNED INTEGER) , post_title

答案 2 :(得分:1)

你可以用PHP做到这一点:

$titles = [
  'Sweden 2017',
  'Sweden 2016',
  'Norway 2018',
  'Norway 2019',
];

usort($titles, function($a, $b) {
  $asplit = preg_split('/\s/', $a);
  $bsplit = preg_split('/\s/', $b);

  $strcmp = strcmp($asplit[0], $bsplit[0]);

  if ( $strcmp ) {
    return $strcmp;
  }
  else {
    return $bsplit[1] - $asplit[1];
  }
});

// print_r($titles) yields:
//
// Array
// (
//     [0] => Norway 2019
//     [1] => Norway 2018
//     [2] => Sweden 2017
//     [3] => Sweden 2016
// )

编辑:修正拼写错误,现在可以正常使用

答案 3 :(得分:1)

首先,您需要拆分字符串和数字的值,然后将字符串格式的数字转换为intger,然后根据需要进行排序。

select * from table_name order by
cast(substring(post_title,-4), INTEGER) desc,
SUBSTRING_INDEX(post_title,' ',1) asc

答案 4 :(得分:0)

感谢大家的投入!在提出解决方案时,它有很大的帮助。

这是我的解决方案:

$newsort_projects = array();
foreach ( $projects as $key_item=>$arr_item)
{
    $title = $arr_item->post_title;
    $year_title = substr($title,-4,4);

    $newsort_projects[] = array( 
        'ID' => $arr_item->ID,
        'year'=>$year_title
    );

    }            
    usort($newsort_projects, array($this, 'sort_by_year'));

    $newarr_projects = array();
    foreach ( $newsort_projects as $key_item=>$arr_item )
    {
        foreach($projects as $pkey => $p)
        {
            if ($arr_item['ID'] == $p->ID) {
                $key_to_add = $pkey;
                break;
             }
         }                
         $newarr_projects[] = $projects[$key_to_add];
    }

然后我在类中有一个函数按关键年份对多维数组进行排序:

private function sort_by_year($a, $b) {
       return $b['year']-$a['year'];
}