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

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

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

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

WordPress

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

PHP

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

Q&A

解決済

1回答

4407閲覧

buddypressのアクティビティに自動投稿する方法

SoraSue

総合スコア30

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

WordPress

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

PHP

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

0グッド

0クリップ

投稿2017/01/22 03:08

編集2017/01/22 11:07

###前提・実現したいこと
現在、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 &#039;WHERE `user_id` = 1 AND `component` = activity AND `type` = activity_upd&#039; 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

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

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

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

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

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

guest

回答1

0

ベストアンサー

テーブル名は以下の形で取得するはずです。

PHP

1$table_name = $wpdb->prefix . 'bp_activity'

###追記
これで試してみてください。

PHP

1$table_name = $wpdb->prefix . 'bp_activity' 2//最新のアクティビティの投稿を取得 3 $MaxDate = $wpdb->get_results(" 4 SELECT MAX(date_recorded) 5 FROM $table_name 6 WHERE `user_id` = $MyUserID 7 AND `component` = '$act' 8 AND `type` = '$act_up' 9 ", ARRAY_A );

投稿2017/01/22 03:25

編集2017/01/22 04:59
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

SoraSue

2017/01/22 03:47

迅速に回答していただきありがとうございます。 テーブル名は正しく入手できましたが、まだ以下のようなエラーが出ます。 <div id="error"><p class="wpdberror"><strong>WordPress データベースエラー:</strong> [Unknown column &#039;activity&#039; in &#039;where clause&#039;]<br /><code> SELECT MAX(date_recorded) FROM wp_bp_activity WHERE `user_id` = 1 AND `component` = activity AND `type` = activity_update </code></p></div> アクティビティにも投稿されていませんでした。
退会済みユーザー

退会済みユーザー

2017/01/22 04:59

回答に追記しました。
SoraSue

2017/01/22 05:45

追記ありがとうございます。 '$act'としたところ、 alert自体が表示されなくなりました。 また、アクティビティにも自動投稿されていませんでした。
SoraSue

2017/01/22 05:48

500 (Internal Server Error)になっていたようです。
退会済みユーザー

退会済みユーザー

2017/01/22 05:55

var_dump()などで途中途中の結果を出力して、どこの処理まで正常におこなわれているか、想定した処理になっているかを確認してはどうですか?
SoraSue

2017/01/22 11:08

以上の追記のようにコードを修正したところ、データベースに新しく情報が保存されるようになりました。しかし、id,user_id,component,type,data_recorded以外はデータが0として保存されてしまいます。
退会済みユーザー

退会済みユーザー

2017/01/22 11:30 編集

$actionや$primary_linkなどをデータベースから取得したときに、正常にデータは取得できていますか?(0以外の値が入っていますか?)
退会済みユーザー

退会済みユーザー

2017/01/22 11:33

insertするときのフォーマットが足りていないように見えます。
SoraSue

2017/01/23 10:11

フォーマットを整えたら正しくアクティビティに投稿できました! mixさん、いつもありがとうございます。!
退会済みユーザー

退会済みユーザー

2017/01/23 11:19

お役に立てたようで何よりです。 よろしければ、同じような問題で悩んでこの質問を見るかもしれない方のために、最終的なコードを質問文に追記されてはどうでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問