いまさらの Ajax でのコメントの編集機能プラグイン
Page No.1
Contents
またしても、いまさらの・・・だけど。
コメントの編集機能に手をつけるのは、これでなんと4度目。
まぁ、コメント自体、ほとんど無いので作りっぱなしでほっぽってあったのだけれど。
Google PAGESPEED INSIGHTS とか Chrome Lighthouse のパフォーマンスにおいて、なんとか100ポイントを、と、じたばたしているときに、このコメント編集プラグインにおいても、もっと省ける部分があるのでは?となったわけです。それならついでに、今ではもう当たり前のように使うようになった Ajax にしてしまおうと。
機能的には今までのと全く同じ。ただ JavaScript が無くても、ページ遷移で可能だった部分を無くしてしまったのと、ページ遷移を無くしたので、その部分を Ajax にて代用したという事。
2023/2/26 に、細かい部分をちょっと新しくして v3.0 から v3.1 へとアップデートさせてる。主に改良したのは、プラグインオプションの取得部分と現在日時の取得を DateTime クラスを使用する方法にしたこと。あとは細かいところでわずかでも速くなるかなと、効率が良くなるだろうというところを変更してる。プログラムの本流部分というか、肝心の部分はほとんどいじってはいない。JavaScript においては全く手を入れて無く、v3.0 そのまま。
で、一応、どういう感じかというと。
- 認証用のeditkey を入力するためのインプットボックスをコメントフォームに挿入
- そのeditkey はそのコメントのメタ情報としてcommentmeta テーブルに保存
- 実際の編集作業、および削除確認のためのフォームはポップアップするhtmlタグ<section>にて表示
- option を設けて都合によって使いやすくする
- そのoption は管理画面内に設定画面を設ける
- ついでにスパム防止用のチェックボックスも設置
- メール入力を必要としないようにダミーアドレスを自動で入力する機能も付加
- リクエストをへらすためポップアップのスタイル設定は js から設定しスタイルシートの読み込みを無くす
- そして一番こだわった部分は、コメントが無い時に不必要な js ファイルの読み込みをなくす
コメントフォーム自体の表示がない場合は、プラグインの読み込み自体を無くせれば良いのだけれど、プラグインの読み込みは投稿の情報の読み込みよりも前のようなので、いかんせん、これは無理のよう。
編集と削除確認のポップアップウィンドウ用のスタイル設定は、JavaScript からするようにして、それ用のスタイルシートの読み込みのリクエストを、まずは一つ減らすことができた。
そして、なぜ前回の時にこれに気が付かなかったのだろうか?と思ったのだけれど、JavaScript ファイルのロードに関して、そのフックへの登録を、コメントがあった場合の edit-key 入力用のインプットボックスを書きだすフックに一緒に設定すればよかったのだと。こうすれば、コメントがあるページでだけ JavaScript ファイルをロードすることになって、コメントの無いページにおいては、そのリクエストを減らすことができる。
フィルターフックにせよアクションフックにせよ、どこに書いても機能するというわけではないので、WordPress のロードプロセスを考えて、ここなら機能しそうだというところで試してやってみるしかないのだけれど。
と、いうことでコメントの無いページにおいては、スタイルシートと JavaScript ファイル、2つのリクエストを減らすことができたわけです。
まぁ、ただ単にスピードアップさせるためなら、もともと自作なのだからプラグインという形態ではなく、テンプレートに組み込んでしまえば、その方がよほど無駄な部分がなくなるのだけれど、なにかそれでは本末転倒という気もしないでもなく、あえてプラグインという形態にこだわって Lighthouse に挑戦してみた。
あと、プラグインという形式になっているのなら、WordPress の公式プラグインディレクトリになぜ登録しない?ということもあるけれど、Ajax によるコメント編集プラグインはすでに先人たちがアップロードしてくれているので、それこそいまさら!という感じが否めない。ただ、自分的には、必要な機能だけで極力軽いもので、100%自的に対応できるもの、ということになるとやはり自作でしか、ということになるりまする。
で、管理画面の option で設定できるのは以下の項目。
- 起動させたくないページは ページid で複数指定可。( 固定ページ、個別投稿ページ(カスタム投稿含む))
- コメントの削除の可否
- コメントの編集・削除が可能な期間の設定
- スパム防御機能の使用設定
- スパム防御機能において拒否したアドレスのログの保存の設定
- JavaScript ファイルのロード設定
- ポップアップウィンドウのスタイル設定の如何
- 編集、削除があった場合の管理者への通知メールの設定
- メールアドレスにダミーアドレスを入力する機能の使用設定
- 編集用ポップアップの背景色設定
と、いったところ。
起動させたくないページの設定に関しては、前述したとおり、基本的にそのページにコメントが無かったり、コメントがあっても編集可能期限内のコメントが無い場合は、JavaScript ファイルはロードされません。ただ、その場合でも、新規のコメントに対する備えとして、edit-key やスパムチェックのための要素は挿入されます。
それが、この起動させたくないページid を指定したページにおいては、それら edit-key やスパムチェックを含むプラグインのすべての機能が作動しないということになります。
コメント更新の wp_update_comment() と 削除の wp_delete_comment()
まずは、とりあえずコメント更新の関数 wp_update_comment() と 削除においての wp_delete_comment() について触れておきませう。
削除する方の wp_delete_comment() については、その使い方はいたってシンプルで、引数としてコメントID を指定するだけ。デフォルトではこの関数はコメントを完全に削除するのではなく、 comment_approved の値を trash に更新するということ。いわゆるごみ箱行きということです。で、第2引数として “true” を渡してやれば、ゴミ箱をバイパスしていきなり削除ということも可能だとのこと。
そして wp_update_comment()。
WordPress.org の CodeReference を見ると使用例が載っています。
コメントを未承認にする場合の使用例として、
まぁ、これだけでもだいたいはわかるが、今一度、/wp-includes/comment.php にある元の関数を見てみると、以前にこの関数に関しての記事を書いた時のものよりも、その内容は随分と多くなってる。けれど、要点部分はほぼ同じである。はじめの部分だけ引っ張ってくると、
5行目で、引数で渡した comment_ID により目的のコメントを取得し、29行目で更新したいデータを array_merge で上書きさせているのは、以前とやっていることは同じ。
要は、引数で渡すデータとして、comment_ID は必須で(そりゃそうだ、これがないと目的のコメントがわからない)後は、更新したいデータだけを一緒にして渡せば良いというだけのこと。
ちなみに、45行目を見るとわかるように、コメントを送信した日付を変更しようとした場合、自動的に comment_date_gmt の方も変更してくれるので、わざわざそれを変更する必要はありません。
plugin Simplistic Comment User Editable v3.1
と、いうことでさっそくプラグインの中身を。
はじめはワンパターンというかバカの一つ覚えというか、自分のプラグインのお決まりになっているプラグインオプションの処理。ただ、先述したとおりこの部分は新しくしてる。以前は、既存のオプションがある場合は、ただ、デフォルトとの個数を比べるだけでオプション項目に変更がないか確認していた。しかし、やはりこれでは完全とはいえず、まぁ、それを変更するのは自分だけだからということで良しとしてた。それを、処理速度を考えつつも完全な方式に変更してます。
最後にくっついてる japtime() なる関数は、見ての通り日本における現在日時を得る関数。日時を得る関数等の仕様を変更されるととにかく鬱陶しくて、日本だけの使用と限ったものなら自前のものを使っていたほうがよほど安心していられる、という経験から以前は自前のものを使っていたのだけれど、これからはこの DateTime クラスがわかりやすくてこれならという感じで良さげ。
ちょっと疑問なのは、WordPress は /wp-includes/comment.php にある、wp_new_comment() や wp_insert_comment() にしても、comment_date の値には、current_time( ‘mysql’ ) を使っていること。current_time() はその時に非推奨になって current_datetime() を使えってことではなかったのか?たぶん、current_time( ‘mysql’ ) を使っているということは、これを使わなければいけない何かがあるのだと思うのだけれどよくわからない。そもそも両方ともに使ったこともないし。
Post : 2021/08/02 17:48
Comments feed
Trackback URL : https://strix.main.jp/wp-trackback.php?p=167155