web-dev-qa-db-fra.com

Utilisation de WP_Query dans "parse_query" ou "pre_get_post" dans Posts2Posts

METTRE À JOUR:

Le hook fonctionne avec le filtre "classique" de Wordpress (comme post__in), donc c'est probablement un problème de Posts2Posts. Je cherche toujours des suggestions si quelqu'un a une idée.

ORIGINAL POST

J'essaie d'obtenir tous les articles affichés par numéro d'édition dans les pages d'archives. Les problèmes sont un type de publication personnalisé (lié à post2post, c'est pourquoi j'ai utilisé parse_query au lieu de pre_get_post)

<?php

function categories_by_issue ($query) {

    if (! $query->is_category() || ! $query->is_main_query()) return;

    $query->set( 'connected_type', 'issue_to_posts');
    $query->set( 'connected_items', 71); // 71 needs to be dynamic
    $query->set( 'nopaging', true);
}

add_action('parse_query', 'categories_by_issue');
?>

Cette action crochet fonctionne bien ! Le problème est: je dois obtenir l'ID du problème avec une autre requête. (Le numéro d'identification et le numéro sont bien sûr différents, mon numéro '3 a un numéro' 71 ')

J'ai essayé d'ajouter un WP_Query dans mon crochet, ce qui casse tout. Je peux obtenir mon numéro d'édition, mais la requête principale affiche enfin tous les articles.

<?php

function categories_by_issue ($query) {

    if (! $query->is_category() || ! $query->is_main_query()) return;

    $issues = new WP_Query ( /* ... */);
    $issue_id = $issues->get_posts()[0]->ID;
    var_dump($issue_id); // -> 71 : My ID is correct

    $query->set( 'connected_type', 'issue_to_posts');
    $query->set( 'connected_items', $issue_id);
    $query->set( 'nopaging', true);

}

add_action('parse_query', 'categories_by_issue');
?>

Est-il possible de demander des informations dans mon hook, idéalement sans faire appel à une requête SQL directe?

1
Jérémie

Je ne pouvais pas résoudre ce problème, mais j'ai trouvé une solution de contournement: j'obtiens mon ID de problème sur le crochet parse_request et je l'utilise dans parse_query (j'ai créé une classe avec une variable $ issue_id, mais la variable globale devrait également convenir).

Vous ne savez toujours pas pourquoi vous ne pouvez pas utiliser WP_Query directement dans parse_query, mais j'ai ouvert le ticket sur Posts2Posts github: https://github.com/scribu/wp-posts-to-posts/issues/483

1
Jérémie

Vous appelez une boucle infinie, car vous appelez WP_Query à l'intérieur de WP_Query, c'est là que réside le raccordement, de sorte que vous le raccordez encore et encore dans parse_query. Pour éviter cela, insérez ce qui suit au début de votre fonction de rappel:

// avoid infinite loop
remove_action( 'parse_query', __FUNCTION__ ); 


Remarque supplémentaire, il s’agit peut-être d’une moindre technicité, mais je pense que le bon crochet à utiliser serait pre_get_posts.

1
Nicolai

Je ne vais pas essayer ça. Mais qu'en est-il de faire une fonction pour récupérer le issue_id? Et rappelez-vous, wp_reset_postdata() pour une WP_Query() est important.

function get_the_issue_id() {
  $issues = new WP_Query( /* .... */ );
  $issue_id = $issues->get_posts()[0]->ID;
  wp_reset_postdata(); //it's important
  return (int) $issue_id;  
}

Maintenant, faites la chose parse_query:

function categories_by_issue ($query) {    
    if (! $query->is_category() || ! $query->is_main_query()) return;

    $query->set( 'connected_type', 'issue_to_posts');
    $query->set( 'connected_items', get_the_issue_id() ); //using the function
    $query->set( 'nopaging', true);    
}    
add_action('parse_query', 'categories_by_issue');
0
Mayeenul Islam