UPDATE:
Der Hook funktioniert mit "klassischen" Wordpress-Filtern (wie post__in
), es handelt sich also wahrscheinlich um ein Posts2Posts-Problem. Ich bin immer noch auf der Suche nach Anregungen, wenn jemand eine Idee hat.
ORIGINAL POST
Ich versuche, alle Beiträge nach Ausgabenummer auf den Archivseiten anzuzeigen. Bei Problemen handelt es sich um einen benutzerdefinierten Beitragstyp (verknüpft mit post2post, weshalb ich parse_query
anstelle von pre_get_post
verwende).
<?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');
?>
Dieser Action-Hook funktioniert einwandfrei ! Problem ist: Ich muss die Problem-ID bei einer anderen Abfrage abrufen. (ID und Ausgabenummer sind natürlich unterschiedlich, meine '# 3'-Ausgabe hat die' 71'-ID)
Ich habe versucht, einen WP_Query
in meinen Hook einzufügen, der im Grunde das Ganze kaputt macht. Ich kann meine Ausgabenummer bekommen, aber die Hauptabfrage zeigt endlich alle Beiträge.
<?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');
?>
Gibt es eine Möglichkeit, Informationen in meinem Hook anzufordern, im Idealfall ohne direkte SQL-Anforderung?
Ich konnte dieses Problem nicht lösen, habe aber eine Problemumgehung gefunden: Ich erhalte meine Problem-ID im Hook parse_request und verwende sie in parse_query (Ich habe eine Klasse mit der Variable $ issue_id 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 auf Posts2Posts github geöffnet: https://github.com/scribu/wp-posts-to-posts/issues/483
Sie rufen eine Endlosschleife auf, weil Sie WP_Query
innerhalb von WP_Query
aufrufen, in dem sich der Hook befindet, sodass Sie ihn immer wieder in parse_query
einbinden. Um dies zu vermeiden, setzen Sie Folgendes an den Anfang Ihrer Rückruffunktion:
// avoid infinite loop
remove_action( 'parse_query', __FUNCTION__ );
Zusätzlicher Hinweis, es könnte nur eine geringere technische Bedeutung sein, aber in meinen Augen wäre der richtige Haken für die Verwendung pre_get_posts
.
Ich versuche das nicht. Aber was ist mit einer Funktion zum Abrufen des issue_id
? Und denken Sie 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 mache 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');