Приветствую!
Необходимо составить JS запрос к WP. Для примера, попробуем отправить и вернуть простые данные.
После некоторого гугления, написал примитивный вариант реализации этой задачи.
В WP создаем тестовую функцию, которая будет принимать запрос от JS и отправлять json в ответ:
// временно, разместил в function.php
function fn_test() {
wp_send_json([$_POST["prop1"], $_POST["prop2"]]);
}
add_action("wp_ajax_fn_test", "fn_test"); // только авторизованные
add_action("wp_ajax_nopriv_fn_test", "fn_test"); // только НЕ авторизованные
1.
wp_ajax_fn_
- если обратиться к функции могут только авторизованные пользователи.
wp_ajax_nopriv_
- для НЕ авторизованных пользователей. На настоящий момент это актуальная практика?
JavaScript-ом шлем запрос к WP:
fetch("/wp-admin/admin-ajax.php", {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded; charset=utf-8" },
// body: { action: "fn_test", prop1: "a", prop2: "b" }, // не работает...
body: "action=fn_test&prop1=a&prop2=b",
})
.then(res => res.json())
.then(json => console.log(json));
2. В
body
необходимо передавать строку
action=fn_test
, где
fn_test
- это часть названия функции в WP, к которой шлем запрос?
3. Если в
body
необходимо передавать объект, а не строку, то как ее передать? Ибо пример (выше) с закомментированым объектом в
body
не сработал.
Для усложнения задачи, используем функции плагина WooCommerce. Например, добавим товар в корзину:
function fn_test() {
global $woocommerce;
$woocommerce->cart->add_to_cart($product_id = 565, $quantity = 1, $variation_id = 0, $variation = [], $cart_item_data = []);
// $product_id = 565 // единственный товар созданный в админке, для тестов прямо указал его id
wp_send_json("товар добавлен в корзину");
}
add_action("wp_ajax_fn_test", "fn_test");
add_action("wp_ajax_nopriv_fn_test", "fn_test");
4. Нормально ли так взаимодействовать с API, например того же самого WooCommerce?
Хотелось бы услышать разные мысли, как и почему правильно использовать "то", а не "это". Любым замечаниям буду рад!