Правильный способ использования WordPress функций с AJAX PHP файлом

26 февр. 2017 г., 05:45:11
Просмотры: 14.3K
Голосов: 1

У меня есть следующая 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?

1
Комментарии

в целом, попытка прямого доступа к любому php-файлу в вашей теме (или плагине) скорее всего не сработает по разным причинам. Основные ошибочные предположения, которые могут привести к сбою: 1. что вы можете запускать скрипты в этой директории 2. расположение директории wp-content. Возможны и другие подводные камни, которые сейчас не приходят мне на ум

Mark Kaplun Mark Kaplun
5 мар. 2017 г. 18:20:42
Все ответы на вопрос 1
1

Да, использование 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) ;

Надеюсь, это поможет.

5 мар. 2017 г. 17:24:48
Комментарии

Привет, Пол, я пробую то, что ты предложил в своем ответе, но получаю ошибку "500". Можешь подсказать, что мне делать?

sumit chauhan sumit chauhan
15 февр. 2018 г. 13:08:07