【发布时间】: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 );
但是,这是针对帖子而不是分类法的,我不确定如何将其重新用于类别而不是帖子。
任何帮助将不胜感激!
【问题讨论】: