Chamando um método de functions.php com um clique em um botão

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

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

    1. O Gdpr como em "Gdpr" !== $_POST["accept"] é o mesmo que em <input name="accept" type="checkbox" value="Gdpr" required /> acima.

    2. Certifique-se de substituir a META_KEY com a meta-chave real.

    3. Eu acredito que a aceitação do GDPR visa o log apenas usuários com acesso, por isso usei is_user_logged_in() e get_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 o update_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 chamar function updateHasReadFlag($user)
  • você poderia substituir object_name.my_php_function; por console.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?

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *