W WordPress'ie w łatwy sposób można korzystać z możliwości technologii Ajax. Jest to połączenie PHP i JavaScript. Wykorzystujemy JS po stronie klienta by uruchomić skrypt PHP na serwerze, uzyskać wynik i zaprezentować go na stronie (lub nie).
W kilku punktach wygląda to tak:
- Rejestrujemy plik ze skryptem JavaScript w functions.php
- Przekazujemy poprzez wp_localize_script adres pliku admin-ajax.php w formie zmiennej JS na nagłówku strony.
- W zarejestrowanym pliku JS inicjujemy jQuery i programujemy zdarzenie, które wywoła AJAX funkcją.
- Tworzymy funkcję która poprzez AJAX dostanie się do kodu PHP zarejestrowanego poprzez wp_ajax_example_ajax_request.
- Kod PHP wykonuje swoje zadania i zwraca wynik poprzez echo.
- Funkcja AJAX odbiera wynik i proceduje wg niego na stronie, o ile jakieś zmiany są wymagane.
Ostatnie dwa punkty są kluczowe. PHP ma za zadanie na przykład zmienić zmienną w bazie danych. Jeżeli to się uda, zwróci wartość true, a AJAX wyświetli komunikat, że się udało.
Jak to wygląda w praktyce?
function example_ajax_enqueue() { // Enqueue javascript on the frontend. wp_register_script( 'example-ajax-script', plugin_dir_url(__FILE__) . 'js/simple-ajax-example.js', array('jquery') ); // The wp_localize_script allows us to output the ajax_url path for our script to use. wp_localize_script( 'example-ajax-script', 'example_ajax_obj', array( 'ajaxurl' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('ajax-nonce') ) ); } add_action('wp_enqueue_scripts', 'example_ajax_enqueue');
Powyższy kod należy umieścić w pliku functions.php pluginu. wp_register_script rejestruje plik js ze skryptami jQuery, a wp_localize_script podpina kilka potrzebnych zmiennych obiektu example_ajax_obj. Przede wszystkim adres pliku admin-ajax.php odpowiedzialnego za obsługę zapytań Ajax. nonce to wartość zmiennej potrzebnej do uwierzytelnienia danych wysłanych za pomocą GET lub POST.
add_action('wp_ajax_example_ajax_request', 'example_ajax_request'); function example_ajax_request() { $nonce = $_POST['nonce']; if (!wp_verify_nonce($nonce, 'ajax-nonce')) { die('Nonce value cannot be verified.'); } // The $_REQUEST contains all the data sent via ajax if (isset($_POST) && $_POST['user_id'] && SB5_Users::isUser($_POST['user_id']) && isset($_POST["name"])) { $user_id = $_POST['user_id']; $key = $_POST["name"]; $value = $_POST["value"]; if (in_array($value, [0, 1])) { echo update_user_meta($user_id, $key, $value); } else { echo 0; } // If you're debugging, it might be useful to see what was sent in the $_REQUEST // print_r($_REQUEST); } // Always die in functions echoing ajax content die(); }
wp_ajax_{$action} – magia wordpress'a
Dynamiczna część zaczepu wp_ajax_, {$action} zawiera nazwę tzw. akcji Ajax'a. W poniższym kodzie jest obiekt data, a jedną z jego wartości jest action. Przypisując mu wartość deklarujemy, że chcemy wywołać zaczep z takim właśnie parametrem $action.
Aby wykonać funkcję PHP poprzez Ajax dla wartości action równej example_ajax_request, musimy ją zarejestrować poprzez akcję wp_ajax_example_ajax_request. Zwróć uwagę, że skrypt w łatwy sposób sprawdza poprawność wartości nonce – wp_verify_nonce($nonce, 'ajax-nonce'). Jeżeli coś się nie zgadza, to należy zabić funkcję poprzez die(). Nie stosujemy w tym przypadku return.
W zależności od wykonanych czynności wynik funkcji do Ajax zwracamy poprzez wypisany tekst za pomocą echo. Na końcu zawsze musimy użyć die(). W przykładzie na którym ja się uczyłem jest rada, że jeżeli chcemy tylko zdubugować jakąś wartość wystarczy dodać funkcję print_r i podejrzeć inspektora / konsolę przeglądarki.
jQuery(document).ready(function ($) { // We'll pass this variable to the PHP function example_ajax_request var data = { nonce: example_ajax_obj.nonce, action: "example_ajax_request", }; console.log($('form[id] input[type="radio"]')); $('form[id] input[type="radio"]').change(function () { var user_obj = $(this) .closest("form[id]") .find('[type="hidden"][name="ID"]'); data.name = $(this).attr("name"); data.user_id = user_obj.val(); data.value = $(this).val(); if (data.user_id) gaum_security_change_value_js(data); }); function gaum_security_change_value_js(data) { if (data.name) { console.log(data); // This does the ajax request $.ajax({ url: example_ajax_obj.ajaxurl, method: "POST", data: data, success: function (data) { // This outputs the result of the ajax request console.log(data); }, error: function (errorThrown) { console.log(errorThrown); }, }); } } });
Od Java Script do PHP i z powrotem
Kluczową zmienną jest data. Inicjujemy ją jako obiekt z podstawowymi danymi jak nonce i adres admin-ajax.php. Programujemy zdarzenie jakim jest zmiana stanu checkboxa. Jeżeli wszystkie warunki są spełnione, wywołujemy Ajax'a lub funkcję z Ajaxem. Jeżeli Ajax zakończy się sukcesem w konsoli wyświetli się wynik. Równie dobrze może pokazać się alert na ekranie lub cokolwiek innego. W zademonstrowanym przypadku zależało mi tylko nad dokonaniem czynności w tle, czyli zmiany wartości w bazie danych.