コメントの編集機能、nonceで作り直してプラグイン
Page No.1
この記事は公開または最後に更新されてから2090日が経過しています。情報が古くなっている可能性があるのでご注意下さい。
2021/8/2 バージョンアップ!
Ajax によりページ遷移が無し。
よけいなものを省いてより高速化。
スタイルシートのロードを廃止。スタイル設定は js にて実行。
編集可能なコメントがなければ js ファイルのロードも無し。
v3.0 にリニューアル -> 「いまさらの Ajax でのコメント編集機能プラグイン」
コメントの編集機能を作るのはこれで三度目。
一つ目はコメントしてくれた方が自分で編集や削除がとりあえず出来ればいいというもの。
→【コメントの編集機能】
二つ目はセキュリティのことを少し考えて session を利用してワンタイムチケットを付けて作り直したもの。
→【続、コメントの編集機能session版】
しかるに、WordPress にはワンタイムチケットのための nonce というシステムがちゃんと用意してあって、本来ならばそれを使うべきなのであります。ただ、知らなかったというだけのことなのです・・・、無知損、はずかしいのね~。
自分の場合、完全独学であるので現在においてもまだまだ無知損は多く存在していると思われます。(ちゃんと勉強しろよー、って、ですか、ですね~。)作っているものもいろいろな事をためしためし、良いと思われる方法を探しながら勉強しながらなので、もっと良い方法はあるとは思うのですけどね。
まぁ、で、ずっと気になっていたのでまたまた作り直したという次第なのです。
三度目の作り直しの内容はこんな感じです。
- 今までのと同様に認証用のeditkey を入力するためのインプットボックスをコメントフォームに挿入
- そのeditkey はそのコメントのメタ情報としてcommentmeta テーブルに保存
- 実際の編集作業、および削除確認のためのフォームはポップアップするhtmlタグ<section>にて表示
- そのポップアップ<section>はテンプレートタグ wp_footer のフックにより組み込む
- option を設けて都合によって使いやすくする
- そのoption は管理画面内に設定画面を設ける
- ついでにスパム防止用のチェックボックスも設置
- メール入力を必要としないようにダミーアドレスを自動で入力する機能も付加
- 出来る限りのコードをclass 内に閉じ込める
- そしてプラグイン化
と、いったところです。
で、option として以下の項目を設定できるようにしました。
- フロントページ設定の固定ページでの起動の如何
- 起動させたくない固定ページのページidを複数指定可
- 編集機能の起動をシングルページに限定
- スパム防御機能の使用の如何
- スパム防御機能において拒否したアドレスのログの保存の如何
- コメントの削除の可否
- 設定した期間を過ぎたコメントは編集が不可
- 個々のコメントにIDを表示させ、そのIDとeditkeyを入力し編集を指示するフォームを表示するか、個々のコメントに編集ボタンを表示してjavascriptによって隠しフォームをsubmit させるかの選択が可能。
- 表示する編集指示フォームがコメントフォームの前か後か
- その投稿のコメントにeditkeyを保存しているコメントが無くても編集指示フォームを表示するか否か
- スタイルシートをロードするか
- javascript ファイルをロードするか
- 編集、削除があった場合に管理者に通知メールをするか
- メールアドレスにダミーアドレスを入力する機能の使用の如何
- 編集用ポップアップの背景色
などなど。
できることであればプラグインの起動やスタイルシート、javascript ファイルを読み込むページを、インクルードタグcomment_template() の有無で判断させたかったのですが、WordPress の起動プロセスからしてもどうも無理のような感じです。そのページにコメントがあるかないかでも良いのですが、それもよくわかりませんでした。それゆえに、余計なスタイルシートやjavascriptファイルを読み込ませたくない固定ページは、そのid を指定し、option に保存することで判別するようにしています。
とりあえずデフォルトではフロントページ設定以外の全ての固定ページとシングルページにおいて、プラグインの機能とスタイルシート、javascript ファイルがロードされます。
編集の指示は、editkey を保存しているコメントにおいては、各コメントにコメントIDを表示させ、そのIDとeditkey を入力し指示するための編集、削除ボタンを備えたフォームを表示させる方法と、各コメントに編集ボタンを表示させjavascript によって隠しフォームをsubmit させる方法を選択できるようにしています。javascript の方だけで良かったような気もしますが、先に作ったのは編集フォームを表示させる方だったもので。今時、javascript を使えない環境というのもあまり考えなくても良さそうな気もしますが、逆にjavascript 必須ということが良い条件だったりするのかも知れません。
で、その編集フォームを表示させる場合に、option の「その投稿のコメントにeditkeyを保存しているコメントが無くても編集指示フォームを表示するか否か」が有効で、表示するページの投稿のコメントにおいて、editkey を保存しているものがあれば編集指示用のフォームを表示するようにした場合、editkey の有無はwp_list_comments() によってコメントが生成される時に確認し、それによりcomment_form() にあるフックによって表示するようにしています。と、いうことはテンプレートcomments.php において、wp_list_comments() よりもcomment_form() を先に記述してある場合、ekitkey を保存しているコメントが存在しても編集指示フォームは表示されないということになります。それゆえにekitkey の有無にかかわらずこのoption にて編集指示フォームを常に表示させることができるようにしています。
コメントデータの更新の関数 wp_update_comment() と削除においての wp_delete_comment() に関しては、【コメントの編集機能】、nonce に関しては、【カスタムフィールドの投稿入力フォームへの表示】に書いていますので詳しくはそちらをご覧あれ。
始めの目論見どおりコードのほとんどの部分をclass 内に閉じ込めていますので、class 自体が長いものになってしまっています。
部分的にとり出して載せていくことにします。
それでは始めの部分。
class の初期化に伴うoption に関連した部分と、各フックの登録。
別に関数を二つに分けなくても全てコンストラクタの中に一つにしてしまっても良いのですが、option 関連を使いまわししているのでこうなってしまっただけのことでたいして意味はありません。尚、option 関連の事は、【wordpress管理画面にテーマのオプション設定ページを表示】に書いています。
次にoption 設定画面用の管理画面への登録。
この部分も詳しくは、その同じページに書いています。ほとんど同じで使いまわしています。
29~33行目はスパムメール防御用に追加したチェックボックスによって、メール送信に失敗した ipアドレスのログリストを、ここで表示するためのファイル読み込みの処理です。
「__DIR__」はphp の自動的に定義されている定数でそのファイルの存在するディレクトリをかえします。dirname(__FILE__) と同じです。
「DIRECTORY_SEPARATOR」もphp の定義されている定数で、OS により異なるディレクトリの区切り文字を取得することができます。
ついでに付加した機能としてスパムコメントロボット対策のチェックボックス。
随分と前に【スパムコメント対策】のページにて施したもの。
実際、ほとんど防げているように思います。この機能で失敗したログのリストによってhtaccess に次から次へとdeny from にリストしていったので、もちろんその効果によるところも大きいのですが。
で、実は、【スパムコメント対策】のページのものから少し改良しています。
と、いうのは、チェックボックスを二つにしています。
一つはコメントを送信するときにチェックが必要で、もう一つは逆にチェックしてあってはいけないということで判断すると。
要は同じものが二つあって、一つは可、一つは否をロボットは判断できないだろうという目論見なのです。否の方はcss でhidden にしておけば人間様には見えないのでチェックしようがないということです。
もう一つは、コメント送信にはjavascriptを必須にするというのも有効な手だてとなるように思います。それもたとえば、否の方のチェックボックスをデフォルトでチェックしておいてjavascript で起動時に外すということにしておけばできるのではないかと思いました。
とはいうものの、チェックボックス一つでも十分だったような気もします。
と、いうことでそのスパム対策の部分。
そしていよいよ本題のeditkey 関連のコード。
やっとnonce が出てきます。nonce に関しては【カスタムフィールドの投稿入力フォームへの表示】をご覧ください。
editkey はハッシュ値にして保存しています。WP にはwp hash password というハッシュ関数が用意されているのですが、実はこれを使ってやってみたのですが、どうもうまくいかない。どうにもハッシュ値が検証で同じにならなくて、今の所あきらめてしまっています。今後、要勉強ということで。とりあえずコメントの認証であるし、パッと見でわからなければ良いだろうということでmd5 を使っています。
プラグイン用のjavascriptファイルとスタイルシートを登録する部分。
まだまだ続きます。
編集または削除ボタンを押されて、ページが再読み込みされて実際に編集作業をするフォームを表示するための部分。
そのためのhtml をwp_footer に登録して表示します。
始めに出てくるセッター関数はそのhtml を記述してある関数の中で使用したい変数に先んじて値を代入するためのものです。当然、アクションフックWp_footer よりも先に呼び出します。
余計といえば余計ではありますが、その編集作業フォームの背景色を選択できる機能がつけてあります。それは色指定を<section> タグのclassとして指定し、javascript でそのclass によって背景色を変更するようにしています。javascript を使わなくてもphp でスタイルシートを変更するのは簡単なことなのですが、そうするとスタイルシートが複数必要になるし、まぁ、どうでもいいことなのでなるべく簡潔に、というところです。
Post : 2015/12/16 11:16
Talking
プラグイン
Simplistic Comment User Editable テスト表示
javascritp ボタン表示タイプです。
js などちょっと改良して
version 1.2 に
再びアップデート中!
スタイルのロード方法、より高速化など変更して
version 2.0 へ
2021/8/2 version 3.0、アップデート完了!
Ajax によりページ遷移無し。
スタイルシートの廃止。
余分なものを省きより高速化。
編集可能なコメントがない場合、js ファイルのロードもしない。
https://strix.main.jp/?diys=ajax_wp_comment_editable
Comments feed
Trackback URL : https://strix.main.jp/wp-trackback.php?p=60972