Estou desenvolvendo um site wordpress usando templates / temas personalizados, mas estou tendo dificuldade. Quero usar Ajax para chamar uma função quando um usuário clica em um botão. Em uma página, tenho um botão assim:
<p class="form-submit"> <input name="message_read" type="submit" class="submit button mark-as-read" value= "Mark as read" /> </p>
E tenho uma função jQuery / Ajax como esta:
jQuery(document).ready(function() { jQuery(".mark-as-read").click(function () { console.log("The function is hooked up"); jQuery.ajax({ type: "POST", url: "/wp-admin/admin-ajax.php", data: { action: "mark_message_as_read", }, success: function (output) { console.log(output); } }); }); });
A função acima reside em wp-content/themes/my-theme/js/wp_ajax_calls.js
. Eu adicionei o script ao site desta forma:
1) Eu adicionei isso ao meu arquivo functions.php:
wp_enqueue_script( "ajax calls", get_template_directory_uri() ."/js/wp_ajax_calls.js", array("jquery"), "1.0", true);
2) Incluí o script no cabeçalho.
<script type="text/javascript" src="https://mysite//wp-content/themes/twentyfifteen/js/wp_ajax_calls.js"></script>
Quando clico no botão como está, a instrução console.log é exibida. No meu entendimento, quero que minha função ajax chame uma função php que me permita usar $ wpdb. Eu tenho isso em functions.php:
function mark_message_as_read() { global $wpdb; // do stuff. }
É aqui que estou ficando confuso. Tenho duas perguntas principais:
1) Acho que devo ter alguns add_action () “s em algum lugar, mas não sei para onde coloque-os e também não sei que gancho devo usar.
2) Além disso, Eu quero ser capaz de passar dados (o id da mensagem) para a função php para minha consulta de banco de dados. Como faço para passar um argumento para essa função?
Não quero usar algo como if( isset($_POST["message_whatever"]) ) twentyfifteen_message_whatever();
por causa da maneira como as mensagens foram configuradas.
Fico feliz em fornecer mais informações, se necessário. Agradecemos antecipadamente por sua ajuda !!
Comentários
- Consulte a documentação .
Resposta
-
Crie um tema filho para não mexer com o código de um tema existente porque da próxima vez que você “atualizar o tema, poderá perder todas as suas alterações (consulte Temas filhos )
-
Veja como passar valores para sua solicitação ajax:
jQuery(document).ready(function() { jQuery(".mark-as-read").click(function () { console.log("The function is hooked up"); jQuery.ajax({ type: "POST", url: "/wp-admin/admin-ajax.php", data: { action: "mark_message_as_read", // add your parameters here message_id: $(".your-selector").val() }, success: function (output) { console.log(output); } }); }); });
Você pode fazer algumas pesquisas no Nonces também, para adicionar uma camada de segurança ao seu aplicativo: https://codex.wordpress.org/WordPress_Nonces
-
Finalmente, o código PHP para lidar com a solicitação (aqui também você deve lidar com o nonce no código da vida real):
// register the ajax action for authenticated users add_action("wp_ajax_mark_message_as_read", "mark_message_as_read"); // register the ajax action for unauthenticated users add_action("wp_ajax_nopriv_mark_message_as_read", "mark_message_as_read"); // handle the ajax request function mark_message_as_read() { $message_id = $_REQUEST["message_id"]; // add your logic here... // in the end, returns success json data wp_send_json_success([/* some data here */]); // or, on error, return error json data wp_send_json_error([/* some data here */]); }
Comentários
- Muito obrigado! Eu ' definitivamente darei uma olhada nos nonces também. : D