メソッドを呼び出さなければならないプロジェクトに取り組んでいます(ユーザーを受け入れる)送信ボタン(承認ボタン)のクリックからの入力としてのID)。
私はあらゆる方法を試してきましたが、私が直面している本当の課題は、フロントエンドでユーザーIDを取得する方法とそれをメソッドに渡します。
私のメソッドは、その特定のユーザーのユーザーメタを更新します。
HTMLコード:
<div> <div class="modalconent"> <h3 align=center>GDPR</h3> <p>This is a GDPR Pop Up</p><br><br><br> <form> <input name="accept" type="checkbox" value="Gdpr" required/>I accept the GDPR <input type="submit" value="Accept"> </form> </div> </div> <script> window.onload = function () { document.getElementById("accept-button").onclick = function () { document.getElementById("modal").style.display = "none" }; }; </script>
現在、[同意する]ボタンをクリックしても何も表示されません。 display:none;
PHPコード: pと一緒にメソッドを呼び出したい>
function updateHasReadFlag($user) { // I added support for using this function either with user ID or user object if ( $user && is_int( $user ) ) { $user_id = $user; } else if ( ! empty( $user->ID ) ) { $user_id = $user->ID; } else { return; } return update_user_meta( $user_id, "META_KEY", true ); }
生成されたフォームコード:
<form method="post" action="<?php echo esc_url( home_url() ); ?>"> <input name="accept" type="checkbox" value="Gdpr" required=""> I accept the GDPR <input type="submit" value="Accept"> <!--?php wp_nonce_field( "accept-gdpr", "accept_gdpr_nonce" ); ?--> </form>
ナンスフィールドがコメント化されている理由がわかりません。これはまさにコードが生成したものであり、コード内の何も編集していません。
コメント
- リロードせずにメタデータを更新しようとしていますか?現在のページ?フォームを同じページに送信し、ページの読み込み時にメタデータを更新するのはどうですか?
- はいメタデータを更新しようとしています。あなたが話していることの解決策を教えてください。すばらしいでしょう。
回答
現在のデータを再読み込みしたくない場合は、AJAXを使用できます。ページ—つまり、[同意する]ボタンをクリックすると、現在のページを離れることなく、AJAXリクエストを実行してユーザーメタデータを更新します。
ただし、解決策私が提案しているのは、AJAXを使用していない です。代わりに、フォームをホームページに送信し(action
属性値を設定)、template_redirect
フックを使用してメタデータを更新します。 (前のページまたは参照ページにリダイレクトします)。
手順
-
form
タグを次のように変更します。 :<form method="post" action="<?php echo esc_url( home_url() ); ?>">
そしてこの nonce フィールドを追加します:
<?php wp_nonce_field( "accept-gdpr", "accept_gdpr_nonce" ); ?>
つまり、
form
は次のようになります。<form method="post" action="<?php echo esc_url( home_url() ); ?>"> <input name="accept" type="checkbox" value="Gdpr" required /> I accept the GDPR <input type="submit" value="Accept" /> <?php wp_nonce_field( "accept-gdpr", "accept_gdpr_nonce" ); ?> </form>
-
これをテーマ
functions.php
ファイルに追加します:function accept_gdpr() { // Check if the user is authenticated. if ( ! is_user_logged_in() ) { return; } // Check if we have all necessary data. if ( empty( $_POST["accept_gdpr_nonce"] ) || empty( $_POST["accept"] ) || "Gdpr" !== $_POST["accept"] ) { return; } // Verify the nonce. if ( ! wp_verify_nonce( $_POST["accept_gdpr_nonce"], "accept-gdpr" ) ) { return; } // Update the meta. update_user_meta( get_current_user_id(), "META_KEY", "1" ); // Redirect back to the previous page. wp_safe_redirect( wp_get_referer() ); exit; } add_action( "template_redirect", "accept_gdpr" );
注:
-
Gdpr
は"Gdpr" !== $_POST["accept"]
は上記の<input name="accept" type="checkbox" value="Gdpr" required />
と同じです。 -
必ず置き換えてください
META_KEY
と実際のメタキー。 -
GDPRの承認はログを目的としていると思います年齢制限のあるユーザーのみ。そのため、上記のコード/関数で
is_user_logged_in()
とget_current_user_id()
を使用しました。
-
UPDATE
wp_safe_redirect()
はOPで機能しなかったため、wp_redirect()
。
回答
wp_localize_script()も利用可能こちら。
簡単な説明:WordPressで
in JS
したがって、次のようなことができます。
FIRST テーマのルートに、style.cssと同じレベルのjs
フォルダーを作成します(ない場合)それでも、このjs
フォルダーにファイルcall-php.js
を作成します。好きな名前を付けることができます。重要なのは、.js
ファイル
である必要があるということです。 Functions.php after あなたのfunction updateHasReadFlag($user)
追加:
/** * Hooking in JS code. */ function call_php_in_js() { wp_enqueue_script( "call-php-in-js", get_template_directory_uri() . "/js/call-php.js", array( "jquery" ), filemtime( get_theme_file_path( "/js/call-php.js" ) ), true ); $php_to_js = array( "my_php_function" => updateHasReadFlag( $user ), ); wp_localize_script( "call-php-in-js", "object_name", $php_to_js ); } add_action( "wp_enqueue_scripts", "call_php_in_js" );
SECOND 、 call-php.js
ファイルに次を追加します:
( function( $ ) { $( "#accept-button" ).click( function( e ) { e.preventDefault(); $( "#modal" ).hide(); object_name.my_php_function; }); } )( jQuery );
これで問題が解決することを願っています。
私はしませんでした」テストしますが、動作するはずです。
テスト後にお知らせください。
コメント
- 回答ありがとうございます。ありがとうございます。 。しかし、どういうわけかこれは機能していません。私の
function updateHasReadFlag($user)
が呼び出されていません。または、呼び出されているのにupdate_user_meta( $user_id, 'META_KEY', true );
が呼び出されていない可能性があります。動作しています。調べていただけますか。また、htmlコードから<script>
</script>
を削除しました。 - お問い合わせくださいただ確認するためにm、My
function updateHasReadFlag($user)
は、ユーザーIDまたはユーザーオブジェクトをパラメーターとして受け入れるため、特定のユーザーメタデータを更新できます。function updateHasReadFlag($user)
-
object_name.my_php_function;
をconsole.log(object_name.my_php_function);
コンソールに表示される内容を教えてください。知っておくと、私の答えを使用して#accept-button
をクリックすると、#modal
が非表示になりますか? - ログに記録されます call-php.jsのコンソールの" null "は
#modal
私の答えを使用して#accept-button
をクリックすると非表示になりますか?
を呼び出すときにこれをパラメータとして送信しますか?