我目前正在尝试输出一个音乐标题列表,并希望排序忽略(但仍显示)标题的初始文章。
例如,如果我有一个乐队列表,它将按字母顺序显示在WordPress中,如下所示:
黑色安息日,我想让它按字母顺序显示,而忽略首字母“The”,如下所示:
披头士乐队黑色安息日乐队齐柏林飞艇乐队粉红弗洛伊德滚石乐队我在a blog entry from last year, 这表明以下代码functions.php
:
function wpcf_create_temp_column($fields) {
global $wpdb;
$matches = \'The\';
$has_the = " CASE
WHEN $wpdb->posts.post_title regexp( \'^($matches)[[:space:]]\' )
THEN trim(substr($wpdb->posts.post_title from 4))
ELSE $wpdb->posts.post_title
END AS title2";
if ($has_the) {
$fields .= ( preg_match( \'/^(\\s+)?,/\', $has_the ) ) ? $has_the : ", $has_the";
}
return $fields;
}
function wpcf_sort_by_temp_column ($orderby) {
$custom_orderby = " UPPER(title2) ASC";
if ($custom_orderby) {
$orderby = $custom_orderby;
}
return $orderby;
}
然后将查询包装为add_filter
之前和remove_filter
之后我已尝试过此操作,但在我的网站上不断出现以下错误:
WordPress数据库错误:[“order子句”中的未知列“title2”]
选择wp\\U帖子。*来自wp\\U POST,其中1=1和wp\\U POST。post\\U类型=“发布”和(wp\\U posts.post\\U状态=“发布”或wp\\U posts.post\\U状态=“私有”)按上级(标题2)ASC排序
我不会撒谎,我对WordPress的php部分还很陌生,所以我不确定为什么会出现这个错误。我可以看出这与“title2”列有关,但我的理解是,第一个函数应该处理这个问题。此外,如果有更聪明的方法,我洗耳恭听。我一直在谷歌上搜索这个网站,但我还没有找到很多解决方案。
如果有任何帮助,我使用过滤器的代码如下所示:
<?php
$args_post = array(\'post_type\' => \'release\', \'orderby\' => \'title\', \'order\' => \'ASC\', \'posts_per_page\' => -1, );
add_filter(\'post_fields\', \'wpcf_create_temp_column\'); /* remove initial \'The\' from post titles */
add_filter(\'posts_orderby\', \'wpcf_sort_by_temp_column\');
$loop = new WP_Query($args_post);
remove_filter(\'post_fields\', \'wpcf_create_temp_column\');
remove_filter(\'posts_orderby\', \'wpcf_sort_by_temp_column\');
while ($loop->have_posts() ) : $loop->the_post();
?>