Guest book
これといった理由もないんですが、guest book なるものを作ってみました。
といっても、固定ページを一つ新たに作成して、comments_template()を配置するだけです。あとはcssでデザインを整えると。実際のページはこれ→Guest book
ただ、ゲストブックとか掲示板というものは、初めての投稿者の場合にいちいち承認などしないものです。それは通常の投稿に対するコメントの処置とは変えなければ意味がないものになってしまいます。
あと、今回このゲストブックを作るにあたって、コメントに関してネットを見て回っていて気付いたのはメール入力に関しての事。wordpressはメールアドレスも必須入力にするという設定があるので、あまり気にもかけず入力を当然の事としていて、その上、そのメールアドレスを編集の際の認証にまで使ったりしてました。が、言われてみれば確かにメールアドレスの入力をしたくないという気持ちはあります。
もともとこのメールアドレス入力は、セキュリティとかスパム防止とかのためだと思うのですが、スパムなどはあたりまえのように入力してくるのであまり意味が無いように思うし、メールアドレスを教えていただく必要も無いという感じもあります。
ということで、その辺りの改良も考えてまずは承認の部分から考えました。
承認の設定においては「ディスカッション設定→コメント表示条件→すでに承認されたコメントの投稿者のコメントを許可し、それ以外のコメントを承認待ちにする」にチェックを入れています。通常の投稿へのコメント(いまだに全く無いのではありますが・・・)に関してはこの設定が望ましいと思います。なのでこの設定はそのままで、ゲストブックにおいてのコメントだけ承認という処理をすることなく、すぐに公開としたいのです。
意図するところはコメント送信後、データベースに登録される前のフックで、データベース上でコメント承認の値 comment_approvedの値を承認済みである”1”に設定すればいいと。
で、さっそくwordpress codex日本語版で使えそうなフックを探すと、アクションフックでcomment_postが見つかります。「コメントがデータベースに保存される直前に実行する。」という説明なのでこれで出来そうだとネットで使い方を調べていると、これはどうも説明文が誤訳ですね。本家英語版のcodexには「Runs just after a comment is saved in the database. 」となっていますからデータベースに登録直後に実行されるフックということです。ということなのでこれは使えません。
フィルターフックの方を探してみると、使えそうなフックは「pre_comment_approved」と「preprocess_comment」で二つあります。
preprocess_comment の説明は「新しいコメントをデータベースに保存する際、他の処理がまだ施されていないコメントデータに適用される。」です。どこで処理されるのかがいまひとつわからないのでソースで確認します。
コメントはフォームにおいてsubmitされるとwp-comments-post.phpを呼び出してPOSTにてデータが送信されます。そのwp-comments-post.phpにおいてコメントされた投稿のcomment_status等を調べた後でPOSTされたデータからコメントデータをまとめ、wp_new_comment()という関数を呼び出してそのデータを引数として渡します。この関数wp_new_comment()はwp-includes/comment.php内にあり、渡されたコメントデータの無害化と正規化をした後、同じファイル内にあるwp_insert_comment()関数を使ってデータベースに登録する関数です。実は前述のアクションフックcomment_postはこのwp_insert_comment()関数を呼び出してデータベースに登録した直後に実行されるフックです。
フィルターフックpreprocess_commentは、このwp_new_comment()関数の一行目にあり、真っ先に適用されるフィルターで、目的のcomment_approvedの値はこの後呼び出されるwp_allow_comment()関数にて変更されてしまいます。ということはこのpreprocess_commentというフィルターフックも使えないということです。
で、残されたフィルターフックpre_comment_approvedは「コメントの承認ステータス(true/false)に適用される。」という説明です。このフックはどこにあるかというと前述のwp_allow_comment()関数にあり、この関数がコメントの認証を検証してcomment_approvedの値を設定するそのものです。そしてpre_comment_approvedフックは設定したcomment_approvedの値をreturnする直前に適用されるフィルターです。ということでこのフィルターフックこそが使うべきフックということになります。
このフィルターフックpre_comment_approvedから得られる引数は二つあり、設定されたcomment_approvedの値の$approvedとコメントデータ全ての配列$commentdata。
今回の場合ゲストブックの固定ページだけで処理させたいのですが、$commentdataのcomment_post_IDの値でゲストブックのページが指定できます。そしてコメントデータは無害化、正規化され、認証の検証をされたデータであり、その検証においてスバムとは判断されなかった承認待ちのフラグ”0”が付けられた場合だけフラグを承認済みの”1”に変更すればいいと。で、function.phpに追加したコードは以下の通り。
<?php
function auto_comment_approve( $approved, $commentdata ) {
if ( 39776 === $commentdata['comment_post_ID'] ) {
if ( 0 === $approved ) {
$approved = 1;
}
}
return $approved;
}
add_filter( 'pre_comment_approved', 'auto_comment_approve', '99', 2 );
?>
2行目の39776はここのサイトのguest book固定ページのidです。実にシンプルです。承認に関してはこれにて完了。
で、ゲストブックに表示する入力フォームは、やはり通常の投稿のコメント用フォームとは変える必要があります。
メールアドレスの入力を無くすには、「ディスカッション設定→他のコメント設定→名前とメールアドレスの入力を必須にする」のチェックをはずしてしまえばそれで解決することではあるのですが。ま、名前欄も入力必須ではなくなりますが、それはフォームの方でrequiredにしておけばブラウザが警告してくれるはず。
ただ、通常の投稿のコメントにおいては「続、コメントの編集機能session版」で作った編集、削除機能を生かしておきたいということもあり、そのための認証用のキーワードにメールアドレス欄を利用しているいうこともあって、「名前とメールの入力を必須にする」にチェックを入れたままにしています。
一方、このゲストブックではメールアドレスもurl入力も必要ありません。url欄に関してはコメント表示用のテンプレートcomment.phpからそっくり削除してしまえばいいし、メールアドレス入力欄はinput要素のtype属性をhiddenに変えて、デフォルトの値としてvalue="x@x.xx"で設定してしまえば、常にメールアドレスとして”x@x.xx”が送信されるのでエラーにはならないと。ただ、無用のデータがデータベースに溜まっていくことになりますが、ひとつのコメントあたり6バイトです。
そのコメント用のテンプレートcomment.phpにおいてはis_page()をつかってguest book固定ページを指定して分岐させ、表示内容を変えています。
comment.php
<div id="comments">
<?php
if ( is_page('Guest book') ) {
$comstr = "ひとこと";
$comtit = "足跡を残してください!";
$comaf = '<p class="comment-notes"><span class="redcolor">*</span>Javascriptが必須です。</p>';
$combf = '<noscript><p class="comment-nojs redcolor">コメントを送信するにはjavascriptを有効にしてください。</p></noscript>';
$fields = array(
'author' => '<p class="comment-form-author">' . '<label for="author">Name</label><input id="author" name="author" type="text" value="' . esc_attr( $commenter['comment_author'] ) . '" size="30" required></p>',
'email' => '<p class="comment-form-email"><input id="email" name="email" type="hidden" value="x@x.xx"></p>',
);
$args = array(
'fields' => $fields,
'title_reply' => $comtit,
'comment_field' => '<p class="comment-form-comment"><label for="comment">'.$comstr.'</label><textarea id="comment" name="comment" cols="40" rows="3" aria-required="true"></textarea></p>',
'comment_notes_after' => $comaf,
'comment_notes_before' => $combf,
'label_submit' => 'Post comment',
'format' => 'html5',
);
comment_form( $args );
if ( have_comments() ) {
echo '<ul>';
wp_list_comments( array( "reverse_top_level" => true ) );
echo '</ul>';
}
} else {
/*この部分に通常の投稿のためのコメントフォームの表示*/
}
?>
</div>
24行目のwp_list_comments()は引数に何も指定しなければ、通常は投稿されているコメントを古い順(最新は一番下)に表示します。しかし、このGuest bookのようなページは新しい順(最新が一番上)に表示したほうが見やすいように思います。その場合は引数として array("reverse_top_level"=>true) を渡すことで逆順に指定することが出来ます。
ちなみにコメントのフォームを表示する関数comment_form()は/wp-includes/comment-template.phpの中にあって、そのデフォルト値はver 3.7.1では以下の通りです。これらの項目はカスタマイズ可能ということです。
$fields内のurlの項目は削除してしまって、emailは変更しています。あとはタイトルやら前と後ろに表示する文字列等を変更しています。
<?php
$fields = array(
'author' => '<p class="comment-form-author">' . '<label for="author">' . __( 'Name' ) . ( $req ? ' <span class="required">*</span>' : '' ) . '</label> ' .
'<input id="author" name="author" type="text" value="' . esc_attr( $commenter['comment_author'] ) . '" size="30"' . $aria_req . ' /></p>',
'email' => '<p class="comment-form-email"><label for="email">' . __( 'Email' ) . ( $req ? ' <span class="required">*</span>' : '' ) . '</label> ' .
'<input id="email" name="email" ' . ( $html5 ? 'type="email"' : 'type="text"' ) . ' value="' . esc_attr( $commenter['comment_author_email'] ) . '" size="30"' . $aria_req . ' /></p>',
'url' => '<p class="comment-form-url"><label for="url">' . __( 'Website' ) . '</label> ' .
'<input id="url" name="url" ' . ( $html5 ? 'type="url"' : 'type="text"' ) . ' value="' . esc_attr( $commenter['comment_author_url'] ) . '" size="30" /></p>',
);
$defaults = array(
'fields' => $fields,
'comment_field' => '<p class="comment-form-comment"><label for="comment">' . _x( 'Comment', 'noun' ) . '</label> <textarea id="comment" name="comment" cols="45" rows="8" aria-required="true"></textarea></p>',
'must_log_in' => '<p class="must-log-in">' . sprintf( __( 'You must be <a href="%s">logged in</a> to post a comment.' ), wp_login_url( apply_filters( 'the_permalink', get_permalink( $post_id ) ) ) ) . '</p>',
'logged_in_as' => '<p class="logged-in-as">' . sprintf( __( 'Logged in as <a href="%1$s">%2$s</a>. <a href="%3$s" title="Log out of this account">Log out?</a>' ), get_edit_user_link(), $user_identity, wp_logout_url( apply_filters( 'the_permalink', get_permalink( $post_id ) ) ) ) . '</p>',
'comment_notes_before' => '<p class="comment-notes">' . __( 'Your email address will not be published.' ) . ( $req ? $required_text : '' ) . '</p>',
'comment_notes_after' => '<p class="form-allowed-tags">' . sprintf( __( 'You may use these <abbr title="HyperText Markup Language">HTML</abbr> tags and attributes: %s' ), ' <code>' . allowed_tags() . '</code>' ) . '</p>',
'id_form' => 'commentform',
'id_submit' => 'submit',
'title_reply' => __( 'Leave a Reply' ),
'title_reply_to' => __( 'Leave a Reply to %s' ),
'cancel_reply_link' => __( 'Cancel reply' ),
'label_submit' => __( 'Post Comment' ),
'format' => 'xhtml',
);
?>
Post : 2013/11/25 15:08
Comments feed
Trackback URL : https://strix.main.jp/wp-trackback.php?p=39778