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_date and 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 desc as order statement. The order must be either ASC or DESC (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 just portfolio. Be sure to call whatever the post type is named inside
var_dump( array_keys( (array) $GLOBALS['wp_post_types'] ) );
caller_get_posts is 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.
query_posts,new WP_Queryandget_posts.