Arrêter WordPress de rediriger la page de commentaires-1 vers la page de publication?

8

Je voudrais avoir une page séparée pour les commentaires sur un post, telle que cette page: /2011/02/post-name/montre simplement le post et ensuite vous cliquez sur un lien pour voir les commentaires, vous amenant à une page comme celle-ci:/2011/02/post-name/comment-page-1/

Je vérifierai ensuite l'URL pour voir si "comment-page-x" est dedans, et afficherai la page différemment si c'est le cas (supprimez le message, afin que les gens n'aient pas à faire défiler chaque fois, et aussi styliser les choses a un peu différemment).

Cela fonctionnerait, mais WordPress redirige comment-page-1vers la page de publication - j'en ai besoin pour comment-page-1y rester dans l'URL.

Est-ce possible? Comment puis-je le faire? Merci!

Shaun
la source
1
upvotet le Q. Comme Mike l'a dit: bon :)
kaiser

Réponses:

7

Grande question! WordPress attribue votre numéro de page de commentaire à la var de requête 'cpage'qui est définie lorsque votre URL a /comment-page-1/à la fin. Votre coupable est donc dans la redirect_canonical()fonction, ligne 192 de /wp-includes/canoncial.php.

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

Puisque la redirect_canonical()fonction est définie comme une action, ce que nous pouvons faire est d'insérer notre propre fonction à appeler à la place, demandez à notre fonction de définir la 'cpage'requête var sur false, d'appeler redirect_canonical(), puis de 'cpage'rétablir ce qu'elle était; qui empêchera WordPress de vous rediriger.

Pour insérer votre propre fonction, vous devez appeler les deux hooks 'init'et, 'template_redirect'ainsi, assurez-vous de définir le 'init'hook à appeler après le do_action()noyau WordPress intérieur qui ajoute 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);
}

Alors bien sûr, vous devez faire quelque chose avec votre 'cpage'. Vous pouvez soit vérifier la valeur renvoyée par, get_query_var('cpage')soit ajouter un autre hook pour vous permettre de créer un modèle spécifique au commentaire, ce que j'ai fait. Il ajoutera un fichier de modèle de thème avec le même que celui qu'il chargerait normalement mais avec [comments].phpà la fin du nom au lieu de .php, c'est-à-dire single[comments].php. Notez que j'ai défini la priorité pour ce filtre à 11; vous devrez peut-être définir un nombre encore plus grand si un plug-in que vous utilisez s'ajoute après votre hook:

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

Et voici la preuve que tout fonctionne!

Capture d'écran du modèle de page WordPress personnalisé pour les commentaires
(source: mikeschinkel.com )

MikeSchinkel
la source
Bref ... wow! Dommage que nous ne puissions pas faire de +10 ici ...
kaiser
Merci pour la réponse détaillée, mais une question - où puis-je mettre ce code? J'ai essayé dans functions.php mais je n'ai pas eu beaucoup de chance. En supposant que j'utilise le thème vingtten, où dois-je ajouter le code dans le fichier?
Shaun
@Shaun - Chiffres. :) La seule fois où je n'ai pas ajouté le texte suivant à ma réponse, je suis appelé pour cela: "Vous pouvez ajouter le code suivant au functions.phpfichier de votre thème ou dans le .phpfichier d'un plugin que vous pourriez écrire." Mais vous dites que cela ne fonctionne pas? Que ne fait-il pas exactement? Avez-vous mis des echo "Test"; exit;instructions dans chacune des fonctions pour vous assurer que les crochets tirent? Avez-vous des plugins qui peuvent être en conflit? Avez-vous essayé de changer 11à deux endroits en 100?Avez-vous inclus tout le code? Avez-vous créé un fichier de modèle de thème appelé single[comments].php?
MikeSchinkel
@MikeSchinkel Brilliant, merci. Je n'ai pas créé le single [comments] .php!
Shaun
@Shaun - Heureux d'avoir pu aider!
MikeSchinkel