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?
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
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
.
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');