Nach einem benutzerdefinierten Feld filtern, nach einem anderen sortieren?

10

Ich habe einen benutzerdefinierten Beitragstyp "Listing" und möchte alle Listings mit einem benutzerdefinierten Feld abrufen gateway_value != 'Yes'und die Ergebnisse nach einem anderen benutzerdefinierten Feld sortieren location_level1_value. Ich kann die Abfragen separat arbeiten lassen, aber ich kann sie nicht kombinieren:

Abfrage 1 (nach Standort sortieren):

                $wp_query = new WP_Query( array (
                    'post_type' => 'listing',
                    'post_status' => 'publish',
                    'posts_per_page' => '9',
                    'meta_key' => 'location_level1_value',
                    'orderby' => 'location_level1_value',
                    'order' => 'ASC',
                    'paged' => $paged
                    )
                 );

Abfrage 2 (benutzerdefinierter Feldwert! = Ja):

                $wp_query = new WP_Query( array (
                    'post_type' => 'listing',
                    'posts_per_page' => '9',
                    'post_status' => 'publish',
                    'meta_key' => 'gateway_value',
                    'meta_value' => 'Yes',
                    'meta_compare' => '!=',
                    'paged' => $paged
                    )
                );

Kombinierte Abfrage:

Ich habe im Codex nach Hilfe gesucht , aber die folgende Abfrage funktioniert nicht:

                $wp_query = new WP_Query( array (
                    'post_type' => 'listing',
                    'posts_per_page' => '9',
                    'post_status' => 'publish',
                    'meta_query' => array(
                        array(
                            'key' => 'gateway_value',
                            'value' => 'Yes',
                            'compare' => '!='
                        ),
                        array(
                            'key' => 'location_level1_value'
                        )
                    ),
                    'orderby' => "location_level1_value",
                    'order' => 'ASC',
                    'paged' => $paged
                    )
                );

Was mache ich mit der kombinierten Abfrage falsch?

[UPDATE]: Nachdem 3.1 veröffentlicht wurde, funktioniert die oben genannte kombinierte Abfrage immer noch nicht. Ich bekomme Ergebnisse, nur nicht richtig sortiert.

[UPDATE]: var_dump($wp_query->request)gibt Folgendes an:
string(527) " SELECT SQL_CALC_FOUND_ROWS wp_7v1oev_posts.* FROM wp_7v1oev_posts INNER JOIN wp_7v1oev_postmeta ON (wp_7v1oev_posts.ID = wp_7v1oev_postmeta.post_id) INNER JOIN wp_7v1oev_postmeta AS mt1 ON (wp_7v1oev_posts.ID = mt1.post_id) WHERE 1=1 AND wp_7v1oev_posts.post_type = 'listing' AND (wp_7v1oev_posts.post_status = 'publish') AND wp_7v1oev_postmeta.meta_key = 'gateway_value' AND CAST(wp_7v1oev_postmeta.meta_value AS CHAR) != 'Yes' AND mt1.meta_key = 'location_level1_value' ORDER BY wp_7v1oev_posts.post_date DESC LIMIT 0, 9"

Gillespieza
quelle
3
Verwenden Sie WordPress 3.1? Der meta_queryParameter ist neu in 3.1 und wird sehr bald veröffentlicht, aber die aktuelle stabile Version ist immer noch 3.0.5 ohne diesen Parameter.
Jan Fabry
Äh ... richtig, das wäre dann wahrscheinlich der Grund. Gibt es eine Möglichkeit, es in 3.0.5 zum Laufen zu bringen?
Gillespieza
Miljenko hat die beste Antwort, die Sie akzeptieren sollten, anstatt Ihrer.
Hugo

Antworten:

9

Sie können die Abfrage verwenden, um den Inhalt wie beabsichtigt zu filtern, indem Sie die 'meta_query' mit Filteroptionen verwenden. Fügen Sie für den Auftragsteil einfach die folgenden Parameter hinzu / ändern Sie sie:

  • 'orderby' => 'meta_value'
  • 'meta_key' => 'location_level1_value'
  • 'order' => 'ASC'

    $wp_query = new WP_Query( array (
        'post_type'      => 'listing',
        'posts_per_page' => '9',
        'post_status'    => 'publish',
        'meta_query'     => array(
            array(
                'key'       => 'gateway_value',
                'value'     => 'Yes',
                'compare'   => '!='
            )
        ),
        'orderby'  => 'meta_value',            // this means we will be using a selected 
                                               // meta field to order
    
        'meta_key' => 'location_level1_value', // this states which meta field 
                                               // will be used in the ordering, 
                                               // regardless of the filters
        'order'    => 'ASC',
        'paged'    => $paged
        )
    );
