Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

I have a wp query that works great - it returns a list of featured posts.

WP_Query("category_name=office&meta_key=featured_post&meta_value=Yes&posts_per_page=3");

However I want to add a 2nd custom key to the query (a custom order field) then order by the numerical value of the meta value of this key.. is it possible to use 2 meta_key values in a WP_Query? If not is it possible using an SQL query statement?

share|improve this question
add comment

2 Answers 2

up vote 3 down vote accepted

The query value parameters can be set to true ( returns single result) or false ( an array). http://codex.wordpress.org/Function_Reference/get_post_meta

For instance http://www.mattvarone.com/wordpress/query-multiple-meta-values/

share|improve this answer
add comment

Typically in WordPress you would never go use database calls/SQL Calls (your second question)

(on your first question: how to add multiple metadata values (and do the wildest things with them)) use kind the following for additional entries in your Query, the join and orderby are used here for other possible relations between meta keys. In the example you see that I order on the A*B values of the keys. Just copy and paste and adjust to your liking. (note that apart from join and orderby there are more options to play with in case of even more advanced scenarios).

 global $edl_global_join;
 global $edl_global_orderby;
 global $wp_query;

 function edl_posts_join ($join) {
   global $edl_global_join;
   if ($edl_global_join) $join .= " $edl_global_join";
   return $join;
 }

 function edl_posts_orderby ($orderby) {
  global $edl_global_orderby;
  if ($edl_global_orderby) $orderby = $edl_global_orderby;
  return $orderby;
 }

 add_filter('posts_join','edl_posts_join');
 add_filter('posts_orderby','edl_posts_orderby');

 $edl_global_join = 
 "JOIN $wpdb->postmeta meta1 ON (meta1.post_id = $wpdb->posts.ID AND meta1.meta_key = 'TOPSPEED')" .
 "JOIN $wpdb->postmeta meta2 ON (meta2.post_id = $wpdb->posts.ID AND meta2.meta_key = 'ANOTHER_THING')";
 $edl_global_orderby = " meta1.meta_value * meta2.meta_value DESC";

 $wp_query = new WP_Query($args);

If you want to then show certain fields based on calculations of the meta data you can use e.g.:

 $car->display_meta_size();

which is actually the following method in that class:

    //
// specific display for size overviews
//
function display_meta_size()
{
    $this->mMetaData->GetValuesFromWP();
    ?>
    <table width="100%">
    <?php   
    $this->mMetaData->ShowIcon();
    $this->mMetaData->ShowSize();
    ?>
    </table>
    <?php
} 

where the method GetValuesFromWP() is from the wp metadata class :

// get the values stored in WordPress
function GetValuesFromWP() {
    global $post;
    $custom = get_post_custom($post->ID);

    foreach ($this->mArrMetaDataFields as $str_meta_data_field)
    {
        $this->MetaDataWpValues[$str_meta_data_field] = 
                    $custom[$str_meta_data_field][0];
    }
    $this->MetaDataWpValues['SPECIAL'] = $custom['SPECIAL'][0];
}

(so in the join function totally above do the stuff you want).

see also: Getting Custom Field data from a page hierarchy

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.