Как я могу получить доступ к функциям WordPress в моем PHP-скрипте, называемом ajax - PullRequest
0 голосов
/ 23 апреля 2019

Я пытаюсь вызвать функцию WordPress (get_avatar ($ id)) из сценария php, доступ к которому осуществляется при вызове по ссылке ajax из файла javascript, поставленного в очередь.(Сказав, что эта нагрузка уже заставляет мою голову болеть).

В качестве примера я создал плагин для WordPress: hmm-test.Это реализовано в hmm-test.php.Этот сценарий ставит в очередь файл JavaScript: test.js.В js у меня есть вызов xhttprequest, который передает POSTS в hmm-test.php, который разветвляется в тесте для переменной POST.

Когда hmm-test.php вызывается как GET, например, с использованием WordPressURL для страницы, где встроен короткий код, я могу вызывать функции WordPress.Из ветви POST я хочу иметь возможность вызывать собственные функции WordPress и возвращать их как часть полезной нагрузки JSON.

Поэтому мой вопрос: могу ли я сделать боковую ветвь 'POST' для hmm-test.php 'wordpress-aware', чтобы я мог вызывать из него нативные функции WP?

Я застрял - не уверен, что еще попробовать.Я пытался создать конечную точку REST для вызова через URL Ajax на ранней стадии, но продолжал сталкиваться с проблемами аутентификации.Если это сработает, я могу потратить время на проработку, но я нашел биты OAuth хитрыми.Я работал на что-то другое и потерял это.Если есть способ сделать это с помощью простого POST, этого вполне достаточно для моего подтверждения концепции.

Вот PHP-скрипт плагина и полный код javascript:

<?php
/*
Plugin Name:  HMM Test
*/

if (strlen($_POST['action'])) {

        $rv["payload"] = get_avatar(108);
        $rv["payload"] = "This is the payload message";
        $rv["status"]  = 'SUCCESS';
        echo json_encode($rv);

} else {

        function hmm_test_enqueue_scripts() {

                wp_register_script( 'test-js', plugins_url( '/js/test.js', __FILE__ ), '', '1.0', all );

        }

        add_action( 'wp_enqueue_scripts', 'hmm_test_enqueue_scripts' );

        /* ***************************************************************************
         * This is the main page
         * ************************************************************************* */

        add_shortcode( 'test-contents', 'my_test_contents' );

        function my_test_contents() {

                wp_enqueue_script( 'test-js' );

                wp_localize_script('test-js', 'wpVariables', array(
                        'pluginsUrl' => plugins_url(),
                        'pluginDir' => trailingslashit( dirname( plugin_basename( __FILE__ ) ) ),
                        'userID' => 37
                ));

                echo "Wordpress functions test: get_avatar()";
                echo get_avatar( 37 );          # -- This works from the plugin script

                echo '<button type="button" class="test-button">Click to crash</button>';
        }
}

И JS:

(function () {
        var c = document.getElementsByClassName('test-button');

        for (var i = 0; i < c.length; i++ ) {
                c[i].addEventListener('click', doTest, false);
        }
})();

function doTest() {

        console.log("In doTest()");

        var xhttp = new XMLHttpRequest();
        xhttp.onreadystatechange = function() {
                if (this.readyState == 4 && this.status == 200) {
                        console.log("responseText: " + this.responseText);
                }
        };

        var ajaxUrl = wpVariables.pluginsUrl + '/' + wpVariables.pluginDir + 'hmm-test.php';
        var userid  = wpVariables.userID;

        xhttp.open("POST", ajaxUrl, true);
        xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        let arg = "action=update" + "&userid=" + userid;
console.log("Calling URL:" + ajaxUrl + " with arg: " + arg);
        xhttp.send(arg);
}

Когда я помещаю шорткод [hmm-test] на страницу Wordpress, он загружается нормально, и я получаю ожидаемый «Тест функций Wordpress ...», правильное изображение аватарадля пользователя 37 (жестко запрограммирован в этом примере) и кнопка, которую нужно нажать, чтобы вызвать сбои (пока!).

Нажав кнопку, я вижу, что это окно консоли:

