Pracoval jsem na projektu, kde budu muset zavolat metodu (která přijímá uživatele ID jako vstup) z kliknutí na tlačítko Odeslat (tlačítko Přijmout).
Zkoušel jsem všechny způsoby, ale skutečnou výzvou, které čelím, je způsob, jak získat ID uživatele v rozhraní frontend a předejte jej metodě.
Moje metoda aktualizuje meta uživatele konkrétního uživatele.
HTML kód:
<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>
V současné době moje tlačítko Přijmout po kliknutí zobrazuje pouze žádné. Chci zavolat metodu spolu s display: none;
Můj PHP kód:
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 ); }
Generovaný kód formuláře:
<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>
Nechápu, proč je pole nonce komentováno. To je přesně to, co kód vygeneroval, v kódu jsem nic nezměnil.
Komentáře
- Pokoušíte se aktualizovat metadata bez opětovného načtení aktuální stránka? Co kdybyste jednoduše odeslali formulář na stejnou stránku a aktualizovali metadata při načtení stránky?
- Ano, pokouším se aktualizovat metadata. Můžete mi poskytnout nějaké řešení toho, o čem mluvíte. Bylo by to skvělé.
Odpověď
AJAX můžete použít, pokud nechcete znovu načíst aktuální stránka — tj. po kliknutí na tlačítko „Přijmout“ odešlete požadavek AJAX na aktualizaci metadat uživatele, aniž byste opustili aktuální stránku.
Řešení však Navrhuji nepoužívám použití AJAX; místo toho jednoduše odešleme formulář (nastavíme jeho action
hodnotu) na domovskou stránku a poté použijeme háček template_redirect
k aktualizaci metadat (a přesměrovat zpět na předchozí nebo odkazující stránku).
Kroky
-
Změňte značku
form
na :<form method="post" action="<?php echo esc_url( home_url() ); ?>">
a přidejte toto nonce pole:
<?php wp_nonce_field( "accept-gdpr", "accept_gdpr_nonce" ); ?>
takže váš
form
nyní vypadá takto:<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>
-
Přidejte toto do motivu
functions.php
souboru: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" );
Poznámky:
-
Gdpr
jako v"Gdpr" !== $_POST["accept"]
je stejný jako ve<input name="accept" type="checkbox" value="Gdpr" required />
výše. -
Nezapomeňte nahradit
META_KEY
se skutečným meta klíčem. -
Domnívám se, že přijetí GDPR je zaměřeno na log pouze přihlášení uživatelé, proto jsem ve výše uvedeném kódu / funkci použil
is_user_logged_in()
aget_current_user_id()
.
-
AKTUALIZACE
wp_safe_redirect()
nepracoval pro OP, proto použil wp_redirect()
.
Odpověď
Budete muset použít wp_localize_script () také k dispozici zde .
Povídka: jedná se o způsob volání WordPress PHP
v JS
Takže můžete udělat něco jako následující.
FIRST vytvořte js
složku v kořenovém adresáři motivu, na stejné úrovni jako style.css, pokud ji nemáte přesto v této js
složce vytvořte soubor call-php.js
. Můžete jej pojmenovat, jak chcete, důležité je, že to musí být soubor .js
Ve vašem functions.php po vašich function updateHasReadFlag($user)
přidat:
/** * 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 , v souboru call-php.js
přidat:
( function( $ ) { $( "#accept-button" ).click( function( e ) { e.preventDefault(); $( "#modal" ).hide(); object_name.my_php_function; }); } )( jQuery );
Doufám, že to váš problém vyřeší.
Neudělal jsem “ Otestujte to, ale mělo by to fungovat.
Po testování to dejte vědět.
Komentáře
- děkuji za odpověď. Oceňuji to .Ale nějak to nefunguje. Můj
function updateHasReadFlag($user)
se nedovolává volat. Nebo se může dít volat, aleupdate_user_meta( $user_id, 'META_KEY', true );
se tak nějak nedělá funguje. Můžete se na to podívat. Také jsem z mého html kódu odstranil<script>
</script>
. - jen pro potvrzení m, My
function updateHasReadFlag($user)
přijímá jako parametr ID uživatele nebo objekt uživatele, takže může aktualizovat metadata konkrétního uživatele. Posíláme to jako parametr při volánífunction updateHasReadFlag($user)
- můžete prosím nahradit
object_name.my_php_function;
zaconsole.log(object_name.my_php_function);
a řekněte mi, co vidíte v konzole.Stačí vědět, zda se#modal
skrývá, když kliknete na#accept-button
pomocí mé odpovědi? - Je přihlášen jako " null " v konzole pro call-php.js
- je
#modal
skrytí, když kliknete na#accept-button
pomocí mé odpovědi?