8

我有一个“员工”的自定义帖子类型。我需要得到这个以在页面上按姓氏字母顺序显示员工。我知道一种解决方法是使用自定义元框并将名字和姓氏分成两个字段,但我试图避免这种情况,因为这看起来很老套,而且不像使用标题字段那样干净。

我有一个短代码可以显示自定义帖子类型以及请求的人员“类型”分类属性。这是一个例子:

[staff type="local"] 

我不能只是假设这是我想要的标题中的第二个词,因为有些员工是夫妻,他们的名字都会被列为:“Bob 和 Cindy Smith”。

这是我到目前为止的简码。

function get_staff($atts) {
    extract( shortcode_atts( array( 'type' => 'international' ), $atts ) );
    $loop = new WP_Query(
        array (
            'post_type' => 'staff',
            'orderby' => 'title',
            'staff-type' => $type
        )
    );

if ($loop->have_posts()) {
    $output = '<div class="staff">';

    while($loop->have_posts()){
        $loop->the_post();
        $meta = get_post_meta(get_the_id());

        $output .= '
            <div class="staff" style="float: left; display: block; border: 1px solid #CCC; margin: 10px; padding: 12px; background-color: #eee;">
                <a href="' . get_permalink() . '">
                    ' . get_the_post_thumbnail($post->ID, 'thumbnail') . '<br />
                ' . get_the_title()  . '</a><br />
                ' . get_the_excerpt() . '
            </div>
        ';
    }
    $output .= "</div>";
} else {
    $output = 'No Staff Meet This Criteria Yet.';
}

return $output;
};

add_shortcode('staff', 'get_staff'); 

这很好用,但缺少按姓氏字母排序。谢谢你尽你所能的帮助。这是我第一次真正尝试精心制作的简码,所以请具体说明您的答案。

4

2 回答 2

14

尝试这个。首先在functions.php中添加如下orderby过滤器

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

然后像这样在查询中使用它

add_filter( 'posts_orderby' , 'posts_orderby_lastname' );
    $loop = new WP_Query(
        array (
            'post_type' => 'staff',
            'staff-type' => $type
        )
    );

并在循环后移除过滤器

remove_filter( 'posts_orderby' , 'posts_orderby_lastname' );
于 2013-05-07T12:15:11.197 回答
0

上面发布的答案很棒。但是,如果列表中的人只有一个名字,就会出现问题。例如,Kanye 会出现在结果的顶部,并且不会与 Ks 一起排序。

我已经更新了代码,这将按字母顺序排列那些只有一个名字的人以及那些有名字和姓氏的人。所以 Kanye 现在将与 Ks 一起出现。

function posts_orderby_lastname ($orderby_statement) 
{
    $orderby_statement = "RIGHT(post_title, LOCATE(' ', CONCAT(REVERSE(post_title), ' ')) - 1) ASC";
    return $orderby_statement;
}
于 2021-01-15T21:20:57.377 回答