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
-
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>
-
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:
-
A
Gdpr
mint"Gdpr" !== $_POST["accept"]
ugyanaz, mint a fenti<input name="accept" type="checkbox" value="Gdpr" required />
. -
Mindenképpen cserélje ki a
META_KEY
a tényleges metakulccsal. -
Ú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()
ésget_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 aupdate_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 afunction updateHasReadFlag($user)
- helyettesítheti az
object_name.my_php_function;
szövegetconsole.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?