web-dev-qa-db-fra.com

requête posts2posts à l'aide du problème de tableau connected_items

Ma configuration est la suivante

Je possède un type de message personnalisé nommé "événements" et un type de message personnalisé nommé "genres" que je relie au plugin Posts2Posts de scribu. Chaque événement peut être associé à plusieurs genres.

Ce que j'aimerais faire

Sur une page d'événement , j'aimerais afficher d'autres événements connexes, en fonction du genre de l'événement en cours.

Ce que je pense que je devrais faire

  1. Exécuter une requête qui obtient tous les ID de genre de l'événement en cours
  2. Transmettez ces identifiants dans une seconde requête qui trouve tous les événements auxquels est associé un ou plusieurs de ces genres

J'ai une requête p2p à laquelle j'aimerais afficher tous les événements qui ont un AND/OR plusieurs des genres donnés dans connected_items. Je les passe sous forme de tableau, comme dans la documentation.

Pour illustrer mon résultat, disons que

  • event1 a lié les genres avec les identifiants de post 1240, 1241, 1242 et 1250
  • event2 a lié les genres avec les identifiants de post 1240, 1241 et 1260
  • event3 a lié les genres avec les identifiants de post 1241 et 1242

Dans la première requête, j'obtiens tous les identifiants de genre, cela fonctionne.

La deuxième requête qui obtient tous les événements avec les genres donnés (je les passe sous forme de tableau):

$args = array(
        'connected_type' => 'genres_to_events',
        'connected_items' => array(1240,1241,1242),
        'post_status' => 'publish',
        'posts_per_page' => -1,
    );

$query = new WP_Query($args);

Le fait est que la sortie vérifie chaque connexion du tableau et que, par conséquent, la sortie de la requête est:

  • événement1
  • événement1
  • événement1
  • événement2
  • événement2
  • événement3
  • événement3

Mais j'aimerais que chaque événement soit produit une fois, sur la base d'un ou de plusieurs genres. Je ne pense pas que cela soit expliqué dans la documentation, des idées?

3
eskimo

Ah je pense que je comprends. Je pense que ce que vous devriez faire avec votre première boucle est d’obtenir les genres connectés comme vous le dites. Ensuite, vous souhaitez obtenir tous les événements associés à ceux-ci. Vous devez donc ne rassembler que les ID (les rassembler dans un tableau) dans une boucle, puis utiliser array_unique() pour supprimer tous les doublons. Utilisez ce tableau propre dans une boucle pour obtenir uniquement ces publications. Avoir un sens?

Donc, quelque chose comme ça pourrait marcher:

$args = array(
        'connected_type' => 'genres_to_events',
        'connected_items' => array(1240,1241,1242),
        'post_status' => 'publish',
        'posts_per_page' => -1,
    );

$query = new WP_Query($args);

$connected_out = array();

while($query->have_posts()) : $query->the_post();
    $connected_out[] = $post->ID;
endwhile;

$connected_out = array_unique($connected_out);
wp_reset_query();

$args = array(
    'post__in' => $connected_out;
);

$query = new WP_Query($args);
// go!
0
GhostToast

Je poste ceci comme une réponse car elle l’est en partie et que j’ai besoin de plus de caractères que ce qui est disponible dans les commentaires. J'espère que ça va :-).

J'ai donc trouvé le problème posts_per_page après avoir lu cet article .

Il est possible de passer des arguments à la fonction get_related, bien qu'il semble que vous deviez modifier le noyau p2p. Ce que j'ai fait a été d'ajouter ma propre fonction get_related, nommée my_get_related.

Le code est le suivant:

public function my_get_related( $item, $extra_qv = array(), $output = 'raw' ) {
        $extra_qv['fields'] = 'ids';

        $connected = $this->get_connected( $item, $extra_qv, 'abstract' );

        $additional_qv = array( 'p2p:exclude' => _p2p_normalize( $item ), 'posts_per_page' => -1 );

        return $this->flip_direction()->get_connected( $connected->items, $additional_qv, $output );
    }

J'ai ajouté ceci dans wp-content/plugins/posts-to-posts/core/dired-connection-type.php (la fonction get_related d'origine est à la ligne 94).

Vous pouvez voir que l'argument 'posts_per_page' a été ajouté. Vous pouvez facilement en ajouter d'autres en les séparant par des virgules.

Maintenant, j'ai encore une question: comment déclarer cette fonction en dehors du fichier de base p2p? Je ne veux pas l'ajouter ici car cela pourrait se retourner lors de la mise à jour du plugin. Je voudrais l'ajouter à mon functions.php (j'utilise le thème Roots donc ce sera dans un fichier autre que functions.php mais c'est la même chose que de le mettre là car le fichier que je vais mettre est un include de functions.php).

J'ai essayé public function my_get_related... et add_action('p2p_init', 'my_get_related') mais cela ne fonctionne pas.

Des idées sur la façon d'ajouter cette fonction en dehors du noyau?

Je pense qu'après cela, le problème est enfin résolu :-)

0
eskimo