add_action ( 'profile_update' について
-
アクションフックについての質問です。
現在、会員サイトを構築しています。
管理画面ではなくフロントエンドにプロフィール編集画面を作り、更新してもらっています。プロフィール項目を外部のDBに登録する必要があり、APIを叩いて更新をかけているのですが、そこで問題が。
プロフィールの項目にラジオボタン項目があるのですが、何故か更新前の値が飛びます。profile_updateでアクションフックを作っているのですが、テキスト項目は問題ないにも関わらず、なぜかラジオボタン項目だけがダメです。
何か思い当たる事があれば教えて下さい。(もっと別のフックを使うということでも良いのですが)
よろしくお願いします。
-
DBから叩いているのでキャッシュは無関係だと思うのですが。
profile_updateはプロフィール情報を更新してから以下のコードが実行されるという認識は間違いでしょうか。
get_userdataで拾ってくるデータがおかしいのだと思うのですが、first_name等のテキストデータについては問題がなく更新後の情報が送信されている事が解せません。form側のバグかなと思ったのですが、そこは大丈夫です。
送信後にプロフィールデータを確認してみると、しっかり選んだ値になっていることが確認できました。
$RadioData = $userdata->RadioDataのデータをログに書き出してみると、変更前の値が格納されていることを確認しています。なぜ…add_action ( 'profile_update' , 'updateUserMetaData',20,3); function updateUserMetaData($userid){ include_once('API叩く為のライブラリをinclude'); $userdata = get_userdata( $userid ); $first_name = $userdata->first_name; $last_name = $userdata->last_name; $RadioData = $userdata->RadioData; //Radioボタンによるデータ //API向け送信データの作成 $SendData = array('firstname'=> $first_name,'lastname' => $last_name, 'radiodata' =>$RadioData); //API叩くためのコード }
- add_action()の$accepted_argsと実際の関数が受け取る引数の数が異なりますが、本当に正しく関数は実行されていますか?
- RadioDataを保存するための別のフック関数はprofile_updateに登録されていますよね?
Daisuke Takahashi様
add_action()の$accepted_argsと実際の関数が受け取る引数の数が異なりますが、本当に正しく関数は実行されていますか?
>確かに間違ってました。修正して実行してみましたが、変化は有りませんでした。RadioDataを保存するための別のフック関数はprofile_updateに登録されていますよね?
>すみません、これっぽいです。ラジオボタンのデータを保存するにはフック関数が必要なのですか。。。RadioDataを保存するための別のフック関数はprofile_updateに登録されていますよね?
>む。
>RadioDataがきちんと保存されるようになっているか?という意味でしたでしょうか?
>保存ボタンを押した後に管理画面のユーザ情報を見てみるとRadioDataはラジオボタンで選択したものにきちんとなっているので保存はされていると思います。キャッシュと書いたのは WordPress 本体が持っているキャッシュ機能のことです(プラグインや PHP のキャッシュ機能ではありません)。RadioData をデータベースへ書き込んだときにキャッシュの内容は古いままな気がします。RadioData を保存/取得するそれぞれのフック関数の動作は大丈夫でしょうか?
>gblsm様
[キャッシュと書いたのは WordPress 本体が持っているキャッシュ機能]
これ知りませんでした!$userdata = get_userdata( $userid ); $RadioData = $userdata->RadioData;
これで拾ってきている値がキャッシュのデータではないかというご指摘ですよね。
そこがダメなのだと思います。キャッシュではないデータを取ってくるにはどうすれば…
clean_post_cache とかはそういう意図に見えます。今回はユーザプロフィールの更新なので何を使うのが適切なのでしょうか。
Daisuke Takahashiさんの指摘から調べてみてはどうですか。
RadioDataを保存するための別のフック関数はprofile_updateに登録されていますよね?
いま注目している updateUserMetaData() ではなくて下記の2つです。
- フロントエンドのプロフィール編集画面から遷移した先から呼び出されて、ラジオボタンのデータをデータベース(およびキャッシュ)へ入れる関数。
- get_userdata() の中から呼び出されてデータベース(キャッシュにあればキャッシュ)からラジオボタンのデータを呼び出し、get_userdata() が返すユーザーデータへ RadioData として入れる関数。
追記:私が勘違いしているみたいなので確認させてください。フロントエンドに表示するラジオボタンの(古い)値は外部のDBから取得して(WordPressのDBへ入れずに)表示していますか。それならWordPressのキャッシュ云々はまったく無関係です。すみません。
gblsmさん
追記:私が勘違いしているみたいなので確認させてください。フロントエンドに表示するラジオボタンの(古い)値は外部のDBから取得して(WordPressのDBへ入れずに)表示していますか。それならWordPressのキャッシュ云々はまったく無関係です。すみません。
こちらですが、ラジオボタンの値はWordPressのデータを使っています。ので外部DBではありません。
吉田丈治さん
まだ原因がつかめていなければ、下記2つの処理(フックした関数と、フックのやり方)に問題がないか再確認をお勧めします。- フロントエンドのプロフィール編集画面から遷移した先から呼び出されて、ラジオボタンのデータをデータベース(およびキャッシュ)へ入れる関数。
- get_userdata() の中から呼び出されてデータベース(キャッシュにあればキャッシュ)からラジオボタンのデータを呼び出し、get_userdata() が返すユーザーデータへ RadioData として入れる関数。
gblsmさん
1についてはこんなふうになっていました
public static function update_user_meta( $meta_vars, $user_id ) { // prepare meta fields list( $meta_key_value, $multi_repeated, $files ) = self::prepare_meta_fields( $meta_vars ); // save all custom fields foreach ($meta_key_value as $meta_key => $meta_value) { update_user_meta( $user_id, $meta_key, $meta_value ); } }
—
$userdata = get_userdata( $userid );
についてですが、get_userdataがデータをキャッシュするということが以下の記事で分かりました。http://dim5.net/wordpress/get-userdata-cache.html
ということで、hookの冒頭で以下のように一度キャッシュをクリアしてからget_userdataを行えば…と思ったのですが
clean_user_cache($userid); $userdata = get_userdata( $userid ); $radiodata = $userdata->radiodata;
やはりドロップダウンリストに入っているデータ($userdata->radiodata)は、update前のものが取得されてしまいます。
この方法ではキャッシュをクリアできないということでしょうか。
2についてですが
clean_user_cache($userid); $userdata = get_userdata( $userid ); $radiodata = $userdata->radiodata; error_log(print_r($radiodata,true),"3","/var/log/php.log");
こんな感じでログファイルにアウトプットしてみても更新前データが入っている事を確認しています。
1.のコードは
public static function update_user_meta
の中で再びupdate_user_meta
を呼び出していますが、正常に動作していますか?update_user_meta()
は WordPressコアの関数と名前が重複しています。gblsmさん
確かにそうですね。
ただ、正常に動作はしてるような気がします。
このコード(プラグインを使っています:user frontend pro)でプロフィール情報をカスタムフィールド含めて更新すると、Wordpressの管理画面側から見ても、フロントエンドのフォームから見ても選択したデータが登録されています。また、普通のテキストフィールドであれば、入力したデータがそのままログ出力時にも出力されます。なぜかselectやradioボタンで選択したデータだけ、更新前のデータが取得されてしまいます。(が、実際に更新はかかっています)
- トピック「add_action ( 'profile_update' について」には新たに返信することはできません。