WordPress自定义订单过滤器按帖子标题中的姓氏过滤

时间:2013-06-18 15:43:14

标签: mysql wordpress filter sql-order-by

我为员工提供了一个自定义帖子类型,它使用帖子标题作为人名。为了按姓氏对此进行排序,我使用订单过滤器查找标题中的最后一个单词,然后按其排序:

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,但我没有想法如何将其实现到代码中。任何想法或帮助将不胜感激 - 提前感谢!

4 个答案:

答案 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;
    }
}