Wordpress按元值排序

时间:2017-10-20 21:22:01

标签: php wordpress sorting

我有一个问题,我现在正试图解决这个问题并找到一种方法来正确地解决问题。

我有一个大学讲座系列,我需要排序,我可以通过一年的元字段对它进行排序就好了。但是当我按学期进行排序时,它按字母顺序排序,因此最终按冬季,春季,秋季或秋季,春季,冬季进行排序,具体取决于我是否将其告知ASC或DESC。

我需要弄清楚如何以正确的顺序对此进行排序,最好不要在帖子中添加其他字段以获得排序优先级

查询args目前写成如下,这显然有点乱。

$args = array(
              'post_type' => 'mcm_geri-ed',
              'posts_per_page' => $posts_per_page,

              'meta_query' => array(
                  'semester' => array(
                      'key' => 'semester',

                  ),
                  'year' => array(
                      'key' => 'year'
                  )
              ),
              'orderby' => array(

                  'year' => 'DESC',
                  'semester' => array(
                    'value' => 'date'
                  )
              ),
              'paged' => $paged
            );

2 个答案:

答案 0 :(得分:1)

我认为没有办法直接使用WP_Query。如何使用posts_orderby并将SQL的ORDER部分操作为meta_year DESC, meta_semester = 'Spring' DESC, meta_semester = 'Fall' DESC。查看生成的SQL,看看你应该为meta_year和meta_semester使用什么名称(或者真的是trimester)。

这不如将学期更改为数值并在输出时添加名称一样有效,但它会起作用。

答案 1 :(得分:0)

这是我最终做的。它与建议的不同,但使用建议的过滤器来获得结果。由于我为页面模板构建了一个排序系统,if语句还添加了一些其他注意事项。我还在测试环境中写了这个,因此原始代码中的帖子类型不同。

// Custom Orderby filter to return the correct order for semester values. 
add_filter('posts_orderby', 'orderby_pages_callback', 10, 2);
function orderby_pages_callback($orderby_statement, $wp_query) {
    //Making sure this only happens when it needs to. Which is the right post type and if it isn't getting sorted by other functions. 
    if ($wp_query->get("post_type") === "test_semester" && !is_admin() && !isset($_GET['order']) && !isset($_GET['sort']))  {
        return "CAST(mt1.meta_value AS CHAR) DESC, wp_postmeta.meta_value = 'Fall' DESC, wp_postmeta.meta_value = 'Winter' DESC, wp_postmeta.meta_value = 'Spring' DESC,wp_postmeta.meta_value = 'Summer' DESC";

    } else {
        //return your regularly scheduled programming
        return $orderby_statement;
    }
}