Benutzerdefinierte Abfrage mit orderby meta_value des benutzerdefinierten Felds

37

Wie Sie wissen, gibt es ab WP3.0 Optionen für benutzerdefinierte erweiterte Abfragen, was großartig ist. Ab diesem Zeitpunkt wurden einige Abfrageparameter von benutzerdefinierten Feldern wie meta_key und meta_value für den neuen meta_query-Parameter verworfen ( siehe hier ).

Ich versuche, eine ziemlich einfache Abfrage mit der neuen Syntax zu haben. Fragen Sie Posts nach einem bestimmten post_type (services) ab, der einen angegebenen meta_key (order_in_archive) enthält - dies läuft erwartungsgemäß gut. Aber - ich möchte die Abfrage nach dem meta_value ordnen, ohne Erfolg.

Das ist meine Frage -

   query_posts(
    array(  'post_type' => 'services',
        'order' => 'ASC',
        'orderby' => 'meta_value',
        'meta_query' => array(
            array('key' => 'order_in_archive'))
    )
);

Ich habe orderby auch von meta_value_numeric und meta_value ausprobiert, aber in jedem Fall werden die Ergebnisse nach dem Veröffentlichungsdatum sortiert (wie bei regulären Posts). Weiß jemand, wie das geht?

Vielen Dank

Maor Barazany
quelle

Antworten:

35

Sie können den Metaschlüssel für orderby- Parameter mit der alten Methode definieren (ich habe sie in WP 3.1.1 getestet) ...

query_posts(
    array(  'post_type' => 'services',
            'order'     => 'ASC',
            'meta_key' => 'some_key',
            'orderby'   => 'meta_value', //or 'meta_value_num'
            'meta_query' => array(
                                array('key' => 'order_in_archive',
                                      'value' => 'some_value'
                                )
                            )
    )
);
Ján Bočínec
quelle
15

Dieses Problem wird in WordPress 4.2 im Allgemeinen mithilfe benannter Abfragen behoben. z.B

$args = array(
  'post_type' => 'services',
  'orderby'   => 'order_clause',
  'meta_query' => array(
       'order_clause' => array(
            'key' => 'order_in_archive',
            'value' => 'some_value',
            'type' => 'NUMERIC' // unless the field is not a number
)));

Für mich wollte ich nach einem numerischen Feld ordnen und musste es 'type' => 'NUMERIC'innerhalb der Meta-Abfrage verwenden.

Ryan Taylor
quelle
1
Super Fund bei den genannten Abfragen!
Kaji
Ja, benannte Fragen beantworteten die Frage auch für mich.
Dalton
Ausgezeichnet. Ich bin mir nicht sicher, welche Bedeutung 'value' in dieser order_clause hat, da es nicht erforderlich ist, es nach dem höchsten bis niedrigsten Wert von 'order_in_archive' zu sortieren.
Andrew Schultz
10

Der WP-Codex ist tatsächlich verwirrend, wenn es darum geht, dieses Problem zu beheben.

Sie benötigen den meta_query-Parameter nicht wirklich, um orderby zu verwenden, sondern den meta_key-Parameter, der hier festgelegt wurde, obwohl er vom WP Codex veraltet ist: Wie verwenden Sie orderby mit meta_query in Wordpress 3.1? dieser orderyby benötigt noch den meta_key.

so sollte es sein

query_posts( array(
  'post_type' => 'services',
  'order' => 'ASC',
  'orderby' => 'meta_value',
  'meta_key' => 'order_in_archive'
) )
Evan Yeung
quelle
2
Ja, dies ist die alte Methode, um diese Abfrage durchzuführen, und sie scheint für diese angegebene Methode zu funktionieren. Bei komplexeren Abfragen wird es sowieso nicht funktionieren. Ich habe festgestellt, dass dies ein bekanntes Problem ist, das
behoben
2

Es ist einfach:

Hier ist mein Code:

query_posts(array( 
        'post_type' => 'directors',
        'posts_per_page' => -1,
        'order'    => 'ASC',
        'orderby'  => 'director_weight',
        'meta_key' => 'director_weight'
) );

Das meta_keyHauptdetail ist: include , mein Code wurde nur bestellt, wenn er meta_keyenthalten ist, und das ist alles:

Hier ist der vollständige Code einer Liste von directorsBildern, sortiert nach director_weight:

<?php 
    query_posts(array( 
        'post_type' => 'directors',
        'posts_per_page' => -1,
        'order'    => 'ASC',
        'orderby'  => 'director_weight',
        'meta_key' => 'director_weight'
    ) );
    while (have_posts()) : the_post();
?>  
    <li <?php echo get_field('director_weight') ?>>
        <img src="<?php echo get_field('director_imagen') ?>">
    </li>
<?php
    endwhile;
    wp_reset_query();
?>

order_by custom fiel wordpress

Jesus CMD
quelle
1

Verwenden Sie keine query_posts.

$meta_query = new WP_Meta_Query( $meta_query_args );

$meta_query_args = array(
   'post_type' => 'services',
    'order'     => 'ASC',
    'meta_key' => 'your_key',
    'orderby'   => 'meta_value', //or 'meta_value_num'
    'meta_query' => array(
                    array('key' => 'order_in_archive',
                        'value' => 'some_value'
)));

Verwenden Sie die WP_Meta_Query-Parameter

Brad Dalton
quelle
0

Ich fand das ziemlich gut.

<?php 
query_posts(
array(  'posts_per_page' => '-1',
        'post_type' => 'services',
        'order'     => 'DESC',
        'meta_key' => '_order',
        'orderby'   => 'meta_value_num', //or 'meta_value_num'
      )
);
gegere
quelle
3
Die Frage ist , über die neuen-ish meta_queryParameter und eine immer orderbymit ihm zu arbeiten, und nicht über die älteren , aber noch funktionsfähig meta_key/ meta_valueParameter. Lassen Sie uns auch nicht die Verwendung von fördern query_posts.
s_ha_dum
Diese Antwort enthält mehrere schlechte Praktiken: Verwenden von -1, Übergeben als Zeichenfolge, Verwenden von query_posts. Es sollte entfernt werden.
Ihor Vorotnov
0

Ich hatte eine Reihe von benutzerdefinierten Terminen, die ich nach Datum absteigend sortieren musste. Da mein benutzerdefiniertes Ereignisdatum in meiner Tabelle "wp_postmeta" gespeichert war und sich normalerweise von dem Datum "post_date" oder dem Änderungsdatum unterschied, funktionierte Folgendes für mich:

  $args = array(
    'post_type' => 'events', // my post type - yours can be 'posts'
    'post_status' => 'publish', // only get posts with this status
    'orderby' => 'meta_value', // orderby the meta_value of the following meta_key
    'meta_key' => 'my_custom_eventdate', // the custom meta_key name
    'order'=> 'DESC' // sort descending
  );

  $posts = new WP_Query($args);

Sie können dann $ posts wie folgt durchlaufen:

foreach($posts->posts as $p){

    $post_id = $p->ID;
    // and so on ...

    // # example of how I retrieve my event date
    $event = get_post_meta($post_id, 'my_custom_eventdate', true);
}
rekursieren
quelle
0

Diese Arbeit für mich,

    $args = array(
        'post_type' => 'services',
        'order' => 'ASC',
        'orderby'   => 'order_clause',   
        'meta_query' => array(
        'order_clause' => array(
        'key' => 'order_in_archive'
    )));

Wird nur benötigt, um den Schlüssel für die order_clause bereitzustellen

pingle60
quelle