web-dev-qa-db-fra.com

comment_form () préparer la mauvaise url d'action

J'ai créé le fichier comments.php. À l'intérieur, j'ai une boucle manuelle pour ma section de commentaires. Je boucle de offset = 0 + ((page - 1) * total_per à offset + total_per). Le problème est que lorsque j'ajoute de nouveaux commentaires, le champ d'action du formulaire de commentaire génère une URL incorrecte. Par conséquent, il s’agit de la dernière page de commentaires (la plus ancienne).

J'ai eu une question à ce sujet que j'ai posté plus tôt. Cependant, après avoir tracé une partie du code source WP, j'ai pu trouver plus d'informations et j'ai donc supprimé l'original.

Comment puis-je m'assurer que le formulaire de commentaire de mon thème génère l'URL d'action correcte sans modifier wp-includes/comment-template.php ou wp-comments-post.php?

La ligne 734 dans wp-includes/comment-template.php est à l'origine du problème. Je ne comprends pas pourquoi cependant. J'ai changé de thème pour copier cpage, je ne m'occupe donc plus des états attendus. Ce que je sais, c'est que je peux résoudre mon problème en piratant la ligne du fichier principal. Cette modification amène l'URL générée à l'emplacement correct.

if ( 'newest' === get_option( 'default_comments_page' ) )

À l'origine cela.

if ( 'oldest' === get_option( 'default_comments_page' ) && 1 === $cpage )

Cela n'a aucun sens pour moi de ne pas tenir compte de la valeur de cpage pour l'URL, UNIQUEMENT si l'option est définie sur "plus ancienne". Je pense que cela devrait prendre en compte le moment de ne pas tenir compte de cpage dans les deux cas. Cependant, pourquoi est-il difficile de ne considérer que le cas échéant? est le plus ancien au sommet la page par défaut est la plus ancienne et cpage est à la page 1? Cela n'a aucun sens!

Que dois-je faire pour que get_comment_link() génère la valeur de page incorrecte? Y at-il un moyen pour moi de déboguer facilement ces choses? J'ai essayé d'ajouter des échos au code principal, mais ils ne se sont pas présentés.

Voici tout mon code source lié au formulaire de commentaire. (J'ai oublié d'ajouter l'espace de noms pour mes fonctions "wbs", utilisez le pouvoir de l'imagination car je ne peux pas en éditer le Pastebin. comments.php (top) et functions.php (en bas) sur http://Pastebin.com/aer07uvF

Désolé, je ne peux poster que 2 liens avec <10 rep.

modifier:

Donc, comment_form() génère l'URL correcte , car le commentaire-page-1 devrait toujours contenir les commentaires les plus anciens.

3
Josh C

Par défaut, WordPress organise les pages de commentaires du plus ancien au plus récent . Cela ne change pas, même si les options Settings-Discussion ont été modifiées. C’est là le point de blocage. On pourrait penser que ces paramètres sont réorganisés pour réorganiser les pages de commentaires. mais pas . En gros, ces paramètres définissent l’ordre des commentaires dans la boucle de commentaires par défaut , ainsi que la page affichée lorsque $cpage est vide.

Pour être clair, lorsque $cpage est vide, cela signifie que vous êtes sur l'URL de publication et non sur une page de commentaire au sein de cette publication.

Cela signifie que le problème n’est pas d’obtenir les liens, car ce code n’est pas dynamique. Le problème réside dans la façon dont les commentaires sont affichés. Il y a deux options 'default_comments_page' et 'comment_order', chacune ayant deux paramètres, ce qui donne quatre configurations . Chacun a besoin d'un calcul de décalage unique. Dans ce code ci-dessous, vous pouvez voir les calculs de décalage nécessaires pour afficher les bons commentaires sur les bonnes pages.

function grab_comments( $remainder, $page_total){
    global $cpage;
    $per_page = get_option('comments_per_page');
    $order_asc = get_option('comment_order') == 'asc';
    $order = $order_asc ? 'ASC' : 'DESC'; //Affects the offset

    if( get_option('default_comments_page') == 'newest' )
    {
        if ($cpage == '') $cpage = $page_total;

        if (get_option('comment_order') == 'desc')
        {
            // ; 8,7,6; 5,4,3; 2,1,0
            $offset = ( $page_total - $cpage ) * $per_page;
        }
        else
        {
            // ; 6,7,8; 3,4,5; 0,1,2
            $offset = ( ( $cpage - 1 ) * $per_page ) - ( $per_page - $remainder );
            if($offset < 0){
                $offset = 0;
                $per_page = $remainder != 0 ? $remainder : $per_page;
            }
        }
    }
    else // default page: 'oldest'
    {
        if ($cpage == '') $cpage = 1;

        if (get_option('comment_order') == 'asc')
        {
            // 0,1,2; 3,4,5; 6,7,8;
            $offset = ( $cpage - 1 ) * $per_page;
        }
        else
        {
            // 2,1,0; 5,4,3; 8,7,6;
            $offset = ( ( $page_total - $cpage ) * $per_page ) - ($per_page - $remainder);
            if($offset < 0){
                $offset = 0;
                $per_page = $remainder != 0 ? $remainder : $per_page;
            }
        }
    }
    $args = array(
        'post_id' => get_the_id()
        , 'number' => $per_page
        , 'offset' => $offset
        , 'order' => $order);
    return get_comments($args);
}
1
Josh C