wordpressのユーザー同士でメッセージのやり取りをする機能を作ってみた

今回はwordpressにユーザー登録した人同士がメッセージのやり取りをする機能を作成してみましたので、その解説をしていきます。

SNSやマッチングアプリにある、DMのやり取り機能ですね。

プラグインを使わなくてもwordpressで簡単に作れてしまうので、Webアプリを作る時など参考になるんじゃないでしょうか。

メッセージのやり取りはどんな仕様になってるのか

マッチングアプリのメッセージやり取りやTwitterのDMと似たような仕様で、メッセージのやり取りをする双方がフォローやいいねをしてくれている時だけ、wp_insert_postを使って記事を一つ投します。

この記事がメッセージをやり取りするページとなります。

投稿された記事には、この記事にアクセスできるユーザーIDを配列にして保存。

メタデータに保存されたユーザしかアクセスできないようにリダイレクトで弾いていき、ユーザー同士はコメントでやり取りをする。

メッセージ機能は仕様はこんな感じです。

お互いがフォロー・いいねしたらメッセージ開放

ユーザー同士のフォロー・いいね機能は前に記事にしたのですが、双方がフォローをした時に、wp_insert_postという記事を投稿する関数を実行させます。

ユーザーIDはjsで取得しajaxでphpの方に持ってきています。

//メッセージ開放
function set_message_open($user_id)
{
   //いいねをしたユーザーのIDはajaxで取得
   $this->user_id = $user_id;
 
   //ログインしているユーザーのIDを取得
   $this->current_user_id = get_current_user_id();
 
 
   //双方のユーザーのメタデータにいいねされたユーザーのIDを配列で保存していく
   $like_pushed_current_user_id = get_the_author_meta('like_pressed', $this->current_user_id);
   $like_pushed_user_id = get_the_author_meta('like_pressed', $this->user_id);
 
 
   //双方ユーザーメタデータにの配列両方にIDが存在すればメッセージ開放
   if (in_array($this->user_id, $like_pushed_current_user_id)
   && in_array($this->current_user_id, $like_pushed_user_id)) {
       $post_data = array(
           'post_title' => $this->user_id . '-' . $this->current_user_id, //何でもいい
           'post_type' => post, //カスタム投稿タイプを設定すると良い
           'post_author' => 1, //管理者のIDで投稿
           'post_status' => 'publish',
           'post_content' => '' //使わない
       );
       $post_id = wp_insert_post($post_data);
 
       //記事の閲覧できるユーザーを記事のメタデータに保存
       update_post_meta($post_id, 'user_array', array($this->user_id, $this->current_user_id));
   }
}

記事のメタデータにユーザーIDを配列として保存しておけば、ここで作成された記事には当人同士しかアクセスできないように設定することが可能になります。

グループで利用したい場合は、配列にIDを追加するだけでいいので管理しやすいですね。

コメント機能を使ってメッセージのやり取り

どうやってユーザー同士のメッセージやり取りをさせるのがいいのか、いろいろ考えた結果素直にコメントフォーム使えばいいという結論に達しました。

wordpressで準備されているコメント出力系の関数を使うとややこしくなるのですが、記事と同じようにコメントもinsert関数があるので、そっちを使えば自由につくることができます。

まずはコメントフォームの設定。

actionには現在のページを設定します。

<form class="mb-5" action="<?php print get_the_permalink($post->ID); ?>" method="post">    
   <div class="form-group row">
       <textarea name="comment_content" class="form-control"></textarea>
   </div>
   <?php wp_nonce_field('comment-nonce', 'comment-nonce-field'); ?>
   <button class="btn btn-primary">送信</button>
</form>

次にcommentのinsert処理をします。

//コメントのinsert
public function set_comment_insert()
{
   $this->user = wp_get_current_user();
   global $post;
   if (!empty($_POST['comment_content'])
   && !empty($_POST['comment-nonce-filed'])
   && wp_verify_nonce($_POST['comment-nonce-filed'], 'comment-nonce')
   ) {
       $time = current_time('mysql');
       $data = array(
           'comment_post_ID' => $post->ID,
           'comment_content' => $_POST['comment_content'],
           'user_id' => $this->user->data->ID,
           'comment_date' => $time,
       );
       wp_insert_comment($data);
 
       $link = get_the_permalink($post->ID);
       wp_redirect($link);
       exit;
   }
}

これでできました!

管理者がユーザー同士のコメントを見れないようにするために、管理画面からコメントページを削除した方が、倫理的には良さそうですよね。

ワードプレスなら簡単にいろいろできる

ワードプレスはちゃんとカスタマイズしていけば結構なものをスピーディに作成することができます。

世の中に存在するWebサイトの結構な数がワードプレスでできているので、案件もめちゃくちゃ多いのがメリットですね。

ガチのエンジニアじゃなくてもワードプレスは扱えるので、コードがカオスにりエラーを吐きまくってるサイトも多くて、それがなぜかワードプレスのせいになってしまっているんじゃないでしょうか。

PHPをちゃんと覚えて公式にのっとてカスタマイズをしていけばワードプレスの可能性はとても広いんじゃないかと思います。

ビジネスなんて成功する保証がないのに、フルスクラッチで作成して手間とお金をかけるのって本当に正しいやり方なんですかね。

ワードプレスや無料のデザインテンプレートでサクッと作成してしまい、ビジネスが軌道にのってからお金をかけるのが正しい順番なんじゃないでしょうか。

正社員という奴隷制度に中指を立てるWebエンジニアです。PHPが得意。繋がれた鎖を断ち切るために、自由を取り戻すために、プログラミングスキルを磨く日々です。プログラミングと個人でもできるビジネスについて、情報発信しています。

詳しくはこちら