Функция username_exists в wordpress выдает ошибку 500 (функция не определена), несмотря на требование / включение pluggable.php и user.php
В моем настраиваемом плагине php пытаюсь вызвать основную функцию wordpress username_exists()
выдает ошибку 500, которая, я думаю, вызвана тем, что эта функция не определена.
Строка в моем коде, которая дает сбой:
$unres = username_exists($unt);
Я подтвердил, что это не проблема, вызванная нулевым аргументом, так как следующее работает должным образом: $unres = $unt;
Как это исправить?
Я перепробовал все решения в ответах и комментариях по всем следующим вопросам:
Функция username_exists не работает в плагине Wordpress
Функция username_exists() недоступна без входа в wordpress
Страница администратора плагина WordPress - использование функции WordPress в связанном файле php
Как вызвать основные файлы заголовков WordPress?
плагин wordpress -> Вызов неопределенной функции wp_get_current_user()
Я успешно добавил следующий php для включения / требования этих файлов (но это не помогло):
require realpath("../../../../../wp-includes/pluggable.php");
require realpath("../../../../../wp-includes/user.php");
require realpath("../../../../../wp-admin/includes/user.php");
Если я включу или требую следующее, это приведет к фатальной ошибке сайта:
require realpath("../../../../../wp-load.php");
Есть ли теперь какой-то другой файл ядра, который мне нужно "включить" в свой php по ссылке, кроме тех, что указаны выше (например, из-за новых версий WP, поскольку эти вопросы были написаны)? (Я использую WP v5.5).
Нужно ли контекстуализировать звонок? (например, ссылочное пространство имен, вызов как общедоступный / глобальный и т. д.?)
(Примечание: сайт также использует плагин Ultimate Member, не уверены, что это каким-либо образом переопределит имя основной функции?)
Спасибо.
1 ответ
Вместо того, чтобы запускать необработанный PHP-код, лучше всего запускать ваш код в контексте WordPress. WordPress имеет множество доступных API, и для вызова на основе JavaScript REST, вероятно, лучший выбор.
Ниже приведен действительно простой код, который регистрирует маршрут REST и проверяет предоставленный параметр на ядре. username_exists
функция. Я включил встроенные комментарии, которые должны все объяснить, но как только вы удалите их и удалите некоторые пробелы, вы увидите, что это всего лишь 20 строк кода или около того.
// Always register routes in this action
add_action(
'rest_api_init',
// My IDE is happiest when I make my functions static, but that is not a requirement
static function () {
register_rest_route(
// The shared namespace for all route in this plugin
'ed2/v1',
// The path with optional parameters for this specific route
'/username/(?P<username>.*?)',
[
// We only accept GET, but could be POST or an array of methods
'methods' => 'GET',
// The function to run
'callback' => static function (WP_REST_Request $request) {
// Our parameter was named above so we can fetch it here
$username = $request->get_param('username');
// Return an array, the API will handle turning it into a JSON response
return [
'username' => $username,
'exists' => username_exists($username),
];
},
]
);
}
);
Теперь в вашем браузере вы можете перейти к http://example.com/wp-json/ed2/v1/username/test
и он должен вернуться (если у вас нет имени пользователя test
):
{"username":"test","exists":false}
Если вы измените имя пользователя на существующее, например https://example.com/wp-json/ed2/v1/username/user@example.com
вы должны получить:
{"username":"user@example.com","exists":1}
Чтобы повторить то, что я сказал в начале, я различаю PHP-код, вызывающий функции WordPress, который обычно требует "пробуждения WordPress", и код WordPress, вызывающий функции PHP, что означает, что WordPress "уже проснулся". Вы можете запустить PHP-код, который загружает WordPress, включивwp-load.php
, но вы также не должны удивляться, если некоторые вещи не работают. Что именно может сломаться, зависит от вашего окружения.