サポート » プラグイン » 「Contact Form 7」の「wpcf7_before_send_mail」フックでのログインユーザー情報取得について

  • 解決済 yoko_elmeth

    (@yoko_elmeth)


    WP4.8のバージョンアップと同時に、コンタクトフォーム7も4.8にアップしたところ、それまで問題なかった処理がうまくいかなくなりました。

    現在、「wpcf7_before_send_mail」のアクションフックで、問合せのメール内容をオリジナルのデータテーブルに保存する設定をしています。
    フック内のデータ追加(INSERT INTO)そのものは問題ないのですが、書込みデータとして必要なログインユーザーID(get_current_user_id())の取得ができなくなりました(返り値が0)。wp_get_current_user()などを使用しても同じです。

    別の箇所で使用しているget_current_user_id()では問題ありません。

    ローカルテストで、試しにコンタクトフォーム7のみ、4.7にダウンしてみたところ、以前のようにユーザーIDが取得できましたので、しばらくは4.7で様子見ようかなと思っているのですが…。

    改善点や気になる点、何か良い方法がありましたらご意見いただけると助かります。
    よろしくお願いいたします。

    • このトピックは yoko_elmethが3 ヶ月、 2 週間前に変更しました。
    • このトピックは yoko_elmethが3 ヶ月、 2 週間前に変更しました。
