0

我有一个员工的自定义帖子类型,它使用帖子标题作为人名。为了按姓氏排序,我使用顺序过滤器来查找标题中的最后一个单词,然后按它排序:

function posts_orderby_lastname ($orderby_statement) 
{
  $orderby_statement = "RIGHT(post_title, LOCATE(' ', REVERSE(post_title)) - 1) ASC";
    return $orderby_statement;
}

这对于大多数具有正常名字和姓氏的员工来说非常有用,但我不知道如何对像这样的名字执行此操作(所有这些都应按“条款”排序:

圣诞老人

圣诞老人三世

小圣诞老人

圣诞老人克林格

M.圣诞老人老

我假设我可以有一个存储数组,然后检查这些术语(如“Jr.”、“II”等)或检查找到的术语的长度是否大于 3,但我不知道如何将其实现到代码中。任何想法或帮助将不胜感激 - 在此先感谢!

4

4 回答 4

2

我有一个类似的问题,这就是我解决它的方法。您可以扩展您描述的所有边缘情况的 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;
}
于 2014-04-08T23:46:53.480 回答
1

我稍作修改以适应我的需要,因为我的名字就像

黎明A.阿德尔森

蒂莫西·史密斯

小约翰·A·史密斯

        $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>
于 2020-01-23T14:36:11.570 回答
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;
    }
}
于 2020-12-14T00:02:59.707 回答
-1

试试这些插件。它会帮助你。

  1. http://wordpress.org/plugins/post-types-order/

  2. http://wordpress.org/plugins/intuitive-custom-post-order/

  3. http://wordpress.org/plugins/advanced-custom-sort/

于 2013-06-18T15:48:48.630 回答