サポート » 使い方全般 » add_action ( 'profile_update' について

  • 解決済 吉田 丈治

    (@geeorgey)


    アクションフックについての質問です。

    現在、会員サイトを構築しています。
    管理画面ではなくフロントエンドにプロフィール編集画面を作り、更新してもらっています。

    プロフィール項目を外部のDBに登録する必要があり、APIを叩いて更新をかけているのですが、そこで問題が。
    プロフィールの項目にラジオボタン項目があるのですが、何故か更新前の値が飛びます。

    profile_updateでアクションフックを作っているのですが、テキスト項目は問題ないにも関わらず、なぜかラジオボタン項目だけがダメです。
    何か思い当たる事があれば教えて下さい。(もっと別のフックを使うということでも良いのですが)
    よろしくお願いします。

15件の返信を表示中 - 1 - 15件目 (全22件中)
  • フックした関数の中はどんなコードですか?

    追記:キャッシュの影響はありませんよね。

    トピック投稿者 吉田 丈治

    (@geeorgey)

    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叩くためのコード
    }
    モデレーター Daisuke Takahashi

    (@extendwings)

    • add_action()の$accepted_argsと実際の関数が受け取る引数の数が異なりますが、本当に正しく関数は実行されていますか?
    • RadioDataを保存するための別のフック関数はprofile_updateに登録されていますよね?
    トピック投稿者 吉田 丈治

    (@geeorgey)

    Daisuke Takahashi様

    add_action()の$accepted_argsと実際の関数が受け取る引数の数が異なりますが、本当に正しく関数は実行されていますか?
    >確かに間違ってました。修正して実行してみましたが、変化は有りませんでした。

    RadioDataを保存するための別のフック関数はprofile_updateに登録されていますよね?
    >すみません、これっぽいです。ラジオボタンのデータを保存するにはフック関数が必要なのですか。。。

    トピック投稿者 吉田 丈治

    (@geeorgey)

    RadioDataを保存するための別のフック関数はprofile_updateに登録されていますよね?
    >む。
    >RadioDataがきちんと保存されるようになっているか?という意味でしたでしょうか?
    >保存ボタンを押した後に管理画面のユーザ情報を見てみるとRadioDataはラジオボタンで選択したものにきちんとなっているので保存はされていると思います。

    キャッシュと書いたのは WordPress 本体が持っているキャッシュ機能のことです(プラグインや PHP のキャッシュ機能ではありません)。RadioData をデータベースへ書き込んだときにキャッシュの内容は古いままな気がします。RadioData を保存/取得するそれぞれのフック関数の動作は大丈夫でしょうか?

    トピック投稿者 吉田 丈治

    (@geeorgey)

    >gblsm様
    [キャッシュと書いたのは WordPress 本体が持っているキャッシュ機能]
    これ知りませんでした!

    $userdata = get_userdata( $userid );
    $RadioData = $userdata->RadioData;

    これで拾ってきている値がキャッシュのデータではないかというご指摘ですよね。
    そこがダメなのだと思います。

    キャッシュではないデータを取ってくるにはどうすれば…

    clean_post_cache とかはそういう意図に見えます。今回はユーザプロフィールの更新なので何を使うのが適切なのでしょうか。

    Daisuke Takahashiさんの指摘から調べてみてはどうですか。

    RadioDataを保存するための別のフック関数はprofile_updateに登録されていますよね?

    いま注目している updateUserMetaData() ではなくて下記の2つです。

    1. フロントエンドのプロフィール編集画面から遷移した先から呼び出されて、ラジオボタンのデータをデータベース(およびキャッシュ)へ入れる関数。
    2. get_userdata() の中から呼び出されてデータベース(キャッシュにあればキャッシュ)からラジオボタンのデータを呼び出し、get_userdata() が返すユーザーデータへ RadioData として入れる関数。

    追記:私が勘違いしているみたいなので確認させてください。フロントエンドに表示するラジオボタンの(古い)値は外部のDBから取得して(WordPressのDBへ入れずに)表示していますか。それならWordPressのキャッシュ云々はまったく無関係です。すみません。

    トピック投稿者 吉田 丈治

    (@geeorgey)

    gblsmさん

    追記:私が勘違いしているみたいなので確認させてください。フロントエンドに表示するラジオボタンの(古い)値は外部のDBから取得して(WordPressのDBへ入れずに)表示していますか。それならWordPressのキャッシュ云々はまったく無関係です。すみません。

    こちらですが、ラジオボタンの値はWordPressのデータを使っています。ので外部DBではありません。

    吉田丈治さん
    まだ原因がつかめていなければ、下記2つの処理(フックした関数と、フックのやり方)に問題がないか再確認をお勧めします。

    1. フロントエンドのプロフィール編集画面から遷移した先から呼び出されて、ラジオボタンのデータをデータベース(およびキャッシュ)へ入れる関数。
    2. get_userdata() の中から呼び出されてデータベース(キャッシュにあればキャッシュ)からラジオボタンのデータを呼び出し、get_userdata() が返すユーザーデータへ RadioData として入れる関数。
    トピック投稿者 吉田 丈治

    (@geeorgey)

    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前のものが取得されてしまいます。

    この方法ではキャッシュをクリアできないということでしょうか。

    gblsm

    (@gblsm)

    2.については、どんなコードでしたか?

    トピック投稿者 吉田 丈治

    (@geeorgey)

    2についてですが

    clean_user_cache($userid);
    $userdata = get_userdata( $userid );
    $radiodata = $userdata->radiodata;
    error_log(print_r($radiodata,true),"3","/var/log/php.log");

    こんな感じでログファイルにアウトプットしてみても更新前データが入っている事を確認しています。

    gblsm

    (@gblsm)

    1.のコードは public static function update_user_meta の中で再び update_user_meta を呼び出していますが、正常に動作していますか? update_user_meta() は WordPressコアの関数と名前が重複しています。

    トピック投稿者 吉田 丈治

    (@geeorgey)

    gblsmさん

    確かにそうですね。
    ただ、正常に動作はしてるような気がします。
    このコード(プラグインを使っています:user frontend pro)でプロフィール情報をカスタムフィールド含めて更新すると、Wordpressの管理画面側から見ても、フロントエンドのフォームから見ても選択したデータが登録されています。

    また、普通のテキストフィールドであれば、入力したデータがそのままログ出力時にも出力されます。なぜかselectやradioボタンで選択したデータだけ、更新前のデータが取得されてしまいます。(が、実際に更新はかかっています)

15件の返信を表示中 - 1 - 15件目 (全22件中)
  • トピック「add_action ( 'profile_update' について」には新たに返信することはできません。