Правильный способ использования WordPress функций с AJAX PHP файлом
У меня есть следующая jQuery функция в файле custom-js.js
:
$(function() {
$(".product-vote-button-up").click(function(){
var productID = $(this).attr('productID');
var request = $.ajax({
url: "/wordpress/wp-content/themes/my-theme/js/ajax/vote-database-update.php",
type: "POST",
data: {id : productID},
});
request.done(function() {
$("#product-" + productID + " .item-product-footer-vote-container").html('Спасибо за ваш голос!');
});
request.fail(function(jqXHR, textStatus) {
alert( "Ошибка запроса: " + textStatus );
});
});
});
С помощью AJAX я хочу обновить счетчик голосов в моей пользовательской базе данных продуктов с помощью SQL команд. Для этого мне нужен доступ к WordPress функциям в vote-database-update.php
, таким как $wpdb
. Единственный способ, который пока работает - это добавление:
require_once( explode( "wp-content" , __FILE__ )[0] . "wp-load.php" );
в мой PHP файл. Однако, я считаю это не совсем правильным подходом. После изучения документации, я думаю, что есть более правильный способ с использованием admin-ajax.php
. В большинстве документации описывается, как добавлять AJAX в плагин через admin-ajax.php
. Я немного запутался, так как мой vote-database-update.php
не является плагином (или, возможно, я неправильно понимаю определение плагина WordPress). Какой будет правильный способ подключения WordPress функций в моем файле vote-database-update.php?

Да, использование admin-ajax.php
- правильный подход в данном случае. Вот как это можно реализовать:
В vote_database_update.php
// Подключаемся к admin-ajax
// Текст после 'wp_ajax_' и 'wp_ajax_no_priv_' в вызовах add_action()
// будет использоваться как значение data.action в AJAX-запросе в вашем JS
// Если AJAX-запрос будет выполняться из JS, когда пользователь авторизован в WP,
// используйте эту версию
add_action ('wp_ajax_call_your_function', 'your_function') ;
// Если AJAX-запрос будет выполняться из JS, когда пользователь НЕ авторизован в WP,
// используйте эту версию
add_action ('wp_ajax_nopriv_call_your_function', 'your_function') ;
function
your_function ()
{
if (!isset ($_REQUEST['id'])) {
// Устанавливаем возвращаемое значение при ошибке
// Возвращаемое значение может быть ЛЮБОГО типа данных (например, array())
$return_value = 'сообщение об ошибке' ;
wp_send_json_error ($return_value) ;
}
$id = intval ($_REQUEST['id']) ;
// выполняем необходимую обработку на основе $id
// Устанавливаем возвращаемое значение при успехе
// Возвращаемое значение может быть ЛЮБОГО типа данных (например, array())
$return_value = 'ваше сообщение/данные об успехе' ;
wp_send_json_success ($return_value) ;
}
В custom-js.js
(function ($) {
$('.product-vote-button-up').click (function () {
var productID = $(this).attr ('productID') ;
$.ajax ({
url: '/wp-admin/admin-ajax.php',
type: 'POST',
dataType: 'JSON',
data: {
// значение data.action - это часть ПОСЛЕ 'wp_ajax_' в
// add_action ('wp_ajax_xxx', 'yyy') в PHP выше
action: 'call_your_function',
// ЛЮБЫЕ другие свойства data передаются в your_function()
// через глобальную переменную $_REQUEST (или $_POST в данном случае)
id : productID
},
success: function (resp) {
if (resp.success) {
// если вам нужно использовать возвращаемое значение,
// установленное в your_function(), вы можете получить его через
// resp.data, но в данном случае, вероятно, это не требуется
$('#product-' + productID + ' .item-product-footer-vote-container').html ('Спасибо за ваш голос!') ;
}
else {
// этот случай "ошибки" означает, что AJAX-запрос выполнен успешно,
// но функция вернула состояние ошибки
alert ('Ошибка: ' + resp.data) ;
}
},
error: function (xhr, ajaxOptions, thrownError) {
// этот случай ошибки означает, что сам AJAX-запрос не удался,
// например, из-за синтаксической ошибки в your_function()
alert ('Ошибка запроса: ' + thrownError.message) ;
},
}) ;
}) ;
})(jQuery) ;
Надеюсь, это поможет.
