Update (Feb 5 2014): I came up with a better method (github link), wrapping everything inside a function:
function firstname_lastname($post_title) { $pos = strpos($post_title, ","); if ($pos === false) { // nothing to do. } else { $fir = explode( ",", $post_title ); unset( $fir[0] ); $end = ltrim( implode( ",", $fir ) ); $first_name = substr($post_title, 0, $pos); $pos++; $post_title = substr($post_title, $pos) . ' ' . $first_name; } return $post_title; }
I’m sharing here a little php trick I came up with for a recent WordPress site: I needed to create alphabetic listings of persons and order them by their last name, but at the same time, I wanted to display the post titles as Firstname Lastname.
It’s a rather common problem, and various people have already attempted to solve it through very convoluted methods.
The much easier solution I came up with:
- In the title field, I write the name in manner that allows me to use the normal alphabetic listing of WP_Query: starting with the Lastname, and using a comma as separator. For instance “Wilde, Oscar” instead of “Oscar Wilde“.
- In the theme, when I want to display the title with the Firstname first, I use the php functions strpos and strstr to revert the order.
Here is the code snippet I wrote:
$mystring = get_the_title(); $findme = ','; $pos = strpos($mystring, $findme); if ($pos === false) { $regex_name = $mystring; } else { $firstname = strstr($mystring, ','); $lastname = strstr($mystring, ',', true); // As of PHP 5.3.0 $firstname = trim( substr($firstname, 1) ); $regex_name = $firstname." ".$lastname; }
It will revert the order only if a comma is present in the title, otherwise the title remains as it is.
And here is how it’s implemented in the theme:
include( TEMPLATEPATH . '/inc/name-regex.php' ); echo $regex_name;
So simple and efficient ;)
Note that the title $regex_name
I gave to my variable is misleading, as there isn’t any regex (regular expression) involved in that function.