WordPress + BuddyPressプラグインの組合せを使うとSNSサイトが容易に構築できます。現在進行中のマッチングビジネス案件では、人同士を引き合わせる目的でBuddyPressのプライベートメッセージ機能(PM)を利用しています。しかし、一つ問題点が浮上しました。サイト上で契約が成立する以前にPMでアドレスや電話番号を交換してしまうと直接契約の可能性がありビジネスが成立しません。そこで今回はPMからメールアドレスと電話番号を自動的に検出して削除するプログラムを考えてみました。
参考にした記事はHow to disable HTML in BuddyPress private messageとFilter or stop email address from private messageです。 同様なTipsは多数ありますが日本語の情報が少ないです。処理対象は、①PMとして送信されるEメール、②サイト上に表示されるスレッドの2つです。それぞれの対処用に以下の2つのコードを用意し、テーマディレクトリ下のfunctions.phpに追加します。
/* remove phone number & email address from private message emails */ function my_message_filter($message){ $message = wp_filter_nohtml_kses( $message ); $replacement = "\n[Warning: Phone number removed]"; $message = preg_replace( "/[+]?([\d]{0,3})?[\(\.\-\s]?([\d]{3})[\)\.\-\s]*([\d]{3})[\.\-\s]?([\d]{4})/", $replacement, $message); $replacement = "[Warning: Email address removed]"; $message = preg_replace( "/[^@\s]*@[^@\s]*\.[^@\s]*/", $replacement, $message); return $message; } add_filter('messages_message_content_before_save', 'my_message_filter'); add_filter('messages_message_subject_before_save', 'my_message_filter');
/* remove phone number & email address from private message threads */ function my_thread_filter($message){ $lines = explode("\n", $message); $message = ""; foreach ($lines as $line) { $replacement = "\n[Warning: Phone number removed]"; $line = preg_replace( "/[+]?([\d]{0,3})?[\(\.\-\s]?([\d]{3})[\)\.\-\s]*([\d]{3})[\.\-\s]?([\d]{4})/", $replacement, $line); $replacement = "[Warning: Email address removed]"; $line = preg_replace( "/[^@\s]*@[^@\s]*\.[^@\s]*/", $replacement, $line); $message .= $line; } return $message; } add_action('bp_get_the_thread_message_content', 'my_thread_filter');
メールアドレスと電話番号を検出するための正規表現は最適解ではないかも知れませんが一応動作しています。また、検出した場合に置換する文字列($replacement)は必要に応じて変更してください。