深夜にご飯を食べながらツイッターを眺めていると、 @masashi0923 さんが、こんな質問をされていました。
たしかに、ディスカッション設定パネルには、投稿と固定ページで設定を分ける項目もありませんし、固定ページを作るときに、いちいちディスカッションのボックスでコメントを停止することも面倒で、つい忘れてしまうこともありそうです。
なので、固定ページの場合には、強制的にコメントをつけられないようにするコードをささっと書いてみました。(探せばプラグインなどありそうですけどね。。)
Twenty Tenの comments.php テンプレートを見てみると最後の方に、
<?php comment_form(); ?>
というコードがあり、ここでコメントのフォームの入力フォームが表示されます。
この comment_form 関数は、wp-includes/comment-template.php に記述されていて(ver3.1.2)、関数内部において、コメントフォームの出力は、下記のような分岐処理の中で行われています。
<?php if ( comments_open() ) : ?>
つまり、comments_open() が、真と判断される状態でないと、コメントの入力フォームが表示されないということになります。
また、入力フォームの表示だけでなく、実際にコメントが投稿される動作において、機能が停止されるようでないと、スパムコメントがどしどし来てしまう状態になりかねません。
WordPressのコメントの投稿は、 wp_comments_post.php で受けるようになっていて、このファイルの一部に下記のようなコードがあります。
if ( !comments_open($comment_post_ID) ) { do_action('comment_closed', $comment_post_ID); wp_die( __('Sorry, comments are closed for this item.') );
簡単に言うと、コメントが投稿された記事のコメントが許可されていなければ動作を停止する、という処理になっています。
結果として、表示およびコメント投稿機能において、記事の種類を判別し、固定ページの場合は常に、comments_open が偽となるような状態にすればよいわけです。
これを踏まえて、comments_open のソース(wp-includes/comment-template.php ver3.1.2)を見ると、
function comments_open( $post_id=NULL ) { $_post = get_post($post_id); $open = ( 'open' == $_post->comment_status ); return apply_filters( 'comments_open', $open, $post_id ); }
と、comments_open というフィルターフックがあるので、これが利用可能です。
テーマの functions.phpなどに、CODE 1を記述してもらえれば、固定ページの場合、常に false が返るようになり、コメントが出来ないようになります。
CODE 1
function page_comment_close_force( $open, $post_id ) { $post_id = (int)$post_id; $post = get_post( $post_id ); if ( $post && $post->post_type == 'page' ) { $open = false; } return $open; } add_filter( 'comments_open', 'page_comment_close_force', 10, 2 );
もし、固定ページではなく、カスタム投稿タイプを停止させたい場合は、CODE 1の page の替わりにカスタム投稿タイプのスラッグを指定してください。
複数の投稿タイプを停止させたい場合は、
if ( $post && $post->post_type == 'page' ) {
を
if ( $post && in_array( $post->post_type, array( 'page', 'hoge' ) ) ) {
のようにすれば良いです。
「WordPressの固定ページで、コメント投稿をできないようにする」への1件のフィードバック