I need to sort items in a query by the second word of the title (last name) unless there is only one word, then I need to sort by first name instead.
I added this to my functions file and called it in the query with a filter:
function posts_orderby_lastname ($orderby_statement)
{
$orderby_statement = "RIGHT(post_title, LOCATE(' ', REVERSE(post_title)) - 1) ASC";
return $orderby_statement;
}
<?php
add_filter( 'posts_orderby' , 'posts_orderby_lastname' );
$args=array(
'post_type' => 'artists',
'showposts' => -1,
'order' => 'ASC'
);
$my_query = null;
$my_query = new WP_Query($args);
if( $my_query->have_posts() ) {
while ($my_query->have_posts()) : $my_query->the_post();
?>
<div class="block item">
<a href="<?php the_permalink(); ?>">
<div class="inner">
<?php if ( has_post_thumbnail() ) { the_post_thumbnail(); } ?>
<div class="block-content">
<h4><?php the_title(); ?></h4>
</div>
</div>
</a>
</div>
<?php
endwhile;
}
remove_filter( 'posts_orderby' , 'posts_orderby_lastname' );
wp_reset_query(); // Restore global post data stomped by the_post().
?>
It works fine for sorting by second word, but I've got a few words that are like "D'something" or "SomeThing" and these I need to sort by the first word, but they are sorting by the second, ie. "something" and "Thing".
I also tried to modify the third answer on [[LINK href="http://stackoverflow.com/questions/17173230/wordpress-custom-order-filter-by-last-name-in-post-title"]]this page[[/LINK]] to check if the if the string has no spaces in it, and if so to then sort by first word, but I had no clue how to modify it properly.
Variations on either of the above solutions would be great or if you've got a better way I'd be glad to use that, too.
Thanks!
Dbranes answers:
You can try something like this (untested):
function posts_orderby_lastname ($orderby_statement)
{
return "
CASE
WHEN LOCATE(' ', REVERSE(post_title)) > 0 THEN RIGHT(post_title, LOCATE(' ', REVERSE(post_title)) - 1)
ELSE post_title
END
ASC
";
}
or some adjustments to this.
Mike Sewell comments:
That worked exactly as it was, thanks!