Wordpress, плагин, ajax, правильная реализация

221
13 апреля 2018, 15:31

Задача: Создать "плагин" на WP, который будет генерировать форму и отображать её на определённых страницах. Форма, при помощи AJAX, будет получать нужные данные из БД, в зависимости от ранее заполненных пунктов этой формы.

Вопрос: Как правильно реализовать?

Если в главном файле плагина создать хук wp_ajax_(action) с функцией, сделать подключения JS, то всё работает.

Не получается сделать ajax, если весь код выше, добавить в главный файл при помощи include. Выскакивает ошибка 400

Код в главном файле плагина:

include_once UrlPlugin.'addEditVote/AddEditVote.php';

Файл AddEditVote.php(всё, что ниже, располагается в отдельной папке):

// при срабатывании хука действия wp_ajax с экшеном hello, выполняется функция say_hello
add_action( 'wp_ajax_hello', 'say_hello' );
function say_hello() {
    echo "УРАААААААААААА!";
    wp_die();
}
// при хуке действии wp_enqueue_scripts, вызываем функцияю, которая зарегистрирует JS код обработчика AJAX и выставил её после jQuery
add_action('wp_enqueue_scripts', function () {
    wp_enqueue_script('ajaxAddEditVote', plugins_url('ajaxAddEditVote.js', __FILE__), array('jquery'), null);
    // До вывода JS, вызванного wp_enqueue_script, выводим JS объект с какими либо значениями
    wp_localize_script('ajaxAddEditVote', 'localizePlugin', array(
        'ajaxURL' => admin_url('admin-ajax.php')
    ));
});

И сам JS файл ajaxAddEditVote.js:

jQuery(document).ready( function() {
    var data = {
        action: 'hello'
    };
    jQuery.post(localizePlugin.ajaxURL, data, function (response) {
        alert('Получено с сервера: ' + response);
    });
});

Как это сделать правильно (последовательность подключения файлов и запросов, ознакомился с кучей тем и в итоге полная путаница =). спасибо) ?

Answer 1

В целом всё сделано правильно, и подтверждением этому является работа при включении кода в основной файл плагина.

Ошибка при выносе в include заключается в том, что вы используете магическую константу __FILE__, которая указывает на текущий файл кода. При выносе кода __FILE__ получает другое значение, и wp_enqueue_script() не запускает ваш скрипт вообще.

Ещё надо бы добавить nonce, согласно руководству. Сейчас ваш сайт, в теории, можно заставить выполнить серверный код say_hello(), послав POST-запрос извне.

READ ALSO
Как сделать якорную ссылку в Fancybox 3?

Как сделать якорную ссылку в Fancybox 3?

Подскажите, как сделать так, чтобы ссылка на форму выглядела как /# или /#order и при нажатии на нее открывалась в iframe-окне Fancybox 3

206
JSON и DataTables

JSON и DataTables

Есть JSON объект , задача распарсить и закинуть содержимое в таблицу

272
скрыть пустые блоки для owl-carousel 2

скрыть пустые блоки для owl-carousel 2

Использую owl-carousel 2, на сайте примерно 15-20 owl-item , суть в том что количество контента может быть разным от 1 до 20, как мне скрыть те owl-item которые...

288