Verwenden von WP_Query in “parse_query” oder “pre_get_post” in Posts2Posts

UPDATE :

Der Hook arbeitet mit einem “klassischen” WordPress-Filter (wie post__in ), also ist es wahrscheinlich ein Posts2Posts-Problem. Ich suche immer noch nach Vorschlägen, wenn jemand eine Idee hat.

ORIGINAL POST

Ich versuche, alle Beiträge in den Archivseiten nach Ausgabenummern anzuzeigen. Probleme sind ein benutzerdefinierter Post-Typ (verlinkt mit post2post, weshalb ich parse_query anstelle von pre_get_post )

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

Dieser Aktionshaken funktioniert gut ! Problem ist: Ich muss die Issue ID mit einer anderen Abfrage erhalten. (ID und Nummer der Ausgabe sind natürlich unterschiedlich, mein ‘# 3′ Problem hat ’71’ ID)

Ich habe versucht, einen WP_Query in meinen Hook WP_Query , der im Grunde die ganze Sache WP_Query . Ich kann meine Ausgabenummer erhalten, aber die Hauptabfrage zeigt schließlich alle Beiträge.

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

Gibt es eine Möglichkeit, einige Informationen in meinem Hook anzufordern, idealerweise ohne direkten SQL-Request?

Solutions Collecting From Web of "Verwenden von WP_Query in “parse_query” oder “pre_get_post” in Posts2Posts"

Sie rufen eine Endlosschleife auf, weil Sie WP_Query innerhalb von WP_Query , wo sich der Hook befindet, so dass Sie ihn immer wieder mit parse_query . Um dies zu vermeiden, fügen Sie am Anfang Ihrer Callback-function Folgendes ein:

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

Zusätzliche Anmerkung, es könnte nur eine geringere Technik sein, aber in meinen Augen wäre pre_get_posts der richtige Haken.

Ich konnte dieses Problem nicht lösen, fand aber eine Problemumgehung: Ich erhalte meine Problem-ID beim parse_request -Hook und verwende sie in parse_query (Ich habe eine class mit einer $ issue_id-Variable erstellt, aber die globale Variable sollte auch in Ordnung sein).

Ich weiß immer noch nicht, warum Sie WP_Query nicht direkt in parse_query verwenden können, aber ich habe das Ticket für Posts2Posts github geöffnet: https://github.com/scribu/wp-posts-to-posts/issues/483

Ich werde es nicht versuchen. Aber was ist mit einer function zum Abrufen der issue_id ? Und denken wp_reset_postdata() daran, dass wp_reset_postdata() für eine WP_Query() wichtig ist.

 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; } 

Jetzt mach das parse_query Ding:

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