comment_form()のボタンをフックからカスタマイズしてみる
WordPressのcomment_form()で出力される「コメントを送信(英語名:Post Comment)」は通常<input type=”submit” />で出力される。
パブリックなページでフォームを使うところは、最近はもうsubmitボタンじゃなくてbuttonタグでやることがほぼほぼの主流なので、この古臭い書き方は正直なところ直したい。
以前、こちらの記事で今回の表題と似たようなことをやっていたが、当該の記事の場合は、comment_form()を出すテンプレート側に引数パラメータの設定とタグを直接指定をしなければならなかった。
これだとcomment_form()の手前もしくは中での引数の指定が長ったらしくなり、ボタンだけカスタマイズしたいときにソースコードがなんかとってもかっこわるい。
どうせならテンプレート側はcomment_form()単独で、そして、input type=”submit”からbuttonへまんま挿げ替えたいし、フックできないかと思って再びwp-includes/comment-template.phpのソースコードを調べてみた。
コメントフォームのタグを出力するフック関数が「comment_form_fields」なので、じゃあsubmitはさしあたりcomment_form_submit相当じゃねーかと予測。
某ハーフボイルド右側さんの「さぁ検索を始めよう」的なノリで、文字列を検索したら案の定、「comment_form_submit_button」という名前で引っかかってくれた。
function comment_form( $args = array(), $post_id = null ) { ~~~ /** * Filters the submit button for the comment form to display. * * @since 4.2.0 * * @param string $submit_button HTML markup for the submit button. * @param array $args Arguments passed to `comment_form()`. */ $submit_button = apply_filters( 'comment_form_submit_button', $submit_button, $args ); $submit_field = sprintf( ~~~ }
実際はコメントアウトされている部分以前にifとかforeachが入ってるけど、長ったらしくなるので省略して当該のところだけ抜粋。
まぁ、apply_filtersでcomment_form_submit_button()にapply_filterされているのがわかる。
そして、割り当てられた引数は$submit_buttonと$argsの2種。
この$argsはcomment_form()で渡される$argsと同意。つまり、$argsにある’name_submit’や’label_submit’とも連動している。
もうここまで調べたらもう非常にかんたん。
いつもの要領でcomment_form_submit_button()へフックを行う。
function theme_comment_form_submit_button($submit_button, $args){ $submit_button = '<button name="'.esc_attr($args['name_submit']).'" id="'.esc_attr($args['id_submit']).'" class="'.esc_attr($args['class_submit']).'">'.esc_attr($args['label_submit']).'</button>'; return $submit; } add_filter('comment_form_submit_button', 'theme_comment_form_submit_button', 10, 2);
参照値は念のためesc_attr()でエスケープ。
これでテンプレート側はcomment_form()単独で、そして、input type=”submit”からbuttonへまんま挿げ替えが行える。終わり。
Rails期間が1ヶ月ちょいあったせいで行末のセミコロンを省くクセがまだ抜けない今日このごろ(´・ω・`)
そういや、上のソースコード読みついでに他のソースコードもだらだら読んでたけど、WordPressってソースコードがMVC分離化されてないのね。
今更、MVC分離化なんてされないだろうし、あと5,6年くらいしたら他のMVC分離化されたより使いやすいCMSがWordPressを追い抜いて代頭してきそうな気がする。
一昔前はフロントエンド側のWeb標準がCMSに求められるものだったけど、それはもうどのCMSでもやってて当然、だから何?って感じだし、今度はMVC分離化なんだろうなぁ・・・。Megento2とかconcrete5は既に一応はMVC分離化されているみたいだし。