Volání metody z functions.php po kliknutí na tlačítko

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

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

    1. Gdpr jako v "Gdpr" !== $_POST["accept"] je stejný jako ve <input name="accept" type="checkbox" value="Gdpr" required /> výše.

    2. Nezapomeňte nahradit META_KEY se skutečným meta klíčem.

    3. 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() a get_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, ale update_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; za console.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?

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *