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

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'
                                )
                            )
    )
);

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.


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'
) )

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


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


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'
      )
);

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);
}

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.