web-dev-qa-db-fra.com

Boucle unique pour wp_query et wp_user_query

Tout d'abord, j'ai essayé de chercher et de travailler sur cela, mais je ne pouvais pas créer la logique ou la méthode pour le faire.

J'essaie d'afficher le contenu users et custom post type ensemble dans un seul loop. Je peux obtenir la valeur de custom post type en utilisant WP_Query et users en utilisant WP_USER_Query. et je peux les afficher simultanément. Mais alors les messages et les utilisateurs ne seront pas mélangés dans l'ordre des dates.

Je ne suis pas sûr de pouvoir y parvenir via la personnalisation query. Mes connaissances et mon expérience sont limitées sur cette partie.

Quelqu'un peut-il m'aider à mettre dans la bonne direction sur la façon dont je peux atteindre cet objectif?


// Modifier et mettre à jour

Merci à tous pour votre commentaire, je crois avoir donné la moitié de l'idée de ce dont j'ai vraiment besoin et de la façon dont j'essaie d'y parvenir. Je vais donc commencer par l’idée/scénario.

Idée générale:

  1. J'ai un type de message personnalisé, appelons-le "affectation" et "projets".
  2. J'ai des utilisateurs sur le site, appelons-les "enseignant" et "étudiant".
  3. plusieurs enseignants peuvent assigner des "devoirs" et des "projets" à plusieurs étudiants.
  4. Maintenant, j'ai une page "Répertoire" sur laquelle je souhaite tout afficher (enseignant, étudiant, devoirs et projets).
  5. Sur le frontend, je souhaite afficher chaque entrée cpt et les utilisateurs en vue miniature comme la grille 4x4.

Maintenant, j'ai créé un modèle de page appelé directory.php et utilisé la boucle suivante pour afficher uniquement cpt assignment et projects.

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

$query = new WP_query( $args );

et en boucle comme ça

<?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();
?>

le code fonctionne, mais veuillez vous concentrer sur l'erreur de syntaxe, le cas échéant. maintenant la part des utilisateurs. Je l'ai écrit comme ça.

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

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

vous avez une idée de base de la façon dont je peux utiliser les utilisateurs.

La question principale

Comment puis-je fusionner des utilisateurs dans la boucle de publication, afin que les utilisateurs et les publications s'affichent dans une grille de 4x4 et triés par horodatage?

Par exemple, nous avons ce qui suit avec la date de création.

Teach A (10 juin, 2018) Teach B (12 juin, 2018) Stud C (15 juin, 2018) Attribuer 1 (16 juin, 2018) Attribuer 2 (18 juin, 2018) Stud D (20 juin, 2018) Proj 1 (22 juin 2018)

et puis je affiche dans la grille 4x4 comme ça.

Enseigner A Enseigner B Stud C Assigner 1 Assigner 2 Stud D Proj 1

S'il vous plaît laissez-moi savoir si c'est toujours déroutant.

6
Dilip Gupta

Vous ne pouvez pas fusionner deux requêtes différentes lorsque le type renvoyé est un objet, car elles ont des méthodes et des propriétés différentes. Au lieu de cela, vous pouvez les obtenir sous forme de tableau. Ensuite, vous pouvez les fusionner et comparer les dates. Pour cela, je vais utiliser get_posts() sur WP_Query() et get_users() sur WP_User_Query() pour y parvenir.

Le code lui-même devrait être explicite.

// 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

Vous pouvez créer deux types de messages personnalisés supplémentaires, enseignant et étudiant, qui hériteront de votre utilisateur WordPress.

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

Vous pouvez associer un utilisateur WordPress à un type de message enseignant/élève à l’aide de champs de méta-post.

Cette structure de données vous permettra de créer une boucle unique pour toutes vos ressources.

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

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