###前提・実現したいこと
現在、wordpressのbuddypressを使って、SNS×ToDoリストのようなサイトを作っています。ユーザーがタスクを完了してどう成長できたか記入してもらったら、そのタスクと成長を自動でbuddypressの「アクティビティ」に流れるようにしたいです。例えば、「数学の問題集」を完了して「因数分解ができるようになった。」とユーザーが入力したら、それらがユーザーのアクティビティに流れるようにしたいと考えています。
###該当のソースコード
アクティビティの情報は、データベース(phpMyAdmin)のwp_bp_activityというテーブルに保存されています。そこで、以下のようなコードで、タスクの内容をこのテーブルに保存することにしました。
php
1function ShareHow(){ 2 if ( bp_has_members( bp_ajax_querystring( 'members' ) ) ) : 3 while ( bp_members() ) : bp_the_member(); 4 global $wpdb,$bp; 5//ユーザーIDと完了したタスクの内容、タスクを完了して成長したことなどを取得。 6 $MyUserID = $bp->loggedin_user->id; 7 $ThisToDo = filter_input(INPUT_POST, 'ThisToDo'); 8 $HowCan = filter_input(INPUT_POST, 'HowCan'); 9 $act = 'activity'; 10 $act_up = 'activity_update'; 11//現在時刻を取得 12 $Now = new DateTime(); 13 $Now = $Now->setTimeZone( new DateTimeZone('Asia/Tokyo')); 14 $Now = $Now->format(YmdHis); 15//最新のアクティビティの投稿を取得 16 $MaxDate = $wpdb->get_results(" 17 SELECT MAX(date_recorded) 18 FROM $wpdb->bp_activity 19 WHERE `user_id` = $MyUserID 20 AND `component` = $act 21 AND `type` = $act_up 22 ", ARRAY_A ); 23 foreach((array)$MaxDate as $item) { 24 $MaxDate = $item['date_recorded'] ; 25 } 26 $MaxDate = $MaxDate->format(YmdHis); 27//新しいアクティビティの投稿として認識されるために必要な情報を取得 28 $activity = $wpdb->get_results(" 29 SELECT action, primary_link, item_id, secondary_item_id, mptt_left, mptt_right, is_spam 30 FROM $wpdb->bp_activity 31 WHERE `user_id` = $MyUserID 32 AND `component` = $act 33 AND `type` = $act_up 34 AND `date_recorded` = $MaxDate 35 ", ARRAY_A ); 36 foreach((array)$activity as $item) { 37 $action = $item['action'] ; 38 $primary_link = $item['primary_link'] ; 39 $item_id = $item['item_id'] ; 40 $secondary_item_id = $item['secondary_item_id'] ; 41 $mptt_left = $item['mptt_left'] ; 42 $mptt_right = $item['mptt_right'] ; 43 $is_spam = $item['is_spam'] ; 44 } 45 46 $content = "私は"+$ThisToDo+"を完了して"+"次のように成長しました。"+$HowCan; 47 48//テーブルに保存 49 $wpdb->insert($wpdb->bp_activity, 50 array( 51 'user_id' => $MyUserID, 52 'component' => $act, 53 'type' => $act_up, 54 'action' => $action, 55 'content' => $content, 56 'primary_link' => $primary_link, 57 'item_id' => $item_id, 58 'secondary_item_id' => $secondary_item_id, 59 'date_recorded' => $Now, 60 'mptt_left' => $mptt_left, 61 'mptt_right' => $mptt_right, 62 'is_spam' => $is_spam 63 ), 64 array( 65 '%d','%s','%s' 66 67 ) 68 ); 69//デバッグ用にとりあえずechoしてます。jsの方でこれをalertしています。 70 echo $primary_link; 71 die(); 72 endwhile ; 73 endif; 74} 75add_action( 'wp_ajax_ShareHow', 'ShareHow' ); 76
###発生している問題・エラーメッセージ
$primary_linkをalertさせると、以下のようなエラーが出ました。
<div id="error"><p class="wpdberror"><strong>WordPress データベースエラー:</strong> [You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE `user_id` = 1 AND `component` = activity AND `type` = activity_upd' at line 3]<br /><code> SELECT MAX(date_recorded) FROM WHERE `user_id` = 1 AND `component` = activity AND `type` = activity_update </code></p></div>
###試したこと
おそらくFROMでテーブル名を正しく所得できていないのだと思います。そのため、
php
1$wpdb->bp_activity
を以下のように直してみましたが、どれも正しくテーブルに保存されていませんでした。
php
1wp_bp_activity(wpの部分は、wordpressのテーブルの接頭辞で、仮の接頭辞として使っています。)
これもダメでした。
php
1$wpdb->$bp->activity
###補足情報
申し訳ございませんが、今はローカル開発環境上でサイトを作っていますので、サイトを直接お見せすることができません。
###追記(2017-01-22 20:01)
以下のようにコードを修正したところ、データベースに新しく情報が保存されるようになりました。しかし、id,user_id,component,type,data_recorded以外はデータが0として保存されてしまいます。
php
1function ShareHow(){ 2 if ( bp_has_members( bp_ajax_querystring( 'members' ) ) ) : 3 while ( bp_members() ) : bp_the_member(); 4 global $wpdb,$bp; 5//ユーザーIDと完了したタスクの内容、タスクを完了して成長したことを取得。 6 $MyUserID = $bp->loggedin_user->id; 7 $ThisToDo = filter_input(INPUT_POST, 'ThisToDo'); 8 $HowCan = filter_input(INPUT_POST, 'HowCan'); 9//現在時刻を取得 10 $Now = new DateTime(); 11 $Now = $Now->setTimeZone( new DateTimeZone('Asia/Tokyo')); 12 $Now = $Now->format(YmdHis); 13 $act = 'activity'; 14 $act_up = 'activity_update'; 15 $table_name = $wpdb->prefix . 'bp_activity'; 16//最新のアクティビティの投稿を取得 17$MaxDate = $wpdb->get_results(" 18SELECT MAX(date_recorded) 19FROM $table_name 20WHERE `user_id` = $MyUserID 21AND `component` = '$act' 22AND `type` = '$act_up' 23", ARRAY_A ); 24 foreach((array)$MaxDate as $item) { 25 $Max = $item['MAX(date_recorded)']; 26 } 27 //$Max = join(",",$Max); 28 29 //$Max = $Max->format(YmdHis); 30 31//新しいアクティビティの投稿として認識されるために必要な情報を取得 32 $activity = $wpdb->get_results(" 33 SELECT action, primary_link, item_id, secondary_item_id, mptt_left, mptt_right, is_spam 34 FROM $table_name 35 WHERE `user_id` = $MyUserID 36 AND `component` = '$act' 37 AND `type` = '$act_up' 38 AND `date_recorded` = 20170121100157 39 ", ARRAY_A ); 40 foreach((array)$activity as $item) { 41 $action = $item['action'] ; 42 $primary_link = $item['primary_link'] ; 43 $item_id = $item['item_id'] ; 44 $secondary_item_id = $item['secondary_item_id'] ; 45 $mptt_left = $item['mptt_left'] ; 46 $mptt_right = $item['mptt_right'] ; 47 $is_spam = $item['is_spam'] ; 48 } 49 50 $content = "私は+$ThisToDo+を完了して+次のように成長しました。+$HowCan"; 51 52//テーブルに保存 53 $wpdb->insert($table_name, 54 array( 55 'user_id' => $MyUserID, 56 'component' => $act, 57 'type' => $act_up, 58 'action' => $action, 59 'content' => $content, 60 'primary_link' => $primary_link, 61 'item_id' => $item_id, 62 'secondary_item_id' => $secondary_item_id, 63 'date_recorded' => $Now, 64 'mptt_left' => $mptt_left, 65 'mptt_right' => $mptt_right, 66 'is_spam' => $is_spam 67 ), 68 array( 69 '%d','%s','%s' 70 71 ) 72 ); 73 74 die(); 75 endwhile ; 76 endif; 77} 78add_action( 'wp_ajax_ShareHow', 'ShareHow' ); 79
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/22 03:47
退会済みユーザー
2017/01/22 04:59
2017/01/22 05:45
2017/01/22 05:48
退会済みユーザー
2017/01/22 05:55
2017/01/22 11:08
退会済みユーザー
2017/01/22 11:30 編集
退会済みユーザー
2017/01/22 11:33
2017/01/23 10:11
退会済みユーザー
2017/01/23 11:19