it-swarm.com.de

Abrufen von 3 neuesten Beiträgen von jedem der 5 verschiedenen benutzerdefinierten Beitragstypen

Ich habe 5 verschiedene benutzerdefinierte Beitragstypen. Ich zeige 15 neueste Beiträge von ihnen auf meiner Homepage mit folgender Suchanfrage:

$query = new WP_Query( array (
             'posts_per_page'   => 15,
             'post_type' => array ( 'cpt1', 'cpt2', 'cpt3', 'cpt4', 'cpt5' ) 
          )
 );

Es funktioniert gut, zeigt die letzten 15 Beiträge dieser 5 benutzerdefinierten Beitragstypen. Das Problem ist jedoch, dass es zu viele Updates für cpt1 und cpt3 ( etwa 8-10 Beiträge pro Tag für jeden Beitragstyp). Daher finde ich auf der Startseite selten Posts von cpt2/4/5 .

Ich möchte also die letzten 3 Beiträge von jedem Beitragstyp anzeigen (insgesamt 15 Beiträge), wobei das Datum in der Reihenfolge (Sortierung) angegeben wird. Somit werden 3 Posts von jedem Post-Typ sichtbar und basierend auf dem Datum unter allen 5 Post-Typen sortiert. Aber ich konnte keine gute Lösung dafür finden.

Was mir bisher in den Sinn gekommen ist, ist, 5 Abfragen auszuführen, sie in einem Array zu speichern und sie dann zu sortieren.

Kann ich dies trotzdem mit nur einer Abfrage anstelle von 5 Abfragen tun?

2
тнє Sufi

Ich bin nicht sicher, ob dies die effizienteste Option ist oder nicht, aber ich habe es auf folgende Weise getan:

  1. Ich habe 5 separate Abfragen mit get_posts gespeichert und sie in einem einzigen Array gespeichert
  2. Ich musste das Array abflachen, da es mehrdimensional war. Verwenden Sie dann usort mit post_date, um den neuesten Beitrag abzurufen
  3. Ich habe diese sortierten Daten mit Transient API gespeichert, um den Datenbankaufruf zu minimieren.

Hier ist der Code:

function delete_front_page_query_results() {
    delete_transient('post_data');

    $query_cpt1 = array (
            'posts_per_page'   => 3,
            'post_type' => 'cpt1'
            );
    $query_cpt2 = array (
            'posts_per_page'   => 3,
            'post_type' => 'cpt2'
            );
    $query_cpt3 = array (
            'posts_per_page'   => 3,
            'post_type' => 'cpt3'
            );
    $query_cpt4 = array (
            'posts_per_page'   => 3,
            'post_type' => 'cpt4'
            );
    $query_cpt5 = array (
            'posts_per_page'   => 3,
            'post_type' => 'cpt5'
            );

    $query_results[] = get_posts($query_cpt1);
    $query_results[] = get_posts($query_cpt2);
    $query_results[] = get_posts($query_cpt3);
    $query_results[] = get_posts($query_cpt4);
    $query_results[] = get_posts($query_cpt5);

    //flattening three dimentional array to two dimensonal array
    $flatten_array =array();
    foreach ($query_results as $data) {
            foreach($data as $flatten_data) {
                 $flatten_array[] = $flatten_data;
            }
    }

    function cpt_array_sort($a, $b) {
            return strtotime($b->post_date) - strtotime($a->post_date);
    }
    usort($flatten_array, 'cpt_array_sort');

    //setting transient with the array
    set_transient ( 'post_data', $flatten_array, 365*24*60*60);
}
add_action('publish_post', 'delete_front_page_query_results);
2
тнє Sufi

Dies ist in einer einzelnen Abfrage nicht möglich. Sie müssen es in mehrere Abfragen aufteilen, da SQL-Befehle für diese Art der Verarbeitung nicht erstellt werden und somit auch nicht die Abfrage-API von WordPress.

0
Tyler Carter