如何忽视'按字母顺序排序WordPress类别时

时间:2017-11-30 12:41:15

标签: php wordpress sorting

我有一个显示很长事件列表的网站,用户可以按日期和地点进行过滤。事件是使用Events Manager Pro设置的,我们正在使用场地的事件类别。

在事件的搜索表单中,场地(类别)按字母顺序显示为下拉列表。我们希望按字母顺序排列它们,但忽略了“'在任何场地名称的开头,例如,青蛙和小提琴'会出现在F下而不是T下。

Events Manager Pro允许自定义模板文件,因此我已将相关文件复制到我的子主题中的相关文件夹树中;这是该文件的代码:

<?php $args = !empty($args) ? $args:array(); /* @var $args array */ ?>
<!-- START Category Search -->
<div class="em-search-category em-search-field">
    <label>
        <span><?php echo esc_html($args['category_label']); ?></span>
        <?php 
            EM_Object::ms_global_switch(); //in case in global tables mode of MultiSite, grabs main site categories, if not using MS Global, nothing happens
            wp_dropdown_categories(array( 
                'hide_empty' => 0, 
                'orderby' =>'name', 
                'name' => 'category', 
                'hierarchical' => true, 
                'taxonomy' => EM_TAXONOMY_CATEGORY, 
                'selected' => $args['category'], 
                'show_option_none' => $args['categories_label'], 
                'option_none_value'=> 0, 
                'class'=>'em-events-search-category'
            ));
            EM_Object::ms_global_switch_back(); //if switched above, switch back
        ?>
    </label>
</div>
<!-- END Category Search -->    

我找到了这个解决方案:https://wordpress.stackexchange.com/questions/216929/ignoring-initial-articles-like-a-an-or-the-when-sorting-queries - 它创建了一个自定义的orderby函数,它忽略了&#39;&#39;排序时:

add_filter( 'posts_orderby', function( $orderby, \WP_Query $q )
{
    // Do nothing
    if( '_custom' !== $q->get( 'orderby' ) )
        return $orderby;

    global $wpdb;

    $matches = 'The';   // REGEXP is not case sensitive here

    // Custom ordering (SQL)
    return sprintf( 
        " 
        CASE 
            WHEN {$wpdb->posts}.post_title REGEXP( '^($matches)[[:space:]]+' )
                THEN TRIM( SUBSTR( {$wpdb->posts}.post_title FROM %d )) 
            ELSE {$wpdb->posts}.post_title 
        END %s
        ",
        strlen( $matches ) + 1,
        'ASC' === strtoupper( $q->get( 'order' ) ) ? 'ASC' : 'DESC'     
    );

}, 10, 2 );

然而,这是针对帖子而不是分类法,我不确定如何将其重新用于应用于类别而不是帖子。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

方式1:使用slug作为orderby参数:

你可以用小技巧来做到这一点。

  1. 从分类标签中删除“the”。(在网址上显示的字符串)

  2. 将orderby参数从名称更改为slug。

           <?php wp_dropdown_categories(array( 
                'hide_empty' => 0, 
                'orderby' =>'slug', 
                'name' => 'category', 
                'hierarchical' => true, 
                'taxonomy' => EM_TAXONOMY_CATEGORY, 
                'selected' => $args['category'], 
                'show_option_none' => $args['categories_label'], 
                'option_none_value'=> 0, 
                'class'=>'em-events-search-category'
            ));
    
  3. 方式2:设置自定义顺序:

      function custom_meta_order($dropdown) {
      $dropdown['orderby'] = "ORDER BY REPLACE(t.name,'The ','')";
      return $dropdown;
    }
    add_filter('terms_clauses','custom_meta_order');