15件の返信を表示中 - 1 - 15件目 (全15件中)
  • モデレーター Takayuki Miyoshi

    (@takayukister)

    wpcf7_before_send_mail アクションフック周辺で、Contact Form 7 4.7 から 4.8 にかけて変わったところはありませんので、何か関係があるとは考えにくいです。フックしているコールバック関数のどこかに間違いがあったんじゃないでしょうか。どのようにアクションフックを利用しているのか詳しい情報がないことにはそれ以上の回答は出てこないかと思います。

    返信ありがとうございます。

    そうですね、どこかしらに間違いがあると思って何度も内容チェックしてみたのですが、力量不足で原因がわからず煮詰まってしまいました…。ご迷惑をおかけして申し訳ありません。

    一応、少し簡単にしたコードを載せてみます。
    主な処理内容は、コンタクトフォームでの問合せメール内容をコメントデータに書き込むことです。

    主なデータはWPCF7_Submissionなどから取得し、
    項目「user_id」には「$user_id = get_current_user_id();」でログインしているユーザーのIDを設定するようにしました。
    実際にテストしましたが、このコードでも、4.8バージョンで作成されたコメントデータの「user_id」は0で、4.7バージョンではログインユーザーIDです。

    どこか気になるところありましたら、ご指摘いただけますよう、よろしくお願いいたします。

    function my_wpcf7_before_send_mail( $wpcf7 ) {
    global $wpdb;
    global $current_user;

    // get post_title
    $post_title = apply_filters( ‘wpcf7_special_mail_tags’, ”, ‘_post_title’, false );

    // get post id
    $post_id = apply_filters( ‘wpcf7_special_mail_tags’, ”, ‘_post_id’, false );

    // get posted data
    $submission = WPCF7_Submission::get_instance();
    if ( ! $submission || ! $posted_data = $submission->get_posted_data() ) {
    return;
    }

    $name = isset( $posted_data[‘your-name’] ) ? trim( $posted_data[‘your-name’] ) : ”;
    $email = isset( $posted_data[‘your-email’] ) ? trim( $posted_data[‘your-email’] ) : ”;
    $message = isset( $posted_data[‘your-message’] ) ? trim( $posted_data[‘your-message’] ) : ”;

    date_default_timezone_set(‘Asia/Tokyo’);
    $comment_date = date(‘Y-m-d H:i:s’);

    $comment_content = “【” . $post_title .”に対してのお問合せ】<br><br>”;
    $comment_content = $comment_content . ” お名前:” . $name . “<br>” ;
    $comment_content = $comment_content . ” メールアドレス:” . $email . “<br>” ;
    $comment_content = $comment_content . ” 内容:” . $message . “<br>” ;

    $user_id = get_current_user_id(); //ログインユーザー

    $wpdb->query( $wpdb->prepare( ”
    INSERT INTO $wpdb->comments (
    comment_post_ID
    ,comment_author
    ,comment_author_email
    ,comment_date
    ,comment_date_gmt
    ,comment_content
    ,user_id
    )
    VALUES ( %d, %s, %s, %s, %s, %s, %d )”,
    $post_id
    ,$name
    ,$email
    ,$comment_date
    ,$comment_date
    ,$comment_content
    ,$user_id
    ) );

    }

    add_action( ‘wpcf7_before_send_mail’, ‘my_wpcf7_before_send_mail’ );

    モデレーター Takayuki Miyoshi

    (@takayukister)

    目的を実現するために何かアドバイスできるかもしれませんが、「一応、少し簡単にしたコードを載せてみます。」というのが気になります。簡単にする前の生の状態を知りたいのでどこか外部のペーストビンサービス等にコードを上げてもらえないでしょうか。

    そもそもの質問なのですがどうしてこのようなことをされているんでしょうか。素直に標準のコメント機能を使えばそのまま実現できているはずのものをどうしてこのように込み入ったコードを仕込んでまで Contact Form 7 を使って行う必要があったのか、そこをまず教えてください。

    横から失礼します。
    検証すると @yoko_elmeth さんの状況が再現しました。
    WordPress 4.8 に Contact Form 7 をインストールして(他のプラグインは停止)、Twenty Sixteen の子テーマの functions.php に以下のコードを入れました。

    function action_wpcf7_before_send_mail( $contact_form ) { 
        $i = get_current_user_id();
        ob_start();
        var_dump( $i );
        $s = ob_get_contents();
        ob_end_clean();
        file_put_contents( ABSPATH . 'wp-content/uploads/logfile.txt', $s );
    };
    add_action( 'wpcf7_before_send_mail', 'action_wpcf7_before_send_mail', 10, 1 ); 
    

    WordPress インストール時の管理者ユーザー(id=1)でログインしてフォームを送信すると、logfile.txt の内容が、Contact Form 7 がバージョン4.8の場合は

    int(0)
    

    Contact Form 7 がバージョン4.7の場合は

    int(1)
    

    になりました。

    • この返信は3 ヶ月、 1 週前に  gblsm さんが編集しました。
    • この返信は3 ヶ月、 1 週前に  gblsm さんが編集しました。

    Takayuki Miyoshi様、
    お世話になります。ありがとうございます。

    まず、なぜ、このようなややこしい仕様になっているかということですが、
    お客様からの依頼で作成したサイト(製造関係の検索サイト)なので、
    念のため、コードや仕様の掲載の可否を確認中です。

    gblsm様
    再現テストに関しまして、お時間、お手数をおかけしました。ありがとうございます。
    初心者なので、勉強になります。

    Takayuki Miyoshi様
    お世話になっております。
    お客様から確認取れましたので、サイト情報をお伝えしておきます。

    「www.icop.jp」という製造業の検索サイトを作成、運用しております。
    お客様のご希望により、投稿された製品情報に対しては
    1、コメント機能不要。
    2、問い合わせは、サイト上ではなく、メールなどで直接やりとり。
    3、問い合わせ内容を一覧表示。
    とのことでしたので、コンタクトフォーム7を使用させていただき、
    通常のコメントテーブルを問合せ専用のデータテーブルとして、その内容を書き込んでいます。
    もっとスマートな方法があったのかもしれないのですが、試行錯誤でこれに落ち着きました。

    gblsm様が再現テストをしていただいたので、もう必要ないかもしれませんが、
    一応、functions.php内のコードです。
    https://pastebin.com/R32367UW

    何か気づくことがありましたら、よろしくお願いいたします。

    モデレーター Takayuki Miyoshi

    (@takayukister)

    get_current_user_id() が 0 になる直接の理由は、nonce が渡されない場合にはログインユーザー情報をリセットする処理を WP REST API が行なっているためです。こういった問題の解決のために必要なことはまず 1) 何をしたいのか 2) それを実現するための最善策は何か 考えることで、現状こうだから、今までああだったから、などと考えていても話をややこしくして解決から遠のくばかりです。一旦そこから離れましょう。

    yoko_elmeth さん、詳細なコードの提供ありがとうございました。こちらで少し時間をいただいて詳しく確認したいと思いますが、先にすでに回答いただいている情報をもとにお答えすると、その目的でしたら Contact Form 7 と Flamingo の使用で簡単に実現できる内容かと思います。検討してみてください。

    Takayuki Miyoshi様
    お世話になります。

    「Flamingo」は一応インストールはされていますが、あまり有効活用していない現状ですので、これを機に勉強したいと思います。
    ご指導いただきありがとうございます。

    また、コードの後ろの方を見るとお分かりになると思うのですが、先ほどの仕様説明に少し追加です。
    4、問合せをするとサイト内で有効のポイントが加算される。
    ここでもユーザーIDを使ってオリジナルデータテーブルを作成しています。

    お手数をおかけしますが、よろしくお願いいたします。

    @takayukister さん、余計なことをして申し訳ありませんでした。

    モデレーター Takayuki Miyoshi

    (@takayukister)

    ユーザーへのポイント加算処理についてですが、ログインユーザー情報の受け渡しはこちらの方法を利用できます。

    ログインユーザーのためにデフォルト値を設定する

    これらのオプションは hidden フィールドでも利用可能です。

    将来的に get_current_user_id() 等から直接ログインユーザー情報を取得できることを保証するようになる可能性はありますが、現時点では公式にサポートしているのは上記の方法だけです。

    コードを詳しく拝見しましたが、やはり無用に入り組んだ処理をしているように思います。Flamingo を活用すれば格段にすっきりしたものにできるでしょう。コメントテーブルに直接 INSERT クエリーを叩き込んでいる辺り特に、危険な匂いがいたします。早めに見直した方がいいでしょう。

    @takayukister
    お世話になっております。

    いろいろとご指摘いただき、ありがとうございます。
    このサイトが私のとっての初めてのWP開発だったこともあり、仕様を含め、記述したコードもかなり無理に押し込めた感あります。かなり恥ずかしいです。もっと、勉強してスマートなシステムを心がけたいと思います。

    今回の件も@takayukister様が挙げて頂いた内容で進めていこうと思いますが、いくつかの調査事項があります。

    1、「ログインユーザーのためにデフォルト値を設定する」
    この項目の中にはユーザーIDは含まれていない。
    2、Flamingo
    サイト(www.icop.jp)では、
    問い合わせを受け取ったユーザーが自分の製品についての問い合わせメールを確認するための一覧なので、
    受信者が自分のダッシュボードから受信メールの一覧を表示できるのか。

    こちらの勉強不足でしたら申し訳ありません。
    あまりお時間をとっていただくのも申し訳ないのですが、
    アドバイスなど、何か気づかれる点ありましたら、とても助かります。
    何卒よろしくお願いいたします。

    モデレーター Takayuki Miyoshi

    (@takayukister)

    1、「ログインユーザーのためにデフォルト値を設定する」
    この項目の中にはユーザーIDは含まれていない。

    ありません。まず user_login か user_email をキーに WP_User オブジェクトを獲得してそこから ID を求めるとよいでしょう。get_user_by() という関数が使えます。

    2、Flamingo
    サイト(www.icop.jp)では、
    問い合わせを受け取ったユーザーが自分の製品についての問い合わせメールを確認するための一覧なので、
    受信者が自分のダッシュボードから受信メールの一覧を表示できるのか。

    ユーザーごとに特定のメッセージのみ一覧表示させてそれ以外を見えないようにすることは不可能ではないと思いますが難しいかもしれません。Flamingo の権限設定は includes/capabilities.php の flamingo_map_meta_cap でコントロールできるようになっているので、それを使って実現できないか検討してみてください。

    試してみてもしコメントテーブルに戻るしかないなら、その場合は安全のため極力 WordPress の API を利用するようにされると良いかと思います。wp_insert_comment() 等の関数の情報が参考になると思います。

    @takayukister

    いろいろと細かい点までご指導いただきありがとうございました。
    それらを踏まえて、検討し対応していきたいと思います。

    この件の実装は時間がかかると思いますが、解決済みとさせていただきます。

    @gblsm様もありがとうございました。

    yoko_elmeth様

    ご本人様が解決済みとされているようで迷いましたが、
    同様の課題の参考にさせていただけましたので感謝を込めて追記させていただきます。
    もちろんすぐにトピックスを閉じて頂いて構いません。

    ちょうど、ログインユーザー情報(ユーザー権限)をどう取得すればいいか調べていた最中でした。
    get_user_by()関数で取得しなおすしかないかなと思っていたところ、
    ずばり、Takayuki Miyoshi様 のアドバイスで同関数が紹介されていましたので、ほぼ迷いなく解決しました。

    簡素なものですが参考までに、ユーザー権限をuser_idに変えたコードを提示します。
    もし問題点がありましたら、ご指摘いだければ幸いです。

    //cf7 オリジナル特別なタグ [_user_id]
    function add_special_mail_tags( $output, $name ){
        if ( $name === '_user_id' ){
            $submission = WPCF7_Submission::get_instance();
            if ( $submission ) {
                $posted_data = $submission->get_posted_data();
                $user = get_user_by('email', $posted_data['your-email']);
                $output = $user->ID;
            }
        }
        return $output;
    }
    add_filter('wpcf7_special_mail_tags', 'add_special_mail_tags', 10, 2);

    @rockmon1000

    私の作成したトピックスが少しでもお役に立てたのであれば嬉しい限りです。
    また、提示して頂いたコードも参考にさせて頂きたいと思います。
    どうもありがとうございました。

15件の返信を表示中 - 1 - 15件目 (全15件中)
  • このトピックに返信するにはログインが必要です。