Über Web, Tech, Games, Art,
Code & Design

1. Februar 2024

WordPress Loop – Order by Custom Field

Ich nutze häufig das Plug-in „Custom Field Suite“ um WordPress-Posts weitere Felder hinzuzufügen. Z.B. bei einem Event-Kalender das Feld „startdatum“.

Um alle Posts in chronologischer Reihenfolge auszugeben, also sortiert nach dem „Custom Field“ „startdatum“, habe ich meistens folgenden Code genutzt:

/* ACHTUNG DIESER CODE IST FALSCH! */

$args = array(
    'post_type' => 'event',
    'meta_query' => array(
        array(
            'key' => 'startdatum',
            'value' => date('Y-m-d'),
            'compare' => '>=',
            'type' => 'DATE',
        ),
    ),
    'meta_key' => 'startdatum',
    'orderby' => 'meta_value_date', 
    'order' => 'ASC',
    'posts_per_page' => 100,
);

$query = new WP_Query($args);

if ($query->have_posts()) :

while ($query->have_posts()) :
    $query->the_post();
    echo '<div>'.CFS()->get( 'startdatum' ).'</div>';

Diese Argumente habe ich mehrfach über Google gefunden und auch Chat GPT hat sie genau so formuliert. Das Problem: Sie sind falsch! Die Einträge werden so nicht in der richtigen Reihenfolge ausgegeben.

Z.B. so:

2024-02-15
2024-02-19
2024-02-14
2024-03-15
2024-02-16
2024-02-10

Richtig wäre:

2024-02-02
2024-02-03
2024-02-03
2024-02-09
2024-02-10
2024-02-10

Nachdem ich hierüber lange mit Chat GPT diskutiert habe 😉 und Chat GPT noch mehrfach den falschen Code ausgegeben hat, sind wir zu folgendem Ergebnis gekommen: Das „orderby“-Argument ist falsch formuliert!

Folgende Schreibweise führt zum gewünschten Ergebnis:

    'orderby' => array(
        'startdatum' => 'ASC',
    ),

Mit folgenden Args können können Posts in WordPress nach einem Custom Field sortiert werden:

$args = array(
    'post_type' => 'event',
    'meta_query' => array(
        array(
            'key' => 'startdatum',
            'value' => date('Y-m-d'),
            'compare' => '>=',
            'type' => 'DATE',
        ),
    ),
    'orderby' => array(
        'startdatum' => 'ASC',
    ),
    'posts_per_page' => 100,
);

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert