ウェブページのリアルタイム更新と一括処理
今wordPressのカスタマイズで、いいねの処理を作っています。
その中で、ページの要素を更新しても、思うように更新されない問題や、Ajaxの通信で507エラーが出てサーバーのストレージが足りない状況を改善したいと思い、ChatGPT Plusを活用していました。
今回は、その時に得たコードの他に、まるでプログラミングの先生や講師のようなことをChatGPTが言ったので、備忘録の意味も込めて書きたいと思います。
ウェブページの特定の要素のリアルタイム更新の方法
ウェブページで、特定の要素の値、例えば今回のハートをクリックして「いいね」の数をカウントして表示したい場合などがあります。
この時に、下記のように工夫すると良いです。
Javascriptのコード
$('.like-button').on('click', function() {
var button = $(this);
var commentID = button.data('comment-id'); // いいねボタンに紐づいたコメントIDを取得
$.ajax({
type: "POST",
url: MyAjax.ajaxurl,
data: {
action: "data-comment",
comment_id: commentID,
nonce: MyAjax.nonce,
},
dataType: "json",
success: function (response) {
if (response.success) {
// DOM内のいいねのカウントを更新
var likeCountElement = $('.like-count[data-comment-id="' + commentID + '"]');
likeCountElement.text(response.newCount);
}
}
});
});
この例では、.like-button がいいねボタンのクラスであり、.like-count がいいねのカウントを表示する要素のクラスであると仮定しています。また、各いいねボタンやカウント表示要素に data-comment-id 属性を使用して、関連するコメントIDを指定しています。
この方法では、ページの再読み込みは行われず、ユーザーのアクションに応じてUIが動的に更新されます。ユーザーはページの同じ位置にとどまりながら、リアルタイムでフィードバックを確認できます。
HTMLの表示の部分の例は、このようになります。
<span class="like-count" data-comment-id="COMMENT_ID" style="color: pink;">26</span>
26は、表示されている値です。
COMMENT_IDは、動的にPHPで値を得ます。
実際は、このコードは、使っていません。
サンプルなので実際に使う際は、それぞれの環境で読み替えてください。
一括処理について
ChatGPT Plusの回答を転載しました。
ページ読み込み時に全てのコメントに対して個別にAjaxリクエストを行うと、コメントの数が多い場合、サーバーに大きな負担をかけ、パフォーマンスの問題や不要なリクエストの多発につながります。
この問題を解決するためには、以下のような最適化が考えられます:
一括処理: 全てのコメントIDを一つのAjaxリクエストでサーバーに送り、サーバー側で全てのコメントのいいね状態を一括で処理してから、一つのレスポンスでクライアントに返す方法です。このアプローチにより、リクエストの数を大幅に削減できます。
フロントエンドの最適化: JavaScript(jQuery)の`each`ループを使用するのではなく、ページに直接必要なデータをPHPで埋め込んでおく方法です。たとえば、サーバー側でいいねのカウントや状態をHTMLに直接出力し、JavaScriptはこれを読み取って表示するだけにすることもできます。
非同期処理: 必要があれば、いいね状態の確認を非同期的に行うことで、ページの初期読み込みを遅延させないようにすることができます。たとえば、ページが完全に読み込まれた後に非同期で情報を更新するようにスケジューリングすることが考えられます。
キャッシング: クライアント側(ブラウザ)やサーバー側で適切なキャッシングを利用して、不必要なリクエストを減らします。
こうした最適化を行うためには、いいねの状態を取得するためのエンドポイントのロジックを変更し、フロントエンドのJavaScriptのコードもそれに応じて更新する必要があります。また、これらの変更を行う際には、セキュリティ対策も念頭に置くことが重要です。例えば、nonceの使用や、リクエストの検証を確実に行うことで、CSRF攻撃などを防ぐことができます。
ページの要素の値を一括して、配列変数に代入します。
こちらも、ChatGPT Plusの回答を引用転載します。
$.each は、jQueryの関数で、配列やオブジェクトの各要素に対してループ処理を行うために使用されます。この場合、response.data はサーバーから返された各コメントのいいねの数やユーザーがいいねしたかどうかの情報を含むオブジェクトの配列であると想定しています。
$.each(response.data, function (i, item) { ... }); の部分は、その配列を一つずつ処理しています。i はインデックス(位置)、item は現在処理中の配列要素(ここでは各コメントに関する情報を持つオブジェクト)です。
一括処理で507エラーが消えた
最初は、ページがリロードされるイベントで、処理をしていました。
でも、この方法だと実際のコメント数よりも多くの処理をしてしまうようです。
そのため最初にページの要素の値を配列変数に、代入します。
これを配列変数のままサーバーに、送ります。
サーバーからのレスポンスも、配列変数で返ってきます。
これを処理すると、短いコードで実現できます。
今回のやり取りで、ChatGPT Plusが、プログラミングの先生や講師のようなことを言ったので、こちらに引用転載します。
そして言葉も、凄いと思いました。
確かにデータの型は、思い込みや見落としで、ハマりそうですよね。
PHPやJavascriptなどでプログラミングができると言っても、未経験の機能を実装するときは、ChatGPTを活用すると生産性も向上します。
そして、振り返りでポイントも教えてくれるのでChatGPTは、ありがたい存在になっています。
一人で孤独にプログラミングをしているので、例え文字でのチャットだとしても、生成AIのChatGPTと会話しながら作業を進めるのは、楽しいです。
ChatGPTは、コーダーなどを外注に頼む感覚で活用できますし、今回のように講師や先生に相談するような形でも活用できます。
私は、複数のwordPressのカスタマイズやInstagramのいいねの代行も含めたSEO対策、ネットショップのカスタマイズや集客も引き受けています。
そのため生産性を向上させて早くプログラミングを行い、複数のお客様に迷惑が掛からないように心がけています。
今回の経験で、データの更新が頻繁にあるUIも対応できると思います。
いくらプログラミングが出来ると言っても、実際に仕事を引き受けて数をこなさないと良い仕事を得ることは、難しいと思います。
私も、色々なウェブサイト制作、wordPressのカスタマイズを行い、スキルアップを図っていきたいと思っています。