Wywołanie metody z functions.php po kliknięciu przycisku

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

  1. 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> 
  2. 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:

    1. Gdpr jak w "Gdpr" !== $_POST["accept"] jest taki sam jak w powyższym <input name="accept" type="checkbox" value="Gdpr" required />.

    2. Pamiętaj, aby zastąpić META_KEY z rzeczywistym kluczem meta.

    3. 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() i get_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, ale update_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ływania function updateHasReadFlag($user)
  • czy mógłbyś zamienić object_name.my_php_function; na console.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?

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *