Я пытаюсь вызвать функцию 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.Но я в тупик, как обойти это.
Спасибо за любой совет!