WordPress按标题中的最后一个单词排序

8

我有一个名为“staff”的自定义文章类型。 我需要在页面上按姓氏字母顺序显示员工信息。 我知道一个解决方法是使用自定义元框,并将名字和姓氏分成两个字段,但我试图避免这样做,因为它看起来很不专业。

我已经编写了一个短代码,可以显示请求的具有员工“类型”分类属性的自定义文章类型。 以下是一个示例:

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

这个很好用,但是缺少按姓氏字母排序的功能。感谢您提供的任何帮助。这是我第一次尝试编写复杂的短代码,请在回答时说明具体细节。

3个回答

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

它完美地工作。有没有办法将第一个函数放在除了functions.php文件之外的其他地方?我正在制作自己的自定义文章类型插件以实现可移植性,如果将来我的客户更改他们的主题,这将会破坏它。谢谢您的帮助。 - Rich Coy
我找到了一篇关于插件开发的文章,其中展示了如何添加一个操作的示例http://plugintutorials.blogspot.com/2011/04/wordpress-plugin-tutorial-part-iv-lets.html - 我猜你只需将它添加到你的插件文件中即可。 - user850010

0
上面发布的答案很好。但是如果列表中的人只用一个名字,就会出现问题。例如,Kanye将出现在结果的顶部,并且不会与K一起排序。
我已经更新了代码,这将按字母顺序排列那些只有一个名字以及有名和姓的人。因此,Kanye现在将与K一起显示。
function posts_orderby_lastname ($orderby_statement) 
{
    $orderby_statement = "RIGHT(post_title, LOCATE(' ', CONCAT(REVERSE(post_title), ' ')) - 1) ASC";
    return $orderby_statement;
}

0
这对我有效:
function my_movie_posts_orderby( $orderby, $query ) {
    if ( $query->is_main_query() && $query->is_post_type_archive( 'my-movie' ) ) {
        $orderby = "SUBSTRING_INDEX(post_title, ' ', -1)";
    }
    return $orderby;
}
add_filter( 'posts_orderby', 'my_movie_posts_orderby', 10, 2 );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接