サポート » テーマ » 同時に複数の投稿のコメントを表示する場合、id、name属性が重複しますが

  • 解決済 Takahashi Ei

    (@enjoybeerlife)


    1ページ内に複数の投稿を表示させ、それらの投稿のコメントも同時に表示する場合、

    <?php $withcomments = true; comments_template();?>

    を追加したりするのが一般的ですが、この方法を普通に適用した場合、コメント中のテキストボックスなどのID属性やname属性が全部同じになりますよね。
    このまま使っても特に問題なく動作しますけれども、HTML的には問題があります。
    この点、みなさんどうされてますか?
    特に問題視してない、とか、実はスマートな方法を知ってる、とか、いろいろご意見伺いたいのですが。
    新参者ですが、よろしくお願いします。

15件の返信を表示中 - 1 - 15件目 (全16件中)
  • Fumito MIZUNO

    (@php-web)

    「特に問題視してない」ですね。
    公式マニュアルをみても、
    http://wpdocs.sourceforge.jp/%E3%82%A4%E3%83%B3%E3%82%AF%E3%83%AB%E3%83%BC%E3%83%89%E3%82%BF%E3%82%B0/comments_template

    For use in single post and Page displays

    と、明確に記載されていますし。

    どうしても書き換えたければ、テーマのcomments.phpをカスタマイズする、という選択肢があります。

    トピック投稿者 Takahashi Ei

    (@enjoybeerlife)

    php-web様
    ご返答ありがとうございます。
    この「Page displays」というのは、「1ページ内に複数の投稿を表示させ」るの意でよろしいのでしょうか?英文が苦手で恐縮なのですが…。
    wp-includes/comment-template.phpのcomments_templateのソースを見ると、


    if ( !(is_single() || is_page() || $withcomments) || empty($post) )
    return;

    とありますから、この「Page」は単に固定ページを指すようにも読めるのですが。
    それとも「displays」→「(装飾的な)表示」→「複数の投稿の表示」と解釈したら良いのでしょうか?
    引き続きお教えいただければ嬉しいです。

    Fumito MIZUNO

    (@php-web)

    私は「For use in single post and Page displays」=「単一の投稿/固定ページの表示で使用する」と解釈しました。
    displays と複数形になっているのは、 post and Page だから、と。(複数の投稿/固定ページの意味ではない)
    コメントは「1ページ(HTMLの1ページ)で1回だけ表示するのが初期設定になっている」と判断しています。

    「1回だけ表示するのが初期設定になっている」とすれば、
    複数表示でidが重複しても問題なし、と判断しています。
    複数表示したい人は、テーマのcomments.phpをカスタマイズすれば対応できるわけですから。
    (もし自分でカスタマイズする手段が用意されていない、だったとしたら問題でしょうけど)

    トピック投稿者 Takahashi Ei

    (@enjoybeerlife)

    php-web様
    ご返答ありがとうございます。大変参考になります。
    >> コメントは「1ページ(HTMLの1ページ)で1回だけ表示するのが初期設定になっている」と判断しています。
    まさにWordPressはそういうつくりになってるということでしょうね。
    カスタマイズの方向でも考えてみたのですが、重複する要素にcomment_post_IDを割り振る(投稿者名であればそのテキストボックスのidとnameがauthor-1、author-2…となるようにするなど)とすれば、結局wp-comments-post.phpにも手を出さなければいけませんから、ちょっとよろしくない。ソース見ると、フック系も使えなさそうだし。やってることは非常に単純なので、wp-comment-post.phpをまるごと置き換えるファイルを自前で作ってそれを使ってもいけそうなのですが、まだWordPressの挙動をちゃんと把握してないことと、バージョンアップで仕様が変わる可能性を考えると、ちょっと怖いものがあります。

    nobita

    (@nobita)

    こんにちは

    横から、失礼します
    このグローバル変数を知らなかったので、テストしてみました。

    <?php
    global $withcomments;
    $withcomments = true;
    comments_template( '', true );
    ?>

    私の環境では、global宣言を使わないと、動作しませんでした。(loop.php)
    trackbackについては、表示されなかったのですが、これは標準的な挙動ですか?

    htmlに関する事ですが、
    一般的な、テーマのレギュレーションでは、テーマでは、comments.phpを必ず持たなければならない事になっています。

    コメントリストを生成する
    wp_list_comments( array( ‘callback’ => ‘my_comment’ ) );
    のように、コールバック関数を利用する事が出来ます。

    したがって、以下のようにid=”comment-<?php comment_ID(); といったカスタマイズを加える事で、そのような問題を回避する事が出来るのではないかと思います。

    if (!function_exists('my_comment')) {
            function my_comment( $comment, $args, $depth ) {
                $GLOBALS['comment'] = $comment; ?>
                <?php if ( '' == $comment->comment_type ) : ?>
                <li <?php comment_class(); ?> id="li-comment-<?php comment_ID(); ?>">
                    <div id="comment-<?php comment_ID(); ?>">
                    <div class="comment-author vcard">
                     <div style="width:48px;float:left;margin-top:6px;">
                        <?php echo get_avatar( $comment, 42 ); ?>
                    </div>
                        <div style="overflow:hidden;*width:100%;padding-left:1em;" class="clearfix comment_author_block">
                        <?php printf( __( '%s <span class="says">says:</span>', 'my' ), sprintf( '<cite class="fn">%s</cite>', get_comment_author_link() ) ); ?>
                        </div>
                    </div><!-- .comment-author .vcard -->
                    <?php if ( $comment->comment_approved == '0' ) : ?>
                    <div style="overflow:hidden;*width:100%;padding-left:1em;" class="clearfix">
                        <em><?php _e( 'Your comment is awaiting moderation.', 'my' ); ?></em>
                        <br />
                        </div>
                    <?php endif; ?>
                    <div class="comment-meta commentmetadata clearfix" style="overflow:hidden;*width:100%;padding-left:1em;"><a href="<?php echo esc_url( get_comment_link( $comment->comment_ID ) ); ?>">
                        <?php
                            /* translators: 1: date, 2: time */
                            printf( __( '%1$s at %2$s', 'my' ), get_comment_date(),  get_comment_time() ); ?></a><?php edit_comment_link( __( '(Edit)', 'my' ), ' ' );
                        ?>
                    </div><!-- .comment-meta .commentmetadata -->
                    <div class="comment-body clearfix" ><?php comment_text(); ?></div>
                    <div class="reply">
                        <?php comment_reply_link( array_merge( $args, array( 'depth' => $depth, 'max_depth' => $args['max_depth'] ) ) ); ?>
                    </div><!-- .reply -->
                </div><!-- #comment-##  -->
                <?php else : ?>
                <li class="post pingback"><?php _e( 'Pingback:', 'my' ); ?><?php comment_author_link(); ?><br />
                <?php edit_comment_link( __('(Edit)', 'my'), ' ' ); ?>
                <?php endif;
            }
    }

    enjoybeerlifeさんのお使いになっているテーマがわからないので、はっきりはいえませんが、テーマファイル依存の問題だと思います。

    nobita

    (@nobita)

    追記
    読み直したら、おかしいので

    コメントの表示は、大抵コントロールが利きますから、comments.php で、フォームの表示非表示をコントロールしましょう という事を言いたかったのです。

    コメントを表示したいというニーズは理解できますが、コメントフォームを投稿ごとに表示する理由は思い浮かばないので、

    <div class="social"><?php
    if(!is_single() and $withcomments == true){
    //投稿にコメントリンクがないなら
    	$my_comment_string = 'comment';
    	$my_comment_html = '<a href="%1$s" class="my-comment-link"><span class="raindrops-comment-string point"></span><em>%2$s</em></a>';
    	printf($my_comment_html,get_comments_link(),$my_comment_string);
    }else{
    comment_form();
    } ?></div>
    トピック投稿者 Takahashi Ei

    (@enjoybeerlife)

    nobita様

    ご返答ありがとうございます。
    頂いたコードはコメントの一覧を表示する部分のようですが、私が申し上げたかったのは、コメントの入力欄についてです。入力パーツのidやnameがページ中で一意でないのは問題があるような気がする→これをhtmlのルールの則り正規化するとなると、入力された情報をpostする先のファイル、つまりはwp-comments-post.php(WordPressのコアファイル?です)まで手を入れる必要がある、ということです。
    舌っ足らずで申し訳ありません。

    $withcommentsのglobal宣言は、私の検証環境(Twenty Eleven 1.3)で、index.phpの28行目に$withcomments = true;を挿入する限りでは必要ありませんでした。本筋のファイルならスコープ内なんでしょうね。逆に別の案件でfunction.phpに挿入したときは必要でした。loop.php(Twenty Tenとかにあるやつですよね?)の場合も同様、ということなのでしょうね。

    nobita

    (@nobita)

    こんにちは

    的外れな回答をしてしまい、お手を煩わせました。

    comment_form( $defaults );

    $defaults で、$post->ID を 項目に付加しておき、htmlとしては、validなものにしておいて、jQuery等で、何らかのイベントで、id属性の値を元々の、IDに、書き換えてpostするなどすれば、出来るかも
    などと思いました。

    修正
    無理ですね、フォームが表示されなくなりますね…

    お手数をおかけしました。

    nobita

    (@nobita)

    こんにちは

    的外れな回答をしてしまい、お手を煩わせました。

    comment_form( $defaults );

    $defaults で、$post->ID を 項目に付加しておき、htmlとしては、validなものにしておいて、jQuery等で、何らかのイベントで、id属性の値を元々の、IDに、書き換えてpostするなどすれば、出来るかも
    などと思いました。

    $withcommentsのglobal宣言

    詳しく教えていただきありがとうございました。参考にさせていただきます
    お手数をおかけしました。

    トピック投稿者 Takahashi Ei

    (@enjoybeerlife)

    nobita様

    >> 的外れな回答をしてしまい、お手を煩わせました。

    とんでもない!絡んでいただいて嬉しいです。今後ともよろしくです。

    ところで、HTMLにおいては、id属性はともかく、name属性は、フォーム内で一意であればいいんでしょうか?フォームで通信する場合はidは関係無いので、もしそうであればidを削除なりいじるなりするだけでOK?

    なんかすごく初歩的なハナシで恐縮ですが…。

    nobita

    (@nobita)

    enjoybeerlifeさん

    ルールとしては、文書型によると思いますが、形式的にvalidな、悲しいものになるのではないでしょうか?

    どうしてもやらなければならない時には、私なら、jQueryかflashで書き出すほうを選択すると思います。

    トピック投稿者 Takahashi Ei

    (@enjoybeerlife)

    nobita様

    もしかして、WordPressのコーディング規約に、フォームや、フォーム内の要素のidを削除したりいじったりしてはならない、というのがあるという意味でしょうか?

    php-web様とのやり取りにも出てきましたが、

    コメントは「1ページ(HTMLの1ページ)で1回だけ表示するのが

    仕様、ということでしょうから、例えば一般配布用のテーマなどでCSSのセレクタを標準化すると意味で、そのようなルールが存在する可能性はあると思ってはいましたが。

    もしそうであれば、その典拠をお教えいただけますか?

    もっとも、私の都合ではWordPressの仕様ではなくてHTMLの仕様に則っていればOKではあります。

    「jQueryかflashで書き出す」とは具体的にどういうことでしょうか?

    nobita

    (@nobita)

    enjoybeerlifeさん

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
    	"http://www.w3.org/TR/html4/strict.dtd">
    
    <html lang="ja" dir="ltr">
    
    <head>
    	<meta http-equiv="content-type" content="text/html; charset=utf-8">
    	<title>test</title>
    </head>
    <body>
    <form name="test" action="get">
    <p><input type="text" value="test" tabindex="1" accesskey="a"></p>
    </form>
    <form name="test" action="get">
    <p><input type="text" value="test" tabindex="1" accesskey="a"></p>
    </form>
    </body>
    </html>

    このような用法は、htmllint, w3c validでは、減点される事は多分ないとおもいますが、

    留意しなければいけないのは、フラグメント識別子(#リンク)での不具合が発生するという事だと私は、理解しています。

    idをはずしてバリデーションテストに合格したとしても、name属性があれば、この問題は解決しないだろうと思います

    htmlのルールとしては、idを使わなければならないか、そうでないかは、htmlの文書型により変わると思いますが、厳格に従うかどうかは、それぞれの作り手がどう考えるかの問題と思います。

    name属性の使用の方法については、
    http://www.kanzaki.com/docs/html/htminfo12.html
    等でも、一文書内での複数回の利用は、「名前の唯一性」から使用すべきではない としている解説もありますので、参考まで

    むしろ、jQueryのDOM操作などによって、フォームを生成するほうが、すっきりするかもしれないという思い付きを申し上げたに過ぎません

    以下のような他愛ない思い付きです

    example
    http://jsfiddle.net/BP9As/2/

    トピック投稿者 Takahashi Ei

    (@enjoybeerlife)

    nobita様

    何度もお付き合いいただいて申し訳ありません。大変感謝いたします。

    私も、この度思い切ってW3Cのサイトを覗いていましたところ、

    The scope of the name attribute for a control within a FORM element is the FORM element.

    とありました(こちらです)。

    なので、仰るとおり、「htmllint, w3c validでは、減点される事は多分ない」のでしょうね。

    そして、これまた仰るとおり、「フラグメント識別子(#リンク)での不具合が発生する」可能性は充分あります。
    これは、お教えいただいたリンク先の記事から何となく読み取ると、フォーム中の識別子と一般用途の識別子は、本来分けるべきであり、当初はname属性がどちらの役割も兼ねており、記事が書かれた時点(2006年)では、一般用途の識別子としてのid属性が参入してきて、その過渡期にあることから、いろいろと齟齬をきたす場面がある、#リンクもid属性によるものとしたいが、後方互換性維持のため、name属性も維持する、ということが原因でしょう。

    その証左として、同じくW3Cの「HTML5 differences from HTML4」なる文書のこちらによると、

    The following attributes are allowed but authors are discouraged from using them and instead strongly encouraged to use an alternative solution:

    として、

    The name attribute on a. Authors can use the id attribute instead.

    が挙げられています。もっとも、a要素以外のname属性に関しては該当するものを見つけられませんでしたが(ただ、なんとなく記憶を辿ると、name属性を#リンク先とする方法はa属性のみの対応だった気もしますが)。

    このような感じでいままでのやり取りを勝手ながらまとめさせていただきましたが、いかがでしょうか?
    それと、この話題を私のサイト(もちろんJust another WordPress siteです)で紹介したいと思うのですが、nobita様のお名前も出させていただいてよろしいでしょうか?(←スレッドと関係のない話で済みません)

    jQueryによるフォームの動的生成、確かにそのアイディアもありましたね! ちょうど今回の私の方の案件については、「1ページ内に複数の投稿があるが、コメントは同時には1つしか開かない」という仕様もアリでしたので。

    nobita

    (@nobita)

    こんにちは

    それと、この話題を私のサイト(もちろんJust another WordPress siteです)で紹介したいと思うのですが、nobita様のお名前も出させていただいてよろしいでしょうか?(←スレッドと関係のない話で済みません)

    いいですよ 🙂

15件の返信を表示中 - 1 - 15件目 (全16件中)
  • トピック「同時に複数の投稿のコメントを表示する場合、id、name属性が重複しますが」には新たに返信することはできません。