Tenho trabalhado em um projeto onde terei que chamar um método (que aceita o usuário id como entrada) a partir de um clique no botão enviar (botão Aceitar).
Tenho tentado de todas as maneiras, mas o verdadeiro desafio que estou enfrentando é como obter o ID do usuário no front end e passe-o para o método.
Meu método atualiza a meta do usuário daquele usuário específico.
Código 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>
No momento, meu botão Aceitar, quando clicado, não exibe nenhum. Quero chamar o método junto com display: none;
Meu código 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 ); }
O código do formulário gerado:
<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>
Não entendo por que o campo nonce é comentado. Isso é exatamente o que o código foi gerado, eu não editei nada no código.
Comentários
- Você está tentando atualizar os metadados sem recarregar a página atual? Que tal simplesmente enviar o formulário para a mesma página e atualizar os metadados no carregamento da página?
- Sim, estou tentando atualizar os metadados. Você pode me fornecer alguma solução do que você está falando. Seria ótimo.
Resposta
Você poderia usar AJAX se não quiser recarregar o atual página — ou seja, ao clicar no botão “Aceitar”, faça uma solicitação AJAX para atualizar os metadados do usuário, tudo sem sair da página atual.
No entanto, a solução Estou propondo que não está usando AJAX; em vez disso, simplesmente enviamos o formulário (definimos seu action
valor de atributo) para a página inicial e, em seguida, usamos o gancho template_redirect
para atualizar os metadados (e redirecionar de volta para a página anterior ou de referência).
As etapas
-
Altere a tag
form
para :<form method="post" action="<?php echo esc_url( home_url() ); ?>">
e adicione este campo nonce :
<?php wp_nonce_field( "accept-gdpr", "accept_gdpr_nonce" ); ?>
para que seu
form
agora se pareça com:<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>
-
Adicione ao tema
functions.php
arquivo: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" );
Observações:
-
O
Gdpr
como em"Gdpr" !== $_POST["accept"]
é o mesmo que em<input name="accept" type="checkbox" value="Gdpr" required />
acima. -
Certifique-se de substituir a
META_KEY
com a meta-chave real. -
Eu acredito que a aceitação do GDPR visa o log apenas usuários com acesso, por isso usei
is_user_logged_in()
eget_current_user_id()
no código / função acima.
-
ATUALIZAÇÃO
wp_safe_redirect()
não funcionou para o OP, então ele usou wp_redirect()
.
Resposta
Você precisará usar wp_localize_script () também disponível aqui .
Breve história: é a maneira do WordPress de chamar PHP
in JS
Então você poderia fazer algo como o seguinte.
PRIMEIRO crie uma js
pasta na raiz do seu tema, mesmo nível de style.css, se você não tiver uma ainda, então nesta js
pasta, crie um arquivo call-php.js
. Você pode nomeá-lo como quiser. O importante é que ele deve ser um .js
arquivo
Em seu functions.php após seu 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" );
SEGUNDO , no call-php.js
arquivo, adicione:
( function( $ ) { $( "#accept-button" ).click( function( e ) { e.preventDefault(); $( "#modal" ).hide(); object_name.my_php_function; }); } )( jQuery );
Espero que isso resolva seu problema.
Eu não ” teste, mas deve funcionar.
Avise-me depois de testá-lo.
Comentários
- obrigado pela resposta. Agradeço . Mas, de alguma forma, isso não está funcionando. Meu
function updateHasReadFlag($user)
não está sendo chamado. Ou pode estar sendo chamado, mas oupdate_user_meta( $user_id, 'META_KEY', true );
não está está funcionando. Você pode dar uma olhada. Também removi<script>
</script>
do meu código html. - Estou pedindo só para confirmar m, My
function updateHasReadFlag($user)
aceita a ID do usuário ou objeto do usuário como um parâmetro, para que possa atualizar os metadados do usuário em particular. Estamos enviando isso como um parâmetro ao chamarfunction updateHasReadFlag($user)
- você poderia substituir
object_name.my_php_function;
porconsole.log(object_name.my_php_function);
e me diga o que você vê no console.Só para saber,#modal
está ficando oculto quando você clica em#accept-button
usando minha resposta? - É registrado como " null " no console para call-php.js
- é o
#modal
ficando escondido ao clicar em#accept-button
usando minha resposta?