WordPress Ajax URL для функции в functions.php
У меня есть десктопное приложение, и я использую $.getJSON для получения данных с моего сайта WordPress, используя плагин WP REST API. Это работает нормально, поэтому я предполагаю, что также могу сделать Ajax-вызов к функции в functions.php? Как это сделать? Ни в одном из примеров, которые я видел, не указан ajaxURL. Как мне его узнать?
У меня есть следующий код:
Functions.php (на сервере WordPress)
//Вызывается через Ajax из приложения - показывает содержимое папки, чтобы файлы можно было скачать и сохранить локально
function folder_contents() {
$folderPath = $_POST['path'];
$files = array_diff(scandir($path), array('.', '..'));
print_r($files);
return $files;
die();
}
add_action('wp_ajax_my_action', 'folder_contents');
app.js (запускается локально через node webkit)
//ajax вызов
var data = {
action: 'path',
path: datafolder;
};
var ajaxurl = baseurl + ''; //ЧТО ЗДЕСЬ ДОЛЖНО БЫТЬ?!?!
jQuery.post(ajaxurl, data, function(response) {
alert('Получено с сервера: ' + response);
console.log(response);
});
-------------------РЕДАКТИРОВАНИЕ----------------------
После ответа ниже я попробовал следующий код, основываясь на совете, но получаю
"index.html:324 Uncaught ReferenceError: ajax_params is not defined"
Functions.php
//добавляем код для использования ajax
function add_ajax_script() {
wp_localize_script( 'ajax-js', 'ajax_params', array( 'ajax_url' => admin_url( 'admin-ajax.php' ) ) );
}
//Вызывается через Ajax из приложения - показывает содержимое папки, чтобы файлы можно было скачать и сохранить локально
function folder_contents() {
$folderPath = $_POST['path'];
$files = array_diff(scandir($path), array('.', '..'));
wp_send_json($files);
die();
}
add_action('wp_ajax_folder_contents', 'folder_contents');
add_action('wp_ajax_nopriv_folder_contents', 'folder_contents');
add_action( 'wp_enqueue_scripts', 'add_ajax_script' );
App.js
//ajax вызов
var data = {action: 'powerpoint_folder_contents',path: datafolder};
var ajaxurl = ajax_params.ajax_url;
console.log(ajaxurl);
jQuery.post(ajaxurl, data, function(response) {
alert('Получено с сервера: ' + response);
console.log(response);
});
Если я удаляю функцию add_ajax_script() и просто использую следующее, то возвращается 0.
var ajaxurl = baseurl + 'wp-admin/admin-ajax.php';
Пожалуйста, помогите...
// AJAX запрос
var data = {
action: 'folder_contents',
path: datafolder
};
var ajaxurl = baseurl + ''; //ЧТО ЭТО?!?!
jQuery.post(ajaxurl, data, function(response) {
alert('Получено от сервера: ' + response);
console.log(response);
});
И ваш PHP-код в functions.php
//Вызывается через Ajax из приложения - выводит содержимое папки, чтобы файлы можно было скачать и сохранить локально
function folder_contents() {
$folderPath = $_POST['path'] ;
$files = array_diff(scandir($path), array('.', '..'));
print_r($files);
return $files;
die();
}
add_action('wp_ajax_folder_contents', 'folder_contents');
add_action('wp_ajax_nopriv_folder_contents', 'folder_contents');
Приведённый выше код добавляет вашу функцию как действие AJAX. Затем вы вызываете имя функции в вашем AJAX-запросе.
Смотрите https://codex.wordpress.org/Plugin_API/Action_Reference/wp_ajax_(action)

Извините, в вашем JS также нужно добавить ajaxurl для вашего сайта. Я обычно делаю это, определяя его и локализуя скрипт для доступа. Смотрите: https://codex.wordpress.org/Function_Reference/wp_localize_script

Также посмотрите здесь пример использования ajaxurl и его локализации. https://www.creare.co.uk/blog/wp/wp-localize-script-wordpress

Хорошо, у меня не получается заставить это работать. Я отредактировал свой исходный запрос выше, чтобы показать, что я пробовал, основываясь на вашем ответе

ИЛИ используйте wp_send_json($files); https://codex.wordpress.org/Function_Reference/wp_send_json

Хорошо, я изменил на wp_send_json($files); но, к сожалению, все равно получаю 0

Попробуйте: `function folder_contents() {
echo 'hello';
die(); }`
Видите ли вы слово "hello" в console.log?

Я попробовал это и получаю 0, попытался удалить всё из этой функции и всё равно получаю 0. Если я перехожу напрямую к файлу по адресу http://myweb.co.uk/wp-admin/admin-ajax.php?action=folder_contents я всё равно получаю 0.

Давайте продолжим это обсуждение в чате.

В вашем коде я вижу, что вы локализуете скрипт 'ajax-js', но сам скрипт добавлен в очередь? Несколько недель назад мне пришлось использовать wp_localize_script, и мне пришлось добавлять свой JS-скрипт в очередь внутри функции, которая вызывала wp_localize_script. Например:
add_action( 'wp_enqueue_scripts', 'google_js_script' );
function google_js_script()
{
// Добавляем JS-скрипт в очередь
wp_enqueue_script('google-js', GOOGLE_PLG_URL . 'assets/js/google-places.js', array('jquery'), true);
// Локализуем добавленный в очередь JS-скрипт
wp_localize_script( 'google-js', 'ajax_object',
array( 'ajax_url' => admin_url( 'admin-ajax.php' ), 'place' => '' ) );
}
Надеюсь, это поможет в отладке проблемы.

Согласно WP Codex, вы можете использовать глобальную переменную ajaxurl
без предварительного объявления. Другими словами, закомментируйте эту строку:
var ajaxurl = ajax_params.ajax_url;
...и проверьте, сработает ли это.

Если вы внимательно прочитаете это уведомление целиком, то также увидите следующее: "Это касается только административной части сайта. Если вы используете AJAX на стороне фронтенда, вам нужно сделать ваш JavaScript осведомлённым о URL admin-ajax.php. Рекомендуемый подход задокументирован в четвёртом примере ниже с использованием wp_localize_script()
."
