Pracowałem nad projektem, w którym będę musiał wywołać metodę (która akceptuje użytkownika id jako dane wejściowe) poprzez kliknięcie przycisku przesyłania (przycisk Akceptuj).
Próbowałem wszystkich sposobów, ale prawdziwym wyzwaniem, przed którym stoję, jest uzyskanie identyfikatora użytkownika w interfejsie i przekazać go do metody.
Moja metoda aktualizuje meta użytkownika tego konkretnego użytkownika.
Kod 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>
Obecnie mój przycisk Akceptuj po kliknięciu nie wyświetla żadnego. Chcę wywołać metodę wraz z display: none;
Mój kod 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 ); }
Wygenerowany kod formularza:
<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>
Nie rozumiem, dlaczego pole nonce jest komentowane. To jest dokładnie to, co wygenerował kod, niczego nie edytowałem w kodzie.
Komentarze
- Czy próbujesz zaktualizować metadane bez ponownego ładowania bieżąca strona? Co powiesz na przesłanie formularza na tę samą stronę i zaktualizowanie metadanych podczas ładowania strony?
- Tak, próbuję zaktualizować metadane. Czy możesz mi podać jakieś rozwiązanie tego, o czym mówisz. Byłoby wspaniale.
Odpowiedz
Możesz użyć AJAX, jeśli nie chcesz przeładowywać bieżącej strona — tzn. po kliknięciu przycisku „Akceptuj” wyślij żądanie AJAX, aby zaktualizować metadane użytkownika, wszystko bez opuszczania bieżącej strony.
Jednak rozwiązanie Proponuję nie używam AJAX; zamiast tego po prostu wysyłamy formularz (ustawiamy jego wartość atrybutu action
) na stronę główną, a następnie używamy haka template_redirect
, aby zaktualizować metadane (i przekieruj z powrotem do poprzedniej lub odsyłającej strony).
Kroki
-
Zmień tag
form
na :<form method="post" action="<?php echo esc_url( home_url() ); ?>">
i dodaj to pole nonce :
<?php wp_nonce_field( "accept-gdpr", "accept_gdpr_nonce" ); ?>
więc Twój
form
wygląda teraz tak:<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>
-
Dodaj to do motywu
functions.php
plik: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" );
Uwagi:
-
Gdpr
jak w"Gdpr" !== $_POST["accept"]
jest taki sam jak w powyższym<input name="accept" type="checkbox" value="Gdpr" required />
. -
Pamiętaj, aby zastąpić
META_KEY
z rzeczywistym kluczem meta. -
Uważam, że akceptacja RODO ma na celu tylko dla użytkowników ged-in, więc „dlatego użyłem
is_user_logged_in()
iget_current_user_id()
w powyższym kodzie / funkcji.
-
AKTUALIZACJA
wp_safe_redirect()
nie działał dla OP, więc użył wp_redirect()
.
Odpowiedź
Musisz użyć wp_localize_script () jest również dostępne tutaj .
Krótka historia: w ten sposób WordPress wywołuje PHP
w JS
Możesz więc zrobić coś podobnego do następującego.
FIRST utwórz folder js
w katalogu głównym motywu, na tym samym poziomie co style.css, jeśli go nie masz jednak wtedy w tym folderze js
utwórz plik call-php.js
. Możesz nadać mu dowolną nazwę, ważne jest to, że musi to być plik .js
W Twoim functions.php po Twoim function updateHasReadFlag($user)
dodaj:
/** * 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 , w pliku call-php.js
dodaj:
( function( $ ) { $( "#accept-button" ).click( function( e ) { e.preventDefault(); $( "#modal" ).hide(); object_name.my_php_function; }); } )( jQuery );
Mam nadzieję, że to rozwiąże problem.
Nie udało mi się ” t przetestuj, ale powinno działać.
Daj mi znać po przetestowaniu.
Komentarze
- Dziękuję za odpowiedź. Doceniam to . Ale jakoś to nie działa. Mój
function updateHasReadFlag($user)
nie jest wywoływany. A może dzwoni, aleupdate_user_meta( $user_id, 'META_KEY', true );
w jakiś sposób nie działa. Czy możesz się temu przyjrzeć. Usunąłem też<script>
</script>
z mojego kodu HTML. - Pytanie żeby tylko potwierdzić m, My
function updateHasReadFlag($user)
akceptuje identyfikator użytkownika lub obiekt użytkownika jako parametr, dzięki czemu może aktualizować metadane tego konkretnego użytkownika. Czy wysyłamy to jako parametr podczas wywoływaniafunction updateHasReadFlag($user)
- czy mógłbyś zamienić
object_name.my_php_function;
naconsole.log(object_name.my_php_function);
i powiedz mi, co widzisz w konsoli.Warto wiedzieć, czy#modal
jest ukrywane po kliknięciu#accept-button
przy użyciu mojej odpowiedzi? - Jest rejestrowane jako " null " w konsoli dla call-php.js
- to
#modal
ukrywanie się po kliknięciu#accept-button
używając mojej odpowiedzi?