我为员工提供了一个自定义帖子类型,它使用帖子标题作为人名。为了按姓氏对此进行排序,我使用订单过滤器查找标题中的最后一个单词,然后按其排序:
function posts_orderby_lastname ($orderby_statement)
{
$orderby_statement = "RIGHT(post_title, LOCATE(' ', REVERSE(post_title)) - 1) ASC";
return $orderby_statement;
}
这对于大多数具有正常名字和姓氏的员工都很有用,但是我无法弄清楚如何对这些名字这样做(所有这些都应该按照“条款”命令:
圣诞老人
Santa Clause III
Santa Clause Jr。
Santa Clause Kringle
微米。 Santa Clause Sr。
我假设我可以有一个存储的数组,然后检查这些术语(如“Jr。”,“II”等)或检查找到的术语的长度是否大于3,但我没有想法如何将其实现到代码中。任何想法或帮助将不胜感激 - 提前感谢!
答案 0 :(得分:0)
试试这些插件。它会对你有所帮助。
答案 1 :(得分:0)
我有一个类似的问题,这就是我解决它的方式。您可以扩展所描述的所有边缘情况的if语句。
$args = array(
'post_type' => 'page',
'orderby' => 'menu_order',
'posts_per_page' => -1,
'post_parent' => $post->ID,
'order' => 'ASC'
);
$posts = get_posts( $args );
// Order by second word in title, deal with edge cases
$lastname = array();
foreach( $posts as $key => $post ) {
$word = explode( ' ', $post->post_title );
$name = null;
if( strlen($word[1]) == 1 ) {
// Second word only 1 letter, so use third word if set
$name = $word[2];
} elseif( $word[3] == 'Sr.' ) {
// Third word is 'Sr.', so use 2nd word
$name = $word[1];
} else {
$name = $word[1];
}
$lastname[$key] = $name;
}
array_multisort( $lastname, SORT_ASC, $posts );
// Loop through posts
foreach( $posts as $post ) {
echo $post->post_title;
}
答案 2 :(得分:0)
我做了一些修改以满足我的需要,因为我的名字很像
黎明A. Adelson
蒂莫西·史密斯
小约翰·史密斯(John A.Smith)
$args = array(
'post_type' => 'YOUR_POST_TYPE',
'posts_per_page' => -1,
'order' => 'ASC'
);
$posts = get_posts( $args );
// Order by second word in title, deal with edge cases
$lastname = array();
foreach( $posts as $key => $post ) {
$word = explode( ' ', $post->post_title );
$name = null;
if( strlen($word[1]) == 2 ) {
// Second word 1 letter and dot, so use third word if set
$name = $word[2];
} elseif( $word[3] == 'Jr.' ) {
// Third word is 'Jr.', so use 2nd word
$name = $word[2];
} else {
$name = $word[1];
}
$lastname[$key] = $name;
}
array_multisort( $lastname, SORT_ASC, $posts );
// Loop through posts
foreach( $posts as $post ) {
?>
<div>
<?php echo $post->post_title; ?>
</div>
<?php
}
?>
</div>
答案 3 :(得分:0)
这是一种更好的方法,至少其他方法对我完全无效。
这将删除第一个空格之前的所有内容,并对字符串的其余部分应用标准排序。确保根据您的实际需求修改is_main_query()
和is_category()
。
function posts_orderby_lastname( $orderby_statement )
{
if( is_main_query() && is_category() ) {
return "SUBSTRING_INDEX(post_title, ' ', -1)";
} else {
return $orderby_statement;
}
}