В doTest () test.js? Ver = 1.0: 40 URL для вызова: https://not -my-real-url.com / wp-content / plugins / hmm-test / hmm-test.php с arg: action = update & userid = 37 test.js? Ver = 1.0: 30 responseText: Неустранимая ошибка : вызов неопределенной функции get_avatar () в / home4 / mifydnu / public_html / wp-content / plugins / hmm-test / hmm-test.php on line 8

Очевидно, и, возможно, неудивительно, что ничего не известно о функции get_avatar ().Это имеет смысл - я просто вызываю PHP-скрипт через URL.Не имеет значения, что скрипт находится где-то в каталоге Wordpress.Но я в тупик, как обойти это.

Спасибо за любой совет!

Ответы [ 2 ]

0 голосов
/ 23 апреля 2019

Поскольку вы отправляете запрос POST непосредственно в ваш PHP-скрипт - вместо использования AJAX API или REST API - вы в основном обходите все ядро ​​WordPress, и поэтому ни одна из его функций не доступна для скрипта следовательно, вы видите ошибку «Вызов неопределенной функции».

Вот ваш рефакторинг кода, поэтому вместо него используется AJAX API , поэтому все функции WP доступны для вашего скрипта:

Основной файл плагина:

<?php
/**
 * Plugin Name:  HMM Test
 */

/**
 * Registers scripts and stylesheets.
 */
function hmm_test_enqueue_scripts() {
    wp_register_script( 'test-js', plugins_url( '/js/test.js', __FILE__ ), array(), '1.0', true );
    wp_localize_script('test-js', 'wpVariables', array(
        'ajaxurl' => admin_url( 'admin-ajax.php' ),
        'userID' => 37
    ));
    wp_enqueue_script( 'test-js' );
}
add_action( 'wp_enqueue_scripts', 'hmm_test_enqueue_scripts' );

/**
 * Registers the shortcode.
 */
function my_test_contents() {
    echo "Wordpress functions test: get_avatar()";
    echo get_avatar( 37 );          # -- This works from the plugin script

    echo '<button type="button" class="test-button">Click to crash</button>';
}
add_shortcode( 'test-contents', 'my_test_contents' );

/**
 * Handles the AJAX request.
 */
function my_action() {
    $rv["payload"] = get_avatar(108);
    $rv["payload"] = "This is the payload message";
    $rv["status"]  = 'SUCCESS';
    echo json_encode($rv);

    wp_die(); // this is required to terminate immediately and return a proper response
}
add_action( 'wp_ajax_my_action', 'my_action' );

test.js теперь становится:

(function () {
    var c = document.getElementsByClassName('test-button');

    for (var i = 0; i < c.length; i++ ) {
            c[i].addEventListener('click', doTest, false);
    }
})();

function doTest() {

    console.log("In doTest()");

    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {
            console.log("responseText: " + this.responseText);
        }
    };

    var ajaxUrl = wpVariables.ajaxurl;
    var userid  = wpVariables.userID;

    xhttp.open("POST", ajaxUrl, true);
    xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

    // The "action" parameter is the name of the (pardon the redundancy) "action" 
    // registered with "wp_ajax_" (see main plugin file for reference)
    //
    // You can name this whatever you want but make sure it's unique
    // to your plugin to avoid name collisions.
    let arg = "action=my_action" + "&userid=" + userid;

    console.log("Calling URL:" + ajaxUrl + " with arg: " + arg);

    xhttp.send(arg);

}

Важно: Нет никаких проверок (одноразовых значений безопасности, проверок переменных $ _POST и т. Д.), Которые вы должны добавить в свой код, чтобы сделать его более надежным / безопасным.

0 голосов
/ 23 апреля 2019

Вам необходимо использовать ajax-скрипт Wordpress.Он включает в себя написание кода в функции и использование хуков WordPress, чтобы прикрепить их к сценарию WP ajax.См. https://codex.wordpress.org/AJAX_in_Plugins.

Большим преимуществом этого является то, что на некоторых сайтах есть настройки безопасности, которые запрещают прямой доступ к php-файлам в плагинах, что нарушит ваш AJAX, если вы не используете этот встроенный метод.Мне пришлось конвертировать действительно большой плагин, чтобы использовать этот метод после того, как наш новый плагин безопасности сломал его.Результатом стало гораздо меньше кода для меня, намного больше стабильности и лучшей производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...