OrderBy
The query functions, like get_posts(), query_posts() call a new WP_Query inside – they’re just wrappers.
The more important thing is what goes on in the class WP_Query. Specifically inside WP_Query -> get_posts(). When you add an orderby argument, then the following happens:
- WP checks if it set. If not, then it uses the
$wpdb->posts.post_dateand appends the `order value to it. - If you set it to
'none', then there’s no order applied. - In every other case, the order will be used.
But… there’re “allowed orderby” values:
$allowed_keys = array('name', 'author', 'date', 'title', 'modified', 'menu_order', 'parent', 'ID', 'rand', 'comment_count');
For meta key/value pairs, there’s a special case: If the meta key isn’t empty, the meta_key value is added to the allowed keys, as well as meta_value and meta_value_num.
The function than explodes the orderby string to an array and loops through. Everything that matches gets added to a new array, which is then imploded (separated by a comma) after the loop and added to the SQL query string. If the resulting array was empty, then – again – the "$wpdb->posts.post_date" followed by the order will be taken. If that is empty too, then you’ll see the same result as with none.
So if you’re adding anything like a meta key and a meta value, then you should get the following added to your query:
"$wpdb->postmeta.meta_value,$wpdb->postmeta.meta_value,$wpdb->posts.post_title"
Post Type(s)
Your post type arg gets added to the WHERE clause like this:
AND $wpdb->posts.post_type="portfolio-item"
What I think is wrong in here:
- You can’t add
asc descasorderstatement. The order must be eitherASCorDESC(upper-/lowercase doesn’t matter). This won’t work and will likely break. -
I’m pretty sure, that
'portfolio-item'isn’t the actual post type name. I guess it’s justportfolio. Be sure to call whatever the post type is named insidevar_dump( array_keys( (array) $GLOBALS['wp_post_types'] ) ); -
caller_get_postsis a pre 3.1 argument. You should already get a note at the top/beginning of your code, as the following_deprecated_argument()is called before any query string is even built:"caller_get_posts" is deprecated. Use "ignore_sticky_posts" instead.