ボタンをクリックしてfunctions.phpからメソッドを呼び出す

メソッドを呼び出さなければならないプロジェクトに取り組んでいます(ユーザーを受け入れる)送信ボタン(承認ボタン)のクリックからの入力としての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コード:

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フックを使用してメタデータを更新します。 (前のページまたは参照ページにリダイレクトします)。

手順

  1. 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> 
  2. これをテーマ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" ); 

    注:

    1. Gdpr"Gdpr" !== $_POST["accept"]は上記の<input name="accept" type="checkbox" value="Gdpr" required />と同じです。

    2. 必ず置き換えてくださいMETA_KEYと実際のメタキー。

    3. 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をクリックすると非表示になりますか?

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です