it-swarm.com.de

Benutzerdefiniertes ACF-Feld WP_Query, muss aber alle Beiträge abrufen, wenn das Feld nicht vorhanden ist

Ich habe ein benutzerdefiniertes ACF-Feld für alle Posts mit dem Namen event_date. Ich möchte alle Posts in einem bestimmten category abrufen, aber Posts, für die event_date als erstes in der DESC-Reihenfolge von event_date definiert wurde. Die args, die ich für query_posts verwende, lauten wie folgt:

$args = array(
    'posts_per_page' => -1,
    'cat' => $category_id,
    'meta_query' => array(
        array(
            'key' => 'event_date',
            'value' => date("Ymd", time()),
            'compare' => $type == 'upcoming' ? '>=' : '<'
        )
    ),
    'orderby' => 'meta_value',
    'order' => 'DESC',
    'meta_key' => 'event_date'
);

Das Problem, mit dem ich konfrontiert bin, ist, dass das ACF-Feld für Beitragstypen erstellt wurde, nachdem alle Beiträge erstellt wurden, sodass für viele dieser Beiträge nicht einmal event_date für den meta_key definiert wurde (wodurch diese Beiträge bei Verwendung automatisch aus der Abfrage entfernt werden) query_posts($args). Es gibt zu viele Posts, um alle Posts zu durchsuchen und manuell zu speichern. Das würde ewig dauern.

Grundsätzlich, wenn der meta_key für einen Beitrag keinen event_date hat, muss ich den date des tatsächlichen Beitrags selbst (als er veröffentlicht wurde) verwenden, um per zu bestellen. Ich brauche alle Posts mit event_date, die zuerst in der DESC-Reihenfolge von event_date angezeigt werden. Danach müssen alle Posts, für die event_date nicht definiert ist, mit dem Veröffentlichungsdatum des Posts in der DESC-Reihenfolge angezeigt werden. Wie kann ich das machen? Am besten alles in 1 query_posts aufrufen?

Vielen Dank :)

1
Solomon Closson

Sie können beides mit einem ORmeta_query erhalten, der auch prüft, ob der Schlüssel nicht existiert:

'meta_query' => array(
    'relation' => 'OR',
    array(
        'key' => 'event_date',
        'compare' => 'NOT EXISTS',
    ),
    array(
        'key' => 'event_date',
        'value' => date("Ymd", time()),
        'compare' => '>',
    ),
),
'orderby' => array(
    'meta_value_num' => 'DESC',
    'date' => 'ASC',
),
4
Milo

Die wahrscheinlichste Route, die ich dabei einschlagen werde, ist die Ausführung eines Skripts, das den Posts, denen das benutzerdefinierte Feld nicht zugewiesen ist, das gewünschte benutzerdefinierte Feld hinzufügt.

Sie können Folgendes versuchen: ( HINWEIS: Dies ist ungetestet )

add_action( 'wp', function ()
{
    $args = [
        'post_type'        => 'post', // Set according to needs
        'posts_per_page'   => -1, // Set to execute smaller chucks per page load if necessary
        'suppress_filters' => true,
        'fields'           => 'ids',
        'meta_query'       => [
            [
                'key'      => 'event_date',
                'compare'  => 'NOT EXISTS'
            ]
        ]
    ];
    $q = get_posts( $args );
    foreach ( $q as $post_id ) {
        add_post_meta( 
            $post_id, // Post ID
            'event_date', // Custom field name
            get_the_date( 'Ymd', $post_id )
        );  
     }
});

Sie können dies ausführen, indem Sie einfach eine Seite laden, nach der Sie sie entfernen können. Wenn Sie kleinere Teile wie posts_per_page=100 setzen, aktualisieren Sie die Seite, bis alle Beiträge fertig sind. Beachten Sie, dass dies ein recht teures, ressourcenintensives Skript ist, das zu einem schwerwiegenden Timeout-Fehler führen kann. Wenn Sie also eine große Anzahl von Posts haben, können Sie eine kleinere Anzahl von Posts pro Seite laden.

Danach können Sie Ihre Abfrage wie gewohnt ausführen. Nur ein Tipp, verwenden Sie niemals query_posts, verwenden Sie WP_Query, um Ihre benutzerdefinierte Abfrage auszuführen ( oder alternativ get_posts)

0
Pieter Goosen