Tell me more ×
WordPress Answers is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

I'm trying to query posts using WP_Query and meta_query parameters:

$args = array(
    'post_type' => 'produkty',
    'meta_query' => array(
            'relation' => 'AND',
            array(
                    'key' => 'produkt_aktywny',
                    'value' => '1',
                    'compare' => '='),
            array(
                    'key' => 'produkt_dostepnosc',
                    'value' => '1',
                    'compare' => '=')
            )
);

$query = new WP_Query( $args );

What should I add to order the results by two other meta keys ('produkt_kategoria' and 'produkt_cena')?

share|improve this question

1 Answer

<h3>Doing request</h3>



    <?php
        $query = new WP_Query($args);
        unset($GLOBALS['wp_query']);
        $GLOBALS['wp_query'] = $query;
        ?>

<br />
<br />
<h3>Request done but without sorting, all we need from that request is difficult mysql query $query->request. Next lets get this,modificate and do again</h3>
Principle is simple: explode and add mysql string which is needed<br />

    <?php
//****************************************************************************************
    /* THIS IS REQUEST WHICH I WRITE BY HANDS TO ATCHIVE THAT I NEED. VERY USEFULL TO DO THIS BEFO PROGRAMMING!
     * 
     * SELECT wp_posts.ID FROM wp_posts 
     * INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id) 
     * INNER JOIN wp_postmeta featured ON (wp_posts.ID = featured.post_id) 
     * WHERE 1=1 
     * AND wp_posts.post_type = 'car' 
     * AND (wp_posts.post_status = 'publish') 
     * AND ( (wp_postmeta.meta_key = 'car_year' 
     * AND CAST(wp_postmeta.meta_value AS SIGNED) BETWEEN '1900' AND '2013') ) //DO NOT LOOK AT THIS, EXAMPLE
     * AND ( (featured.meta_key = 'car_is_featured') ) 
     * GROUP BY wp_posts.ID 
     * ORDER BY featured.meta_value ASC, wp_posts.post_modified_gmt DESC LIMIT 0, 20 
     */
//step 1
    $request = str_replace("SQL_CALC_FOUND_ROWS", "", $query->request); //remove unnecessary code
//step 2 - explode to insert mysql code for featured cars
    $tmp_request_array1 = explode('WHERE 1=1', $request);
    $tmp_request_array1[0].=" INNER JOIN $wpdb->postmeta featured ON ($wpdb->posts.ID = featured.post_id) ";
    $request = $tmp_request_array1[0] . " WHERE 1=1 " . $tmp_request_array1[1]; //assemble request again
//step 3 - explode assembled request to order by meta values
    $tmp_request_array1 = explode('ORDER BY', $request);
    $tmp_request_array2 = explode($order, $tmp_request_array1[1]);
    if ($orderby == 'post_modified_gmt') {
        $request = $tmp_request_array1[0] . ' ORDER BY ' . "featured.meta_value DESC, $wpdb->posts.post_modified_gmt $order" . $tmp_request_array2[1];
    } else {
        $request = $tmp_request_array1[0] . ' ORDER BY ' . "featured.meta_value DESC, $wpdb->postmeta.meta_value $order" . $tmp_request_array2[1];
    }
//step 4 - explode assembled request again to say that featured.meta_key is  =  'car_is_featured'
    $tmp_request_array1 = explode('GROUP BY', $request);
    $request = $tmp_request_array1[0] . " AND ( (featured.meta_key = 'car_is_featured') ) " . " GROUP BY " . $tmp_request_array1[1];
//**********************************************************
//step 5 - DO OUR NEW MYSQL REQUEST, AND GET CARS ORDER WE NEED
    $request_result = array();
    $tmp = $wpdb->get_results($request, ARRAY_N);
    foreach ($tmp as $value) {
        $request_result[] = $value[0];
    }
//***

    ?>

<br />
<br />

Full article read here

share|improve this answer

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.