[WordPress] 特定ユーザーの投稿を自動でゴミ箱へ移動する [functions.php]

当ページのリンクには広告が含まれています。

同じ内容や、好ましくない内容を書き込み続ける会員さんの投稿を自動で削除するコードです。テーマは旦那デスノートのベースになっているask-meです。
ask-meを踏まえた旦那デスノートの仕組みの解説はこちら

誹謗中傷などを書いているわけではないので、BANするほどでも無い。でも、どうせNGにするから検閲するのが面倒。だったら、会員さんにバレないように投稿と同時にゴミ箱へ移動するようにしたい、というWordpressのPHPコードです。

投稿の中には、引き寄せの法則といって、嘘の「死にました」報告をする方が少しいます。1回か2回くらいだったら良いのですが、5回も6回も毎回、死亡報告をする人もいます。また、死亡報告をすると、コメントが多く付いたり、「死ねばイイネ!」がたくさん押されます。

コメントや死ねばイイネ目的で投稿している可能性も、無くはないはずです。だからといって、BANして強制退会させるほどでもないので、けっこう悩んじゃうところです。そんな時は、投稿と同時にゴミ箱へ移動してしまえば、検閲しなくて済むので楽になります。

コードの追加はfunctions.phpではなく、プラグインのコードスニペットから1項目として追加しています。
コードスニペット – WordPressのプラグイン

投稿と同時にゴミ箱へ移動するんだけど、一応中身も確認しておきたいから、投稿と同時にメール通知もしてね、っていう拡張になってます。メールで知らせてくれたら、忘れないでしょ。

以下、コードです。

  
add_action( 'new_to_draft', 'new_question_to_trash_by_specific_user', 10, 1 );


function new_question_to_trash_by_specific_user( $post ) {

	// カスタム投稿タイプの確認
	if( $post->post_type == 'question' ){
	
	
  $user_list = array(
※会員さんのリスト
  );

  $user = get_userdata( $post->post_author );

	// 会員さんのリストに該当がある場合
	if( in_array( $user->user_login, $user_list ) ){
	  
                // 投稿ステータスをゴミ箱に変更
		$post->post_status = 'trash';
	  
                // 投稿を更新
		$wp_update_result = wp_update_post( $post, true );
	  
                // 更新にエラーが起きていた場合
		if( is_wp_error( $wp_update_result ) ){
		  
			$errors = $wp_update_result->get_error_messages();
		  
			foreach ( $errors as $error ) {
				$wp_update_error += $error;
			}
		}
	  
	  
	// クラウドフレアを使用している場合
	if ( isset( $_SERVER['HTTP_CF_CONNECTING_IP'] ) ) {
		$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_CF_CONNECTING_IP'];
	}

    $ip = $_SERVER["REMOTE_ADDR"];
    $host = gethostbyaddr( $ip );
    $user_agent = $_SERVER['HTTP_USER_AGENT'];

    $site_name = ※サイト名;
    $domain = wp_parse_url( home_url(), PHP_URL_HOST );
    $from_email = ※送信元メアド;
    $admin_email = ※管理者メアド;

    $from = 'From: "' . $site_name . '"<' . $from_email . '>';
    $header = array( $from );

    $subject = $site_name . 'の投稿をゴミ箱へ移動しました';
    
    $messages = <<post_title}\n
ユーザーID:{$user->user_login}\n
ホスト名:{$host}\n
IPアドレス:{$ip}\n
UA:{$user_agent}\n
\n
wp_update_result:{$wp_update_result}
wp_update_error:{$wp_update_error}


EOF;

    add_filter( 'wp_mail_content_type', 'set_content_type' );

    wp_mail( $admin_email, $subject, $messages, $header );
	  
	  
	  
	  
	  
  } //   if( in_array( $user->user_login, $user_list ) ){
	
} // 	if( $post->post_type == 'question' ){
	
} // function new_question_to_trash_by_specific_user( $post ) {

管理者ではない自分以外の誰かが投稿した場合に動かすためのフックって3つあります。投稿ステータスの遷移ってやつね。

1.transition_post_status フック
2.old_status_to_new_status フック
3.status_post_type フック
参考:投稿ステータスの遷移 – wpdocs

今まで、2番のフックを使ってたんだけど、新しいことに挑戦しようと3番のフックを試してみました。結果失敗で、今後も2番を使った方が良いという結論になりました。

3番はね、ちょっと分かりづらいんですよ。デスノート系は、会員さんが新規投稿をすると、下書きになります。システム的に言うと、draftです。

最初に投稿したとき、という条件に合う書き方だと、2番は、new_to_draftです。3番は、draft_questionです。ここにハマった。2番の時にならって、3番で、new_questionってしちゃったんです。ややこしい。

で、3番のdraft_questionにすると、下書きにする度に、今回のコードが走ります。引数として前の状態「$old」が取れるんだけど、毎度毎度と前の状態をチェックしなければいけない。2番だとnew_to_draftとなり、新規で下書き、という場合にのみコードが走ります。余分な前の状態チェックも必要なし。

てことで、投稿ステータスの遷移を分岐したい場合は、以前と変わらず2番で確定。
参考:
3番のstatus_post_type フック(英語)
投稿ステータスの一覧 – ja.wordpress.org

もう1件ハマったこと。

投稿のステータスを変えるための$postの中身が配列かオブジェクトか、ということ。結果としてオブジェクトなんですね。配列って表現しているところもあって、間違えててハマりました。
参考:
投稿のステータスを変更するwp_update_post
wp_update_postの基となるwp_insert_postここで配列って書いてあった、ハマった。

この記事を書いた人

旦那デスノートで実際に使っている、WordpressやPHPのコードなどを公開しています。公開しているものは、ネットには あまり載っていない、痒いところに手が届くような拡張です。
@koichiromakita2

コメント

コメントする