我有一个显示很长事件列表的网站,用户可以按日期和地点进行过滤。事件是使用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 );
然而,这是针对帖子而不是分类法,我不确定如何将其重新用于应用于类别而不是帖子。
任何帮助将不胜感激!
答案 0 :(得分:1)
方式1:使用slug作为orderby参数:
你可以用小技巧来做到这一点。
从分类标签中删除“the”。(在网址上显示的字符串)
将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'
));
方式2:设置自定义顺序:
function custom_meta_order($dropdown) {
$dropdown['orderby'] = "ORDER BY REPLACE(t.name,'The ','')";
return $dropdown;
}
add_filter('terms_clauses','custom_meta_order');