Módszer meghívása a functions.php fájlból egy gombnyomásra

Olyan projekten dolgoztam, ahol egy metódust kell meghívnom (amely elfogadja a felhasználót) azonosító, mint bemenet) egy beküldés gombra kattintva (Elfogadás gomb).

Mindenféleképpen próbáltam, de az igazi kihívás az, amivel szembe kell néznem, hogyan lehet a felhasználói azonosítót a kezelőfelületbe és adja át a metódusnak.

A módszerem frissíti az adott felhasználó felhasználói metáját.

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> 

Jelenleg az Elfogadás gomb, amikor rákattint, csak egyet sem mutat. A metódust a display: none mellett szeretném meghívni;

PHP-kódom:

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 ); } 

A létrehozott űrlapkód:

<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> 

Nem értem, miért kommentálják a nonce mezőt. Pontosan ezt generálta a kód, én nem szerkesztettem semmit a kódban.

Megjegyzések

  • Megpróbálja frissíteni a metaadatokat újratöltés nélkül az aktuális oldal? Mi lenne, ha egyszerűen elküldené az űrlapot ugyanazon az oldalon, és frissítené a metaadatokat az oldal betöltésekor?
  • Igen, megpróbálom frissíteni a metaadatokat. Tudna nekem valami megoldást adni arról, amiről beszél. Nagyszerű lenne.

Válasz

Használhatja az AJAX-ot, ha nem akarja betölteni az aktuálisat — oldal, azaz ha az “Elfogadás” gombra kattint, kérjen egy AJAX kérést a felhasználói metaadatok frissítéséhez, anélkül, hogy elhagyná az aktuális oldalt.

A megoldás azonban Azt javaslom, hogy nem használom az AJAX-ot; ehelyett egyszerűen beküldjük az űrlapot (állítsuk be annak action attribútum értékét) a kezdőlapra, majd a template_redirect kampóval frissítjük a metaadatokat (és irányítson vissza az előző vagy hivatkozó oldalra).

A lépések

  1. A form címkét módosítsa :

    <form method="post" action="<?php echo esc_url( home_url() ); ?>"> 

    és adja hozzá ezt a nonce mezőt:

    <?php wp_nonce_field( "accept-gdpr", "accept_gdpr_nonce" ); ?> 

    így a form a következőnek tűnik:

    <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. Adja hozzá a functions.php téma fájlhoz:

    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" ); 

    Megjegyzések:

    1. A Gdpr mint "Gdpr" !== $_POST["accept"] ugyanaz, mint a fenti <input name="accept" type="checkbox" value="Gdpr" required />.

    2. Mindenképpen cserélje ki a META_KEY a tényleges metakulccsal.

    3. Úgy gondolom, hogy a GDPR elfogadása naplózásra irányul Csak a beágyazott felhasználók számára, ezért “ezért használtam a is_user_logged_in() és get_current_user_id() elemeket a fenti kódban / függvényben.

UPDATE

wp_safe_redirect() nem működött az OP-nál, ezért használta a wp_redirect().

Válasz

A wp_localize_script () szintén elérhető itt .
Novella: ez a WordPress módja a PHP itt: JS
Tehát valami hasonlót tehetne.
FIRST hozz létre egy js mappát a téma gyökerében, ugyanolyan szinten, mint a style.css, ha nincs mégis, akkor ebben az js mappában hozzon létre egy fájlt call-php.js. Nevezheted, amit csak akarsz, az a fontos, hogy .js fájl legyen
A function.php után a function updateHasReadFlag($user) add:

/** * 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 , a call-php.js fájlban adja hozzá:

( function( $ ) { $( "#accept-button" ).click( function( e ) { e.preventDefault(); $( "#modal" ).hide(); object_name.my_php_function; }); } )( jQuery ); 

Remélem, hogy ez megoldja a problémáját.
Nem sikerült ” Tesztelje, de működnie kell.
Tesztelés után tudassa velem.

Megjegyzések

  • köszönöm a választ. Nagyra értékelem . De valahogy ez nem működik. Az én function updateHasReadFlag($user) -emet nem hívják. Vagy lehet, hogy hívják, de a update_user_meta( $user_id, 'META_KEY', true ); -et valahogy nem működik. Tudsz utánanézni. A <script> </script> fájlt is eltávolítottam a html kódomból.
  • Kérdezem csak megerősíteni m, My function updateHasReadFlag($user) a userID vagy user Object paramétert fogadja el, így frissíteni tudja az adott felhasználói metaadatokat. Küldjük ezt paraméterként, amikor felhívjuk a function updateHasReadFlag($user)
  • helyettesítheti az object_name.my_php_function; szöveget console.log(object_name.my_php_function); és mondja el, mit lát a konzolon.Csak tudni, hogy a #modal elrejtődik-e, amikor a válaszommal a #accept-button gombra kattint?
  • Naplózva van mint " null " a call-php.js konzolján
  • a #modal elrejtés, amikor a #accept-button gombra kattintasz a válaszommal?

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük