ちょっとコアのコードを追えていないので、断定はできないのですが、実行されるタイミングがうまくないのですかね。wp_update_user() は WordPress に任せて、データだけ書き換えるというのはどうでしょう?
add_action('edit_user_profile_update', 'filtered_update');
function filtered_update($user_id) {
add_filter('pre_user_display_name', 'rewrite_display_name');
function rewrite_display_name($display_name) {
if (($user_company = get_user_meta($user_id, 'user_company', true) != '') {
$display_name = $user_company;
}
return $display_name;
}
}
アクションフックで、フィルタフックを実行するのがちょっと間抜けですが… スクリーンがどうなているのかわからないので、get_user_meta() を使いましたけど、環境に合わせて書き換えてください。また、update のたびに毎回実行するのは無駄なので、ユーザの新規作成にフックした方がいいと思います。コードの動作は無保証です。
ご回答ありがとうございます!
なるほど、きっと私が最初に記述したものだと更新するけどすぐにPOSTで書き換えられてしまっている可能性がありそうですね。
ご指摘の方法だと、フィルタフックの段階で $user_id が引き継がれなかったのかNULLでした。
アクションフックでフィルタフックや、アクションフックでアクションフックなど、フックにフック?というような技が使えるのでしょうか?だとすればwordpressは思った以上に奥が深いですね!
今回のご回答をヒントに下記のコードで実験すると、DBを見る限りとりあえず目的は達成しているように言えます。しかしこういった方法が問題ないものなのかどうか経験が浅く判断に困っております。
add_action('edit_user_profile_update', 'filtered_update');
function filtered_update() {
if ($_POST['user_company'] != ''){
$_POST['display_name'] = $_POST['user_company'];
}
}
おっと、変数のスコープを間違えちゃいましたね。global 宣言してやると動作すると思います。
フックというのは、優先順位の順序に並んだ関数を要素とする配列で、apply_filters() と do_action() がそれぞれ call_user_func_array() を実行します。だから、一つのフックをトリガにして、別のフックをカスケードしても問題はありません。call_user_func_array() が連続して実行されるイメージですが、あまりきれいなコードとはいえないでしょうね。
お示しの例で問題ないと思いますが、pre_user_display_name フックで、$_POST[‘user_company’] が取れるようなら、そちらの方が扱いやすいかもしれません。$display_name と $user_company が同じなら、何もしなくていいと思います。実際に試すことができないので、動くかどうかわかりませんが。
add_filter('pre_user_display_name', 'rewrite_display_name');
function rewrite_display_name($display_name) {
$user_company = isset($_POST['user_company']) ? $_POST['user_company'] : '';
if (!empty($user_company) && $display_name != $user_company) {
$display_name = $user_company;
}
return $display_name;
}
ご回答ありがとうございます!
ご提示いただいたソースそのままいけました!
カスケードの件も大変参考になりました。もう少し力が付いたときに奥の手として引き出しにしまっておこうと思います。
「関数を要素とする配列」というフレーズでフックの考え方もだいぶわかってきた気でおります(笑)
本件大変お世話になりました!もっともっと力つけて私も誰かの助けになれるよう日々精進しようと思います。ありがとうございました^^