【问题标题】:How to ignore 'the' when sorting WordPress categories alphabetically按字母顺序对 WordPress 类别进行排序时如何忽略“the”
【发布时间】:2017-11-30 12:41:14
【问题描述】:

我有一个显示一长串事件的网站,用户可以按日期和地点对其进行过滤。活动是使用 Events Manager Pro 设置的,我们使用场地的活动类别。

在活动的搜索表单中,场地(类别)按字母顺序显示为下拉菜单。我们希望保持它们按字母顺序排列,但忽略任何场地名称开头的“The”,例如,“The Frog and Fiddle”将出现在 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 函数,在排序时会忽略“The”:

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 );

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

任何帮助将不胜感激!

【问题讨论】:

    标签: php wordpress sorting


    【解决方案1】:

    方式一:使用 slugs 作为 orderby 参数:

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

    1. 从分类 slugs 中删除“the”。(出现在 URL 中的字符串)

    2. 将 orderby 参数从 name 更改为 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'
              ));
      

    方式2:设置自定义orderby:

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

    【讨论】:

    • 嗨,Elvin,谢谢你,尽管如果可能的话,我不想走那条路 - 这些事件是在一个谷歌电子表格中创建的,该电子表格从场地自己填写的许多表格中自动填充,并且经常添加新场地。长话短说,Venue as taxonomy 是从 Venue 名称生成的,它需要在网站上按原样显示,因此这种方法需要对该过程进行一些更改和/或手动进行更改以删除“the”来自蛞蝓——理想情况下,我希望找到一个我可以设置并忘记的解决方案。
    • 好的,我理解你的情况。但是从 slug 中删除开始的“the”字符串很容易,“设置并忘记”的事情。你有插入脚本,你可以在那里注入这个小操作而忘记它。但是,如果您无论如何都不想这样做,我将使用替代解决方案为我的问题添加更新。
    • 对不起 - 我本来可以更清楚的。通过“设置并忘记”,我的意思是适用于可能添加的所有潜在的未来场所,所以这不是我们每次都必须考虑的事情(而且我不知道如何在流程的任何阶段实现自动化)。非常感谢您添加第二个解决方案 - 它运行良好!为您的帮助干杯:-)
    • 嗨 Elvin,很抱歉这么晚才回来。我刚刚意识到这段代码与 Co-Authors Plus 插件的重新排序能力相冲突,我无法更改多个作者的顺序。有没有办法限制此代码 sn-p 使其仅适用于“事件类别”自定义分类法,或不适用于作者?谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 2011-08-29
    相关资源
    最近更新 更多