WordPress由标题中的最后一个字排序

时间:2013-05-07 09:58:47

标签: wordpress custom-post-type shortcode alphabetical

我有自定义帖子类型的“员工”。我需要通过页面上的姓氏按字母顺序显示工作人员。我知道一个解决方法是使用自定义元框并将名字和姓氏分成两个字段,但我正在努力避免这种情况,因为这看起来非常虚伪,并且不像使用标题字段那样干净。

我有一个短代码工作,它将显示自定义的帖子类型,其中包含所请求的工作人员“类型”分类属性。这是一个例子:

[staff type="local"] 

我不能只是假设这是我想要的第二个单词,因为有些工作人员是情侣,他们的名字会被列为:“Bob and 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'); 

这很有用,但是缺少按姓氏按字母顺序排列。谢谢你尽你所能的帮助。这是我对精心设计的短代码的第一次真正尝试,所以请您回答一下。

2 个答案:

答案 0 :(得分:13)

试试这个。首先在functions.php中添加以下orderby filter

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' );

答案 1 :(得分:0)

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

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

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