Wonderful! WordPress

コメントの編集機能、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 に関連した部分と、各フックの登録。

<?php
	//delete_option('smplstc_commedt_option');//既存のオプション値を強制的にデフォルトに戻す時使用

	class Simplistic_Comment_User_Editable {

		private $comid;
		private $editkey;
		private $opestr;
		private $e_startup;
		private $s_startup;
		private $current;
		private $default;
		private $ret_option;
		private $option_name;
		private $is_editkey;

		public function __construct() {
			$this->e_startup = 1;// 0:edit起動しない、1:起動
			$this->s_startup = 1;// 0:spam起動しない、1:起動
			$this->option_name = 'smplstc_commedt_option';
			$this->is_editkey = 0;
			$this->load_option();
		}

		private function load_option() {

			// オプションのデフォルト値設定
			$this->default = array(
				'disable_front' => '1', //フロントページ設定の固定ページでは起動しない、起動しない:1、する:0
				'ignore_page' => '', //起動しない固定ページのページidを,で区切って指定
				'only_single' => '0', //編集機能の起動をシングルページに限定、限定:1、限定しない:0
				'edit_possible_period' => '30', //編集可能な日数
				'en_def_spam' => '1', //spam防御機能を使用、使用:1、非使用:0
				'save_check_er_log' => '1',//spam防御機能のエラー時のログを残す、1:残す、0:残さない
				'en_delete' => '1',//コメントの削除の可否、可:1、否:0
				'submit_form_or_js' => '0',//編集命令フォームを表示するかjsでsubmitさせるか、1:フォーム、0:js
				'show_form_before' => '1',//表示する編集命令フォームがコメントフォームの前か後か、1:前、0:後
				'show_form_always' => '1',//editkeyを保存しているコメントが無くても編集命令フォームを常に表示、1:常に表示、0:ある時だけ表示
				'load_style_sheet' => '1',//style sheetをロードする、1:ロードする、0:しない
				'load_js' => '1',//javascript fileをロードする、1:ロードする、0:しない
				'en_notice_mail' => '1',//編集、削除があった場合に管理者に通知メールをする、1:する、0:しない
				'en_dummy_mailadrs' => '0',//ip addressから作るダミーメールアドレスを入力する、1:する、0:しない
				'back_color' => '0',//編集用画面の背景色、0:えんじ、1:緑、2:青、3:深紫、4:黒
			);

			// 既に設定してあるoption 値を取得
			$this->current = get_option( $this->option_name );
	
			if ( false === $this->current ) {// 初使用の時などオプションが設定されていない時
				update_option( $this->option_name, $this->default );// デフォルトでオプション設定
				$this->ret_option = $this->default;
			} elseif ( count( $this->current ) !== count( $this->default ) ) {// 新規オプション増設時など既にあるオプションとデフォルトで数が違う時
				if ( count( $this->current ) > count( $this->default ) ) {// オプションの数を減らした時
					$newary = array_intersect_key( $this->current, $this->default );
				}else{
					$newary = $this->current;
				}
				$up_option = array_merge( $this->default, $newary );// ユーザー設定値で上書き
			
				update_option( $this->option_name, $up_option );
				$this->ret_option = $up_option;
			} else {
				$this->ret_option = $this->current;
			}

			// spam防止用のチェックボックスと認証用editkeyのテキストボックスを登録
			add_action( 'comment_form_after_fields', array( $this, 'add_comment_check' ) );

			// ekitkeyが入力されているそれぞれのコメントにコメントIDを表示する関数を登録
			add_filter( 'comment_text', array( $this, 'add_commentlist_edit_bt' ), 10, 3 );

			// コメントが保存された時にeditkeyを保存する関数を登録
			add_action( 'comment_post', array( $this, 'save_comment_editkey' ) );

			// コメントIDとeditkeyを入力するためのフォームを表示する関数を登録
			if ( '1' === $this->ret_option['show_form_before'] ) {
				add_action( 'comment_form_before', array( $this, 'add_comment_edit_form' ) );
			} else {
				add_action( 'comment_form_after', array( $this, 'add_comment_edit_form' ) );
			}

			// editkeyの説明文を表示に加える関数を登録
			add_filter( 'comment_form_defaults', array( $this, 'add_comment_editkey_str' ) );

			// コメントが削除された時にeditkeyも削除する関数を登録
			add_action( 'deleted_comment', array( $this, 'delete_editkey' ) );

			// 編集および削除ボタンが押され再読み込みの時の処理の分岐関数の登録
			add_action( 'wp', array( $this, 'branch_start' ) );

			// spam防止用のチェックボックスをコメントが保存される前にチェックする関数の登録
			add_action( 'pre_comment_on_post', array( $this, 'my_comment_spam_check' ) );

			if ( '1' === $this->ret_option['en_dummy_mailadrs'] ) {
				// mail addressにip addressから作ったダミーアドレスをセットする関数を登録
				add_filter( 'preprocess_comment', array( $this, 'set_dummy_mailaddress' ) );
			}

			// ↓プラグインのjavascriptファイルとスタイルシートを登録
			add_action( 'wp_enqueue_scripts', array( $this, 'load_css_jq' ) );
		}// function load_option ここまで

		// ↓class 続く
?>
PHP
CopyExpand

別に関数を二つに分けなくても全てコンストラクタの中に一つにしてしまっても良いのですが、option 関連を使いまわししているのでこうなってしまっただけのことでたいして意味はありません。尚、option 関連の事は、【wordpress管理画面にテーマのオプション設定ページを表示】に書いています。

次にoption 設定画面用の管理画面への登録。
この部分も詳しくは、その同じページに書いています。ほとんど同じで使いまわしています。
29~33行目はスパムメール防御用に追加したチェックボックスによって、メール送信に失敗した ipアドレスのログリストを、ここで表示するためのファイル読み込みの処理です。
「__DIR__」はphp の自動的に定義されている定数でそのファイルの存在するディレクトリをかえします。dirname(__FILE__) と同じです。
「DIRECTORY_SEPARATOR」もphp の定義されている定数で、OS により異なるディレクトリの区切り文字を取得することができます。

<?php
		// class 続き↓
		//↓ここから管理画面のメニューにオプション設定ページを登録する処理
		public function commedt_add_menu() {
			add_options_page( 'Simplistic Comment Edit plugin Option', 'Simplistic Comment Edit Option', 'administrator', 'splcomedt_plugin_options', array( $this, 'splcomedt_page_output' ) );
			add_action( 'admin_init', array( $this, 'register_splcomedt_settings' ) );
		}
 
		public function register_splcomedt_settings() {
			register_setting( 'splcomedt-settings-group', $this->option_name );
		}

		public function splcomedt_page_output() {
			$exp = array();
			$exp[] =  'フロントページ設定の固定ページでは起動しない:1、する:0';
			$exp[] = '起動しない固定ページのページidを,で区切って指定';
			$exp[] = '編集機能の起動をシングルページに限定、Yes : 限定、No : 限定しない';
			$exp[] = '編集可能な日数';
			$exp[] = 'spam防御機能を使用、Yes : 使用、No : 非使用';
			$exp[] = 'spam防御機能のエラー時のログを残す、Yes:残す、No:残さない';
			$exp[] = 'コメントの削除の可否、Yes : 可、No : 否';
			$exp[] = '編集命令フォームを表示するかjsでsubmitさせるか、1:フォーム、0:js';
			$exp[] = '表示する編集命令フォームがコメントフォームの前か後か、Yes:前、No:後';
			$exp[] = 'editkeyを保存しているコメントが無くても編集命令フォームを常に表示、Yes:常に表示、No:ある時だけ表示';
			$exp[] = 'style sheetをロードする、1:ロードする、0:しない';
			$exp[] = 'javascript fileをロードする、1:ロードする、0:しない';
			$exp[] = '編集、削除があった場合に管理者に通知メールをする、1:する、0:しない';
			$exp[] = 'ip addressから作るダミーメールアドレスを入力する、1:する、0:しない';
			$exp[] = '編集用画面の背景色、0:えんじ、1:緑、2:青、3:深紫、4:黒';

			// spam防御機能によりコメント送信に失敗したログファイルの読み出し
			$filnam = __DIR__ . DIRECTORY_SEPARATOR . 'checklist.php';
			$erlist = array();
			if ( file_exists( $filnam ) ) {
				$erlist = file( $filnam );
			}
?>
			<div class="wrap">
				<h2>Simplistic Comment Users Edit plugin Option</h2>
				<h3>Option Config</h3>
				<form method="post" action="options.php">
					<?php
						settings_fields( 'splcomedt-settings-group' );
						do_settings_sections( 'splcomedt-settings-group' );
					?>
					<table class="form-table">
						<tr><td>option</td><td>Yes</td><td>No</td></tr>
						<?php
							$i=0;
							foreach($this->ret_option as $key=>$val){
								if ( 'back_color' === $key ) {
									echo '<tr><td>'.$exp[ $i ].'</td><td><input type="number" name="smplstc_commedt_option['.$key.']" value="' . intval( $val ) . '" min="0" max="4"></td><td></td></tr>';
								} elseif ( 'edit_possible_period' === $key ) {
									echo '<tr><td>'.$exp[ $i ].'</td><td><input type="number" name="smplstc_commedt_option['.$key.']" value="' . intval( $val ) . '" min="1"></td><td></td></tr>';
								} elseif ( 'ignore_page' === $key ) {
									echo '<tr><td>'.$exp[ $i ].'</td><td><input type="text" name="smplstc_commedt_option['.$key.']" value="' . esc_attr( $val ) . '"></td><td></td></tr>';
								} else {
									if($val==='1'){
										$ychecked=' checked';
										$nchecked='';
									}else{
										$ychecked='';
										$nchecked=' checked';
									}
									echo '<tr><td>'.$exp[ $i ].'</td><td><input type="radio" name="smplstc_commedt_option['.$key.']" value="1"'.$ychecked.'></td><td><input type="radio" name="smplstc_commedt_option['.$key.']" value="0"'.$nchecked.'></td></tr>';
								}
								++$i;
							}
						?> 
					</table>
					<?php submit_button(); ?>
				</form>

				// spam防御機能によりコメント送信に失敗したログリストの表示
				<?php
					if ( count( $erlist ) ) {
						echo '<dl><dt>Not checked list</dt><dd><ul>';
						foreach( $erlist as $val ) {
							echo '<li>' . $val . '</li>';
						}
						echo '</ul></dd></dl>';
					}
				?>
			</div>
<?php
		}
		//↑ここまで
		// ↓class続く
?>
PHP
CopyExpand

ついでに付加した機能としてスパムコメントロボット対策のチェックボックス。
随分と前に【スパムコメント対策】のページにて施したもの。
実際、ほとんど防げているように思います。この機能で失敗したログのリストによってhtaccess に次から次へとdeny from にリストしていったので、もちろんその効果によるところも大きいのですが。
で、実は、【スパムコメント対策】のページのものから少し改良しています。
と、いうのは、チェックボックスを二つにしています。

一つはコメントを送信するときにチェックが必要で、もう一つは逆にチェックしてあってはいけないということで判断すると。
要は同じものが二つあって、一つは可、一つは否をロボットは判断できないだろうという目論見なのです。否の方はcss でhidden にしておけば人間様には見えないのでチェックしようがないということです。
もう一つは、コメント送信にはjavascriptを必須にするというのも有効な手だてとなるように思います。それもたとえば、否の方のチェックボックスをデフォルトでチェックしておいてjavascript で起動時に外すということにしておけばできるのではないかと思いました。
とはいうものの、チェックボックス一つでも十分だったような気もします。
と、いうことでそのスパム対策の部分。

<?php
		// class 続き↓
		//spam防止用のチェックボックスと認証用editkeyのテキストボックスを登録する関数
		public function add_comment_check() {

			// 変数e_startupは編集機能を使用するか否か
			if ( 1 === $this->e_startup ) {
				$labelstr = '英字(大文字小文字)のみで5文字以上で入力ください。';
?>
				<p class="comment-form-editkey"><label for="editkey">editkey : <?php echo $labelstr; ?></label>
					<input id="editkey" name="editkey" type="text" value="" size="30" />
				</p>
<?php
			}

			// 変数s_startupはspam防御機能を使用するか否か
			if ( 1 === $this->s_startup ) {
				$labelstr = 'コメント送信時にチェックしてください。';
?>
				<p class="comment-form-check">
					<label><?php echo $labelstr; ?></label>&ensp;<span class="required">*</span>
					<input type="checkbox" name="comment_check" id="comment_check" value="send" />
					<input type="checkbox" name="please_check" id="please_check" value="reply" />
				</p>
<?php
			}
		}

		//spam防止用のチェックボックスをコメントが保存される前にチェックする関数
		public function my_comment_spam_check( $comment_post_ID ) {

			// optionでスパム防御機能を使用する設定であれば
			if ( '1' === $this->ret_option['en_def_spam'] ) {

				/*
				comment_checkがチェックされていないかまたはplease_checkがチェックされている場合に
				コメントを保存しない
				*/
				if ( ! isset( $_POST['comment_check'] ) or isset( $_POST['please_check'] ) ) {

					/*
					拒否したときのログを残すoptionの設定であれば
					ファイルにログを残す処理
					*/
					if ( '1' === $this->ret_option['save_check_er_log'] ) {
						$checkstr = '';
						if ( ! isset( $_POST['comment_check'] ) ) {
							$checkstr .= 'Comment_Check not checked';
						}
						if ( isset( $_POST['please_check'] ) ) {
							$checkstr .= ' Please_Check checked';
						}
						$cdt = date( 'Y/m/d H:i:s' );
						$ipadrs = $_SERVER['REMOTE_ADDR'];
						$hname = gethostbyaddr( $ipadrs );
	
						$filnam = __DIR__ . DIRECTORY_SEPARATOR . 'checklist.php';
						$fp = fopen( $filnam, 'a+b' );
						flock( $fp, LOCK_EX );
						fputs($fp,"$cdt  [$ipadrs]  [$hname] $checkstr\n");
						fclose($fp);
					}

					wp_die( 'ERROR' );
				}
			}
		}
		// ↓class続く
?>
PHP
CopyExpand

そしていよいよ本題のeditkey 関連のコード。
やっとnonce が出てきます。nonce に関しては【カスタムフィールドの投稿入力フォームへの表示】をご覧ください。
editkey はハッシュ値にして保存しています。WP にはwp hash password というハッシュ関数が用意されているのですが、実はこれを使ってやってみたのですが、どうもうまくいかない。どうにもハッシュ値が検証で同じにならなくて、今の所あきらめてしまっています。今後、要勉強ということで。とりあえずコメントの認証であるし、パッと見でわからなければ良いだろうということでmd5 を使っています。

<?php
		// class 続き↓
		//ekitkeyが入力されているそれぞれのコメントにコメントIDを表示する関数
		public function add_commentlist_edit_bt( $comment_text, $comment =null, $args = null ) {
			if ( 1 === $this->e_startup ) {
				if ( ! is_null( $comment ) ) {

					//現在の時間とコメント送信時間を比較して編集可能期間かを調べる
					$nowtime = time();
					$comtime = strtotime( $comment->comment_date );
					$timedif = floor( ( $nowtime - $comtime ) / (60 * 60 * 24 ) );
					$timelimit = intval( $this->ret_option['edit_possible_period'] );
					$timedir = $timedif <= $timelimit ? true : false; 

					// コメントIDからcommentmetaテーブルにあるeditkeyを取得
					$comid = $comment->comment_ID;
					$editkey = get_comment_meta( $comid, 'my_comment_editkey' );

					// editkeyがあり編集可能期間内である場合にそのコメントにコメントID、または編集指令ボタンを表示
					if ( $editkey and $timedir ) {
						if ( '1' === $this->ret_option['submit_form_or_js'] ) {
							$comment_text .= '<p id="comeditid-'.$comid.'" class="commno">comment-id:'.$comid.'</p>';

							/*
							変数is_editkeyはその投稿にeditkeyを保存しているコメントがあるか否かのフラグ
							後にコメントIDとeditkeyを入力するためのフォームを表示する関数で使用
							*/
							$this->is_editkey = 1;
						} else {

							//javascriptでsubmitさせる設定の時のボタン
							$comment_text .= '<span id="cmeditbt-' . $comid . '" class="comeditorderbt" title="Java script is necessary">edit</span>';
						}
					}
				}
			}
			return $comment_text;
		}

		//コメントが保存された時にeditkeyを保存する関数
		public function save_comment_editkey( $comment_id ) {
			if ( isset( $_POST['editkey'] ) and '' !== $_POST['editkey'] ) {
				$editkey = md5( $_POST['editkey'] );
				add_comment_meta( $comment_id, 'my_comment_editkey', $editkey );
			} else {
				return;
			}
		}

		//コメントIDとeditkeyを入力するためのフォームを表示する関数
		public function add_comment_edit_form() {
			if ( 1 === $this->e_startup ) {
				if ( '1' === $this->ret_option['submit_form_or_js'] ) {
					if ( 1 === $this->is_editkey or '1' === $this->ret_option['show_form_always'] ) {
?>
						<form name="dircomform" action="" method="post">
							<div id="dircomfrm">
								<label for="comid">Comment ID</label>
								<input type="text" name="comid" id="comid" value="" size="8">
								<label for="direditkey">Entered edit key</label>
								<input type="text" name="direditkey" id="direditkey" value="" size="30">
								<input type="submit" name="editcom" id="editcom" value="&ensp;edit&ensp;">
								<?php if ( '1' === $this->ret_option['en_delete'] ) : ?>
								<input type="submit" name="delcom" id= "delcom" value="delete">
								<?php endif; ?>
<?php
								//wp nonce フィールドを表示
								wp_nonce_field( wp_create_nonce( __FILE__ ), 'my_nonce' );
?>
							</div>
						</form>
<?php
					}
				} else{
?>
					<form name="dircomform" action="" method="post">
						<div id="dircomjsfrm">
							<input type="hidden" name="comid" id="comid" value="" size="8">
							<input type="hidden" name="direditkey" id="direditkey" value="" size="30">
							<input type="hidden" name="editcom" id="editcom" value="edit" size="30">
<?php
							//wp nonce フィールドを表示
							wp_nonce_field( wp_create_nonce( __FILE__ ), 'my_nonce' );
?>
						</div>
					</form>
<?php
				}
			}
		}

		/*
		editkeyの説明文を表示に加える関数
		独自に”comment_notes_before”を設定して、comment_form()を
		使用している場合は、以下のフックを適用した後で独自の設定によって
		上書きされてしまうため無効となってしまう。
		その場合は独自に”comment_notes_before”の文に付加する必要あり。
		*/
		public function add_comment_editkey_str( $defaults ) {
			if ( 1 === $this->e_startup ) {
				$strbefore = $defaults['comment_notes_before'];
				$changestr = '<br><span id="editkey-note">When enter editkey, you can edit or delete later.</span></p>';
				$strbefore = str_replace( '</p>', $changestr, $strbefore );
				$defaults['comment_notes_before'] = $strbefore;
			}
			return $defaults;
		}
		// ↓class続く
?>
PHP
CopyExpand

プラグイン用のjavascriptファイルとスタイルシートを登録する部分。

<?php
		// class 続き↓
		//プラグインのjavascriptファイルとスタイルシートを登録する関数
		public function load_css_jq() {
			if ( 1 === $this->s_startup or 1 === $this->e_startup ) {
				if ( '1' === $this->ret_option['load_style_sheet'] ) {
					wp_enqueue_style( 'splstc_comedit_style', plugins_url( 'splstc_comedit_r.css', __FILE__ ), false, date( 'YmdHis', filemtime(plugin_dir_path( __FILE__ ).'splstc_comedit_r.css' )) );
				}
				if ( '1' === $this->ret_option['load_js'] ) {
					wp_enqueue_script( 'splstc_comedit_js',plugins_url( 'splstc_comedit.js', __FILE__ ), false, date( 'YmdHis', filemtime(plugin_dir_path( __FILE__ ).'splstc_comedit.js' )),true);
				}
			}
		}
		// ↓class続く
?>
PHP
CopyExpand

まだまだ続きます。
編集または削除ボタンを押されて、ページが再読み込みされて実際に編集作業をするフォームを表示するための部分。
そのためのhtml をwp_footer に登録して表示します。
始めに出てくるセッター関数はそのhtml を記述してある関数の中で使用したい変数に先んじて値を代入するためのものです。当然、アクションフックWp_footer よりも先に呼び出します。
余計といえば余計ではありますが、その編集作業フォームの背景色を選択できる機能がつけてあります。それは色指定を<section> タグのclassとして指定し、javascript でそのclass によって背景色を変更するようにしています。javascript を使わなくてもphp でスタイルシートを変更するのは簡単なことなのですが、そうするとスタイルシートが複数必要になるし、まぁ、どうでもいいことなのでなるべく簡潔に、というところです。

<?php
		// class 続き↓
		//それぞれの変数に値を代入するセッター
		public function setvalue( $id, $key, $ope ) {
			$this->comid = $id;
			$this->editkey = $key;
			$this->opestr = $ope;
		}

		//編集作業フォームを表示するためにwp_footerに登録されるhtml
		public function regist_footer() {
			$comment = get_comment( $this->comid );
			$exp = array();
			$exp[] = '処理をキャンセルして通常表示に戻ります';
			$exp[] = 'コメントID';
			$exp[] = 'コメント送信者';
			$exp[] = '編集ボタンで編集した結果を保存します。';
			$exp[] = 'このコメントを削除します。戻すことは出来ませんのでご注意ください。';
			$exp[] = 'このコメントは編集、削除可能期間を過ぎています。';

			$colorclass = 'rcolor';
			if ( '1' === $this->ret_option['back_color'] ) {
				$colorclass = 'gcolor';
			} elseif ( '2' === $this->ret_option['back_color'] ) {
				$colorclass = 'ncolor';
			} elseif ( '3' === $this->ret_option['back_color'] ) {
				$colorclass = 'wcolor';
			} elseif ( '4' === $this->ret_option['back_color'] ) {
				$colorclass = 'bcolor';
			}

			$nowtime = time();
			$comtime = strtotime( $comment->comment_date );
			$timedif = floor( ( $nowtime - $comtime ) / (60 * 60 * 24 ) );
			$timelimit = intval( $this->ret_option['edit_possible_period'] );
			$timedir = $timedif <= $timelimit ? true : false; 

?>
			<section id="comeditsec" class="<?php echo $colorclass; ?>">
				<div id="comeditfrm">
					<div class="lascomfrm">
						<p id="erasecomfrm" title="<?php echo $exp[0]; ?>">×</p>
						<p id="lastchckfrmp"><?php echo $exp[1]; ?> : <?php echo $this->comid; ?><br>
							<?php echo $exp[2]; ?> : <?php echo $comment->comment_author; ?></p>
					<?php if ( $timedir ): ?>
						<form name="comeditform" action="" method="post">
							<input type="hidden" name="lcomid" value="<?php echo $this->comid; ?>"><br>
							<input type="hidden" name="leditkey" value="<?php echo $this->editkey; ?>"><br>
							<input type="hidden" name="lcomauth" value="<?php echo $comment->comment_author; ?>"><br>
							<input type="hidden" name="lcomcont" value="<?php echo esc_attr( $comment->comment_content ); ?>"><br>
<?php
							//wp nonce フィールドを表示
							wp_nonce_field( wp_create_nonce( __FILE__ ), 'com_nonce' );
?>
							<textarea name="lasthon" rows="20" cols="80" required><?php echo esc_textarea( $comment->comment_content ); ?></textarea><br>
							<?php if ( 'e' === $this->opestr ): ?>
								<p><?php echo $exp[3]; ?></p>
								<input type="submit" name="editlast" value="edit">
							<?php endif; ?>
							<?php if ( 'd' === $this->opestr or '0' === $this->ret_option['submit_form_or_js'] ): ?>
								<p><?php echo $exp[4]; ?></p>
								<input type="submit" name="dellast" value="delete">
							<?php endif; ?>
						</form>
					<?php else: ?>
						<p><?php echo $exp[5]; ?></p>
					<?php endif; ?>
					</div>
				</div>
			</section>
<?php
		}

		public function splstc_comedit_resist_script() {

			//↓プラグインを表示するための<div>をwp_footerに登録
			add_action( 'wp_footer', array( $this, 'regist_footer' ) );
		}
		// ↓class続く
?>
PHP
CopyExpand

Talking

  • admin より:

    プラグイン
    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

    edit

Leave a Reply!

JavaScript is necessary to send a comment.
You can edit and delete your comment if you input a edit key.
Edit key is necessary for attesting you when you edit and delete it.
The tag of HTML cannot be used in comment.
When you comment for the first time, it is displayed after the approval of the administrator.
Because I cannot speak English so much, it takes time to answer.
Required fields are marked *.

※Please enter more than 5 characters only alphabets.
※Edit or delete are possible for 2000 days after approval.

*

♠Simplistic Comment User Editable v4.0

♠When visitors leave comments on the site this site collect the data shown in the comments form, and also the visitor’s IP address and browser user agent string to help spam detection.
♠This site does not use cookie when visitors leave comments and commenter edit comment.
♠This site uses Akismet to reduce spam. Learn how your comment data is processed.

Comments feed

Trackback URL : https://strix.main.jp/wp-trackback.php?p=60972

Sanbanse Funabashi
2011.01.01 sunrise

Top

スクロールさせるか画像をクリックすると元に戻ります。

×

Comment ID :
Comment Author :



save edited comment with an edit button.

Delete this comment. Because you cannot go back up, please be careful.

Simplistic Comment User Editable v4.0