Функция 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

https://wordpress.stackexchange.com/questions/20915/wordpress-plugin-admin-page-using-wordpress-function-in-linked-php-file

Как вызвать основные файлы заголовков 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, но вы также не должны удивляться, если некоторые вещи не работают. Что именно может сломаться, зависит от вашего окружения.

Другие вопросы по тегам