Miljenko Barbir
quelle
2

Genau wie Jan in neuem WordPress 3.1 gesagt hat, können Sie es verwenden, meta_queryaber bis dies herauskommt, können Sie Ihre erste Abfrage verwenden, um in Ihrer Schleife wie folgt zu bestellen und zu filtern:

 Global $my_query;
$my_query = new WP_Query( array (
                    'post_type' => 'listing',
                    'post_status' => 'publish',
                    'posts_per_page' => '9',
                    'meta_key' => 'location_level1_value',
                    'orderby' => 'location_level1_value',
                    'order' => 'ASC',
                    'paged' => $paged
                    )
                 );
while ($my_query->have_posts){
    $my_query->the_post();
              //do your loop stuff
} 

und fügen Sie diesen Code Ihrer functions.php hinzu

   //join filter
         add_filter('posts_join', 'listing_join_865' );
         function listing_join_865($join){
Global$ my_query;            
if ('listing' = $my_query->query['post_type']){
                $restriction1 = 'gateway_value';
                return $join .="
                LEFT JOIN $wpdb->postmeta AS $restriction1 ON(
                $wpdb->posts.ID = $restriction1.post_id
                AND $restriction1.meta_key = '$restriction1'
                )";
             }else {
                return $join;
            }
         }
         //where filter
         add_filter('posts_where', 'listing_where_865' );
         function listing_where_865($where){
             global $my_query;
            if ('listing' = $my_query->query['post_type']){
                return $where.= " AND $restriction1.meta_value != 'yes'";
            }else{
                return $where;
            }
         }

jetzt sollte das funktionieren.

Bainternet
quelle
Danke dafür. Dies funktioniert, außer dass ich den seltsamen Nebeneffekt habe, dass mein Paging nicht mehr richtig funktioniert. Anstelle von 9 pro Seite habe ich "leere Stellen" in meinem Raster, an denen die benutzerdefinierten Beiträge gateway_value == "Yes"ohne die Bedingung gewesen wären ... Haben Sie eine Idee, wie Sie das beheben können?
Gillespieza
Ja, das würde das Paging durcheinander bringen, also denke ich, der einzige Weg, um es zu umgehen, wäre eine benutzerdefinierte SQL-Abfrage. Geben Sie mir ein paar Minuten.
Bainternet
Keine Sorge - ich werde nur die zweite Abfrage verwenden und das Plugin wordpress.org/extend/plugins/post-types-order verwenden, bis 3.1 veröffentlicht wird :)
Gillespieza
Verdammt, ich bin gerade zurückgekommen, um Ihren Kommentar zu sehen, nachdem ich eine Lösung gefunden habe. Jedenfalls ist es hier für zukünftige Fragesteller.
Bainternet
1
@ t31os - das mache ich normalerweise, aber nicht, wenn ich von meinem Handy aus antworte.
Bainternet
1

Entschuldigung für die Beantwortung meiner eigenen Frage:

Ein Blick auf [http://core.trac.wordpress.org/ticket/15031 weibl. [1] scheint ein bekanntes Problem zu sein. Ich habe es behoben (gehackt?) post_filter, Um es so zu verwenden (nur als Referenz für jeden, der nach der gleichen Antwort sucht):

In functions.php ###

add_filter('posts_orderby', 'EV_locationl1' );
function EV_locationl1 ($orderby) {
    global $EV_locationl1_orderby;
    if ($EV_locationl1_orderby) $orderby = $EV_locationl1_orderby;
    return $orderby;
}

Geänderte wp_query in Vorlagendatei ###

$EV_locationl1_orderby = " mt1.meta_value ASC";

$wp_query = new WP_Query( array (
    'post_type' => 'listing',
    'posts_per_page' => '9',
    'post_status' => 'publish',
    'meta_query' => array(
            array(
                    'key' => 'gateway_value',
                    'value' => 'Yes',
                    'compare' => '!='
                    ),
            array(
                    'key' => 'location_level1_value'
            )
        ),
    'order' => $EV_locationl1_orderby,
    'paged' => $paged
    ));
Gillespieza
quelle