Stoppen Sie WordPress, Kommentar-Seite-1 auf die Post-Seite umzuleiten?

8

Ich möchte eine separate Seite für die Kommentare zu einem Beitrag haben, so dass diese Seite: /2011/02/post-name/nur den Beitrag anzeigt und Sie dann auf einen Link klicken, um die Kommentare anzuzeigen und zu einer Seite wie dieser zu gelangen:/2011/02/post-name/comment-page-1/

Ich werde dann die URL überprüfen, um festzustellen, ob "comment-page-x" darin enthalten ist, und die Seite in diesem Fall anders anzeigen (entfernen Sie den Beitrag, damit die Leute nicht jedes Mal darüber scrollen müssen, und gestalten Sie auch Dinge a etwas anders).

Dies würde funktionieren, aber WordPress leitet comment-page-1zur Post-Seite weiter - ich brauche es, um comment-page-1dort in der URL zu bleiben .

Ist das möglich? Wie kann ich es tun? Vielen Dank!

Shaun
quelle
1
upvotet the Q. Wie Mike sagte: gut :)
kaiser

Antworten:

7

Gute Frage! WordPress weist Ihre Abfrageseitennummer der Abfragevariablen zu, 'cpage'die festgelegt wird, wenn Ihre URL /comment-page-1/am Ende steht. Ihr Schuldiger liegt also in der redirect_canonical()Funktion, Zeile 192 von /wp-includes/canoncial.php.

if ( get_query_var('paged') || is_feed() || get_query_var('cpage') ) {

Da die redirect_canonical()Funktion als Aktion festgelegt wird, können wir stattdessen unsere eigene Funktion einfügen, die aufgerufen werden soll. Lassen Sie unsere Funktion die 'cpage'Abfrage var auf setzen false, aufrufen redirect_canonical()und dann auf das 'cpage'zurücksetzen, was sie war. Dadurch wird verhindert, dass WordPress auf Sie umleitet.

Um Ihre eigene Funktion einzufügen, müssen Sie die beiden Hooks aufrufen 'init'und 'template_redirect'so den 'init'Hook einstellen, der nach dem do_action()WordPress-Kern aufgerufen werden soll, der Folgendes hinzufügt redirect_canonical():

add_action('init','yoursite_init',11); //11=lower priority
function yoursite_init() {
  remove_action('template_redirect','redirect_canonical');
  add_action('template_redirect','yoursite_redirect_canonical');
}

add_action('template_redirect','yoursite_redirect_canonical');
function yoursite_redirect_canonical($requested_url=null, $do_redirect=true) {
  $cpage = get_query_var('cpage');
  set_query_var('cpage',false);
  redirect_canonical($requested_url, $do_redirect);
  set_query_var('cpage',$cpage);
}

Dann müssen Sie natürlich etwas mit Ihrem tun 'cpage'. Sie können entweder nach dem von zurückgegebenen Wert suchen get_query_var('cpage')oder einen weiteren Hook hinzufügen, um eine kommentarspezifische Vorlage zu erstellen, wie ich es getan habe. Es wird eine Suche nach einer Designvorlagendatei hinzugefügt, die dieselbe enthält, wie sie normalerweise geladen wird, jedoch mit [comments].phpam Ende des Namens anstelle von .php, dh single[comments].php. Beachten Sie, dass ich für diesen Filter die Priorität 11 festgelegt habe. Möglicherweise müssen Sie eine noch größere Zahl festlegen, wenn sich ein von Ihnen verwendetes Plugin nach Ihrem Hook selbst hinzufügt:

add_filter('single_template','yoursite_single_template',11);
function yoursite_single_template($template) {
  if (get_query_var('cpage'))
    $template = str_replace('.php','[comments].php',$template);
  return $template;
}

Und hier ist der Beweis, dass alles funktioniert!

Screenshot der benutzerdefinierten WordPress-Seitenvorlage für Kommentare
(Quelle: mikeschinkel.com )

MikeSchinkel
quelle
Kurz .... wow! Schade, dass wir hier keine +10 machen können ...
Kaiser
Vielen Dank für die ausführliche Antwort, aber eine Frage - wo kann ich diesen Code einfügen? Ich habe in functions.php versucht, aber nicht viel Glück gehabt. Angenommen, ich verwende ein zwanzigstes Thema. Wo in der Datei füge ich den Code hinzu?
Shaun
@ Shun - Zahlen. :) Das eine Mal, als ich meiner Antwort nicht den folgenden Text hinzugefügt habe, werde ich dazu aufgefordert: "Sie können den folgenden Code zur functions.phpDatei Ihres Themas oder in einer .phpDatei eines Plugins hinzufügen, das Sie möglicherweise schreiben." Aber du sagst, das funktioniert nicht? Was genau macht es nicht? Haben Sie echo "Test"; exit;Anweisungen in jede der Funktionen eingefügt, um sicherzustellen, dass die Hooks ausgelöst werden? Haben Sie Plugins, die möglicherweise in Konflikt stehen? Haben Sie versucht, 11an zwei Stellen zu Ändern in 100?Haben Sie den gesamten Code eingefügt? Haben Sie eine Themenvorlagendatei mit dem Namen erstellt single[comments].php?
MikeSchinkel
@ MikeSchinkel Genial, danke. Ich habe die Single [Kommentare] .php nicht erstellt!
Shaun
@Shaun - Ich bin froh, dass ich helfen konnte!
MikeSchinkel