web-dev-qa-db-de.com

Verwenden von WP_Query in "parse_query" oder "pre_get_post" in Posts2Posts

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?

1
Jérémie

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

1
Jérémie

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.

1
Nicolai

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');
0
Mayeenul Islam