it-swarm.com.de

Aufteilen der Hauptabfrage in mehrere Schleifen mit query_posts und/oder pre_get_posts?

Ich habe einen benutzerdefinierten Beitragstyp "Ereignisse", dem ich einen benutzerdefinierten Taxonomie-Kalender zugeordnet habe. Der Kalender hat 12 feste Laufzeiten für jeden Monat des Jahres ('August', 'Oktober', 'November' usw.).

Ich bin gerade dabei, die Archivseite für den Beitragstyp "Ereignisse" zu erstellen. Ich wollte 12 verschiedene Listen mit jeweils maximal 10 Posts für jeden Monat des Jahres anzeigen == Begriffe in der 'Kalender'-Taxonomie.

Da dies eine Archivseite wäre, hätte Wordpress die Datenbank bereits nach dem Beitragstyp "Ereignisse" abgefragt. Ich wollte query_posts verwenden, um die Hauptabfrage zu ändern, fragte mich aber plötzlich, ob es einen besseren Weg gibt, die Standardabfrage besser zu nutzen. query_posts würde im Wesentlichen die Hauptabfrage wegwerfen und mit 12 zu generierenden Listen mehr Treffer in der Datenbank verursachen.

Welches ist die beste Vorgehensweise für diesen Fall?

Würden Sie nur 12 Instanzen von query_posts ausführen, eine für jede Liste, oder möchten Sie lieber etwas anderes tun, z. B. mit pre_get_posts oder so?

vielen Dank für Ihre Ideen

2
unfulvio

Verwenden Sie nicht query_posts(). Ändern Sie die Hauptschleifenabfrage nicht innerhalb der Vorlage.

Sie können möglicherweise eine einzelne Abfrage abrufen, um das zu liefern, was Sie benötigen (z. B. durch Filtern von pre_get_posts und groupby). Dies ist jedoch höchstwahrscheinlich erforderlich Iterieren Sie 12 benutzerdefinierte Schleifen mit WP_Query(). Vielleicht so etwas:

// Get all the months
$months = get_terms( $calendar );

// Set up the base query args
$events_query_args = array(
    'post_type' => 'events',
    'post_per_page' => 10,
    'tax_query' => array(
        array(
            'taxonomy' => 'calendar',
            'field' => 'slug',
            'terms' => ''
        )
    )
);

// Loop through the months, and
// output a custom query and loop
// for each
foreach ( $months as $month ) {

    // Add $month to the query args
    $events_query_args['tax_query']['terms'] = $month['slug'];

    // Build the query
    $events_query = new WP_Query( $events_query_args );

    // Open the query loop
    if ( $events_query->have_posts() ) : while ( $events_query->have_posts() ) : $events_query->the_post();

        // YOUR LOOP CODE GOES HERE

    // Close the loop
    endwhile; endif;

    // Clean up
    $events_query = null;
    wp_reset_postdata()
}

Natürlich müssen Sie das eigentliche Loop-Output-Markup hinzufügen.

2
Chip Bennett

Ich kann keinen Grund nennen, warum Sie die Datenbank nicht 12 Mal abfragen möchten, wenn Sie 12 einzelne Postsets benötigen, es sei denn, Sie betreiben eine Site wie CNN oder NYT, auf der große Zahlen eine Rolle spielen. Sie könnten eine einzelne Abfrage für alle Posts für diese Taxonomie ausführen und sie mit PHP nach Kategorien aufteilen, aber am Ende klingt das nicht nach einer großartigen Idee, da dies einfach nicht der Zweck von PHP ist .

Wenn Sie sich Sorgen um Ressourcen machen: Verwenden Sie die Transienten-API , um Ihre Abfrage zwischenzuspeichern. ( Beispiel )

Wenn Sie Bedenken haben, die Hauptschleife zu ändern, rufen Sie einfach wp_reset_query auf, wenn Sie fertig sind.

1
Jan Beck