web-dev-qa-db-de.com

Einzelne Schleife für wp_query und wp_user_query

Zuerst habe ich versucht, danach zu suchen und daran zu arbeiten, aber ich konnte keine Logik oder Methode dafür erstellen.

Ich versuche, users und custom post type zusammen in einer einzigen loop anzuzeigen. Ich kann den Wert von custom post type mit WP_Query und users mit WP_USER_Query ermitteln. und ich kann sie gleichzeitig anzeigen. Aber dann werden die Beiträge und Benutzer nicht in der Reihenfolge des Datums gemischt.

Ich bin nicht sicher, ob ich dies über benutzerdefinierte query erreichen kann. Meine Kenntnisse und Erfahrungen sind in diesem Bereich begrenzt.

Kann mir jemand helfen, die richtige Richtung einzuschlagen, wie ich dies erreichen kann?


// Bearbeiten und aktualisieren

Ich danke Ihnen allen für Ihren Kommentar. Ich glaube, ich habe die Hälfte der Idee gegeben, was ich wirklich brauche und wie ich versuche, es zu erreichen. Also beginne ich mit der Idee/dem Szenario.

Grund Idee:

  1. Ich habe einen benutzerdefinierten Beitragstyp, nennen wir ihn "Zuweisung" und "Projekte".
  2. Ich habe Benutzer auf der Website, nennen wir sie "Lehrer" und "Schüler".
  3. mehrere Lehrer können mehreren Schülern "Aufgaben" und "Projekte" zuweisen.
  4. Jetzt habe ich eine "Verzeichnis" -Seite, auf der ich alle (Lehrer, Schüler, Aufgaben und Projekte) anzeigen möchte.
  5. Auf dem Frontend möchte ich jeden cpt-Eintrag und jeden Benutzer in der Miniaturansicht wie im 4x4-Raster anzeigen.

Jetzt habe ich eine Seitenvorlage mit dem Namen directory.php erstellt und die folgende Schleife verwendet, um nur cpt assignment und projects anzuzeigen.

$args = array(
    'post_type' => array('assigment', 'project'),
    'post_status' => 'publish',
    'order' => 'ASC'
);

$query = new WP_query( $args );

und schlang es so

<?php if ( $query->have_posts() ) : ?>

    <?php
    while ( $query->have_posts() ) :
        $query->the_post();

        get_template_part( 'template-parts/content', get_post_type() );

    endwhile;

    the_posts_navigation();

else :

    get_template_part( 'template-parts/content', 'none' );

endif;
wp_reset_postdata();
?>

der Code funktioniert, aber konzentrieren Sie sich ggf. auf den Syntaxfehler. jetzt der teil der benutzer. Ich habe es so geschrieben.

$user = new WP_User_Query(array('role'=> 'teacher'));

if (!empty($user)) {
    foreach ($user as $teacher) {
        echo $teacher->first_name;
    }
}

sie erhalten eine grundlegende Vorstellung davon, wie ich die Benutzer verwenden kann.

Die Hauptfrage

Wie kann ich Benutzer in der Post-Schleife zusammenführen, sodass Benutzer und Beiträge in einem 4x4-Raster angezeigt und nach Zeitstempeln sortiert werden?

Zum Beispiel haben wir folgendes mit dem Erstellungsdatum.

Lehre A (10. Juni 2018) Lehre B (12. Juni 2018) Stud C (15. Juni 2018) Aufgabe 1 (16. Juni 2018) Aufgabe 2 (18. Juni 2018) Stud D (20. Juni 2018) Projekt 1 (22. Juni 2018)

und dann zeige ich im 4x4 Gitter so an.

Teach A Teach B Stud C Assign 1 Assign 2 Stud D Proj 1

Bitte lassen Sie mich wissen, wenn es immer noch verwirrend ist.

6
Dilip Gupta

Sie können zwei verschiedene Abfragen nicht zusammenführen, wenn der zurückgegebene Typ ein Objekt ist, da sie unterschiedliche Methoden und Eigenschaften haben. Stattdessen können Sie sie als Array abrufen. Dann können Sie sie zusammenführen und die Daten vergleichen. Dafür verwende ich get_posts() over WP_Query() und get_users() over WP_User_Query(), um dies zu erreichen.

Der Code selbst sollte selbsterklärend sein.

// Get a list of users
$users = get_users ();

// Get an array of posts. Don't forget to set the args
$posts = get_posts();

// Let's merge these two
$users_posts = array_merge( $users, $posts );

// Now, let's sort both of them based on 
// their dates. a user object holds the date
// as `user_registered`, while a post object
// holds the date as `post_date`. We use the
// usort() function to do so.
usort( $users_posts, "sort_users_and_posts" );

// Function to sort the array
function sort_users_and_posts( $a, $b ){

    // Here's the tricky part. We need to get the
    // date based on the object type, and then compare them.

    // Get the date for first element
    if( $a instanceof WP_User ){
        $first_element_date = strtotime ( $a->user_registered );
    } else {
        $first_element_date = strtotime ( $a->post_date );
    }

    // Get the date for second element
    if( $b instanceof WP_User ){
        $second_element_date = strtotime ( $b->user_registered );
    } else {
        $second_element_date = strtotime ( $b->post_date );
    }

    // Now let's compare the dates

    // If the dates are the same
    if ( $first_element_date == $second_element_date ) return 0;

    // If one is bigger than the other
    return ( $first_element_date < $second_element_date ) ? -1 : 1;

}

// Now, we run a foreach loop and output the date.
// We need to check again whether the object is an
// instance of WP_Post or WP_User
foreach ( $users_posts as $object ) {
    if( $object instanceof WP_Post ){
        // This is a post
    } else {
        // This is a user
    }
}
4
Jack Johansson

Sie können zwei zusätzliche benutzerdefinierte Beitragstypen für Lehrer und Schüler erstellen, die von Ihrem WordPress-Benutzer übernommen werden.

          +------+
     +----+ User +----+
     |    +------+    |
     |                |
     |                |
     v                v
+----+----+      +----+----+      +---------+      +------------+
| Teacher |      | Student |      | Project |      | Assignment |
+---------+      +---------+      +---------+      +------------+

Sie können WordPress-Benutzer über Post-Meta-Felder mit dem Post-Typ des Lehrers/Schülers verknüpfen.

Mit dieser Datenstruktur können Sie eine einzelne Schleife für alle Ihre Ressourcen erstellen.

$args = array(
    'post_type' => array( 'teacher', 'student', 'assigment', 'project' ),
    'order' => 'ASC'
);

$query = new WP_query( $args );
3
kierzniak