WordPress Ajax URL для функции в functions.php

11 окт. 2016 г., 14:00:41
Просмотры: 80.8K
Голосов: 6

У меня есть десктопное приложение, и я использую $.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';

Пожалуйста, помогите...

0
Все ответы на вопрос 3
10
// 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)

11 окт. 2016 г. 14:09:20
Комментарии

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

Tex0gen Tex0gen
11 окт. 2016 г. 14:12:21

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

Tex0gen Tex0gen
11 окт. 2016 г. 14:14:18

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

LeeTee LeeTee
11 окт. 2016 г. 17:36:07

Вместо "return $files" используйте "echo $files".

Tex0gen Tex0gen
11 окт. 2016 г. 17:52:16

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

Tex0gen Tex0gen
11 окт. 2016 г. 17:53:35

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

LeeTee LeeTee
11 окт. 2016 г. 17:58:35

Попробуйте: `function folder_contents() {

echo 'hello';

die(); }`

Видите ли вы слово "hello" в console.log?

Tex0gen Tex0gen
11 окт. 2016 г. 18:03:25

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

LeeTee LeeTee
11 окт. 2016 г. 18:11:20

Спасибо за вашу помощь, кстати, это очень ценно :)

LeeTee LeeTee
11 окт. 2016 г. 18:11:35

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

Tex0gen Tex0gen
11 окт. 2016 г. 18:13:12
Показать остальные 5 комментариев
1

В вашем коде я вижу, что вы локализуете скрипт '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' => '' ) );
}

Надеюсь, это поможет в отладке проблемы.

11 окт. 2016 г. 23:43:00
Комментарии

JS не используется на самом сайте. Он использует JS внутри десктопного приложения.

Tex0gen Tex0gen
12 окт. 2016 г. 14:26:58
1

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

var ajaxurl = ajax_params.ajax_url;

...и проверьте, сработает ли это.

11 окт. 2016 г. 23:20:17
Комментарии

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

brett brett
26 авг. 2022 г. 20:41:14