質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Q&A

解決済

1回答

2455閲覧

localStorageを利用したお気に入り機能で追加した情報を、サイドバーにすぐに反映させたい

yura53

総合スコア8

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

0グッド

0クリップ

投稿2020/09/09 12:06

前提・実現したいこと

WordPressの記事一覧ページに、localStorageを利用したお気に入りボタンを付けています。
こちらのページ(https://magnets.jp/web_design/11793/)を参考に作成したのですが、別ページではなくサイドバーに表示させようとしています。

サイドバーに読み込みまではできているのですが、お気に入りボタンを押してもページをリロードするまでは表示されません。
リロードせずに表示させたり消したりしたいです。

試したこと

buttonをクリックしたときに、favorite.jsで処理をしてるものを読み込めれば良いのではと考え、下記を記事一覧ページに追記しました。
すると上書きではなくどんどん追加される形で表示されてしまいます。
buttonを押したときにid="favorite"部分のみを読み込む方法を教えていただけると嬉しいです。
どうぞよろしくお願いいたします。

javascript

1<script type="text/javascript"> 2$('button').click(function () { 3 //現在の登録内容を取得 4 var favorite = JSON.parse(localStorage.getItem("favorite")) || []; 5 6 //コンマ区切りの1つの文字列にする 7 var ids = favorite.join(","); 8 9 //格納する囲み 10 var list = $("#favorite"); 11 12 //WPに引き渡すデータ 13 var data = { 14 //アクション名(任意の名前) 15 action: "favorite", 16 //お気に入り登録している記事ID 17 id: ids, 18 }; 19 20 //Ajax処理 21 $.ajax({ 22 url: favorite_params.ajaxurl, 23 data: data, 24 type: "POST", 25 }).then( 26 //成功時 27 function (data) { 28 if (data) { 29 list.append(data); 30 } 31 }, 32 //失敗時 33 function () { 34 alert("読み込みに失敗しました"); 35 } 36 ); 37}); 38</script>

コード

php

1<ul class="archive"> 2<?php 3$args = array( 4'posts_per_page' => -1 // 表示件数の指定 5); 6$posts = get_posts( $args ); 7foreach ( $posts as $post ): // ループの開始 8setup_postdata( $post ); // 記事データの取得 9?> 10<li> 11<h2 class="page-title"><?php the_title();?></h2> 12<button class="add" data-id="<?php echo $post->ID; ?>">お気に入り登録</button> 13</li> 14(略) 15<div class="sidebar"> 16<div id="favorite" class="favorite"></div> 17</div>

javascript

1<script> 2jQuery(function($){ 3 $('.archive').on('click','.add',function(){ 4 //追加する記事ID 5 var pid = $(this).data('id'); 6 if(pid){ 7 //現在の登録内容を取得 8 var favorite = JSON.parse(localStorage.getItem('favorite')) || []; 9 //既に登録済か調査 10 var index = favorite.indexOf(pid); 11 //未登録ならIDを追加 12 if(index == -1){ 13 favorite.push(pid); 14 //ローカルストレージに格納しなおす 15 localStorage.setItem('favorite',JSON.stringify(favorite)); 16 //反転させる 17 $(this).removeClass('add').addClass('remove').text('お気にいり解除'); 18 } 19 } 20 }); 21 $('.archive').on('click','.remove',function(){ 22 //除外する記事ID 23 var pid = $(this).data('id'); 24 if(pid){ 25 //現在の登録内容を取得 26 var favorite = JSON.parse(localStorage.getItem('favorite')) || []; 27 //既に登録済か調査 28 var index = favorite.indexOf(pid); 29 //登録済ならIDを除外 30 if(index != -1){ 31 favorite.splice(index,1); 32 //ローカルストレージに格納しなおす 33 localStorage.setItem('favorite',JSON.stringify(favorite)); 34 //反転させる 35 $(this).removeClass('remove').addClass('add').text('お気にいり登録'); 36 } 37 } 38 }); 39 //現在の登録内容を取得 40 var favorite = JSON.parse(localStorage.getItem('favorite')) || []; 41 //登録内容数分繰り返し処理 42 for(var i = 0; i < favorite.length; i++){ 43 //現在のID 44 var id = favorite[i]; 45 //buttonのdata-id属性と上記IDが一致するものはaddクラスを外してremoveクラスを付与。テキストを変更する。 46 $('button[data-id=' + id + ']').removeClass('add').addClass('remove').text('お気に入り解除'); 47 } 48}); 49</script> 50<script type="text/javascript"> 51$('button').click(function () { 52 //現在の登録内容を取得 53 var favorite = JSON.parse(localStorage.getItem("favorite")) || []; 54 55 //コンマ区切りの1つの文字列にする 56 var ids = favorite.join(","); 57 58 //格納する囲み 59 var list = $("#favorite"); 60 61 //WPに引き渡すデータ 62 var data = { 63 //アクション名(任意の名前) 64 action: "favorite", 65 //お気に入り登録している記事ID 66 id: ids, 67 }; 68 69 //Ajax処理 70 $.ajax({ 71 url: favorite_params.ajaxurl, 72 data: data, 73 type: "POST", 74 }).then( 75 //成功時 76 function (data) { 77 if (data) { 78 list.append(data); 79 } 80 }, 81 //失敗時 82 function () { 83 alert("読み込みに失敗しました"); 84 } 85 ); 86}); 87</script>

↓functions.php

php

1function favorite_ajax_scripts(){ 2 //お気に入り一覧ページのみ読み込み 3 if(is_home() || is_page('favorite')){ 4 wp_enqueue_script('favorite', get_theme_file_uri('js/favorite.js'), array('jquery')); 5 wp_localize_script('favorite', 'favorite_params', array( 6 'ajaxurl' => admin_url('admin-ajax.php') 7 )); 8 } 9} 10add_action('wp_enqueue_scripts', 'favorite_ajax_scripts'); 11 12add_action('wp_ajax_favorite', 'favorite_ajax_handler'); 13add_action('wp_ajax_nopriv_favorite', 'favorite_ajax_handler');//wp_ajax_nopriv_{アクション名} -> favorite.jsで指定したアクション名 14function favorite_ajax_handler(){ 15 $post_ids = $_POST['id']; 16 $post_ids = explode(',',$post_ids); 17 $args = array( 18 'posts_per_page'=>-1, 19 'post__in'=>$post_ids 20 ); 21 query_posts($args); 22 if(have_posts()): 23 echo '<ul class="archive">'; 24 while(have_posts()): the_post(); 25 ?> 26 <li> 27 <h2><?php the_title(); ?></h2> 28 <?php the_excerpt(); ?> 29 </li> 30 <?php 31 endwhile; 32 echo '</ul>'; 33 else: 34 echo '<p>まだお気に入り登録がありません</p>'; 35 endif; 36 die; 37}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

dataには追加したデータだけではなく、全データが返ってきているようですので
追記せずに置き換えてみてはいかがでしょうか。

JavaScript

1 //成功時 2 function (data) { 3 if (data) { 4 list.append(data); 5 } 6 },

list.append(data);

list.html(data);

投稿2020/09/09 23:34

tabuu

総合スコア2449

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yura53

2020/09/13 05:45

ありがとうございます! 当初はbutton.clickにしていましたが、関数にして上2つのbuttonで使えるようにしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問