-1

在我的自定义插件的 php 中,尝试调用核心 wordpress 函数username_exists()会引发 500 错误,我认为这是由于未定义该函数引起的。

我的代码中失败的行是:

$unres = username_exists($unt);

我已经验证这不是由 null 参数引起的问题,因为以下内容按预期工作:$unres = $unt;

我该如何解决?

我在以下所有答案和评论中尝试了所有解决方案:

'username_exists' 功能在 Wordpress 插件中不起作用

函数 username_exists() 不登录 wordpress 无法访问

WordPress 插件管理页面 - 在链接的 php 文件中使用 WordPress 功能

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 插件,不确定这是否会以任何方式覆盖核心功能名称?)

谢谢。

4

1 回答 1

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}

重申我在开头所说的,我区分调用 WordPress 函数的 PHP 代码通常需要“唤醒 WordPress”,以及调用 PHP 函数的 WordPress 代码,这意味着 WordPress “已经唤醒”。您可以通过包含来运行引导 WordPress 的 PHP 代码wp-load.php,但如果某些事情不起作用,您也不应该感到惊讶。那些可能会破坏的东西实际上取决于您的环境。

于 2020-08-25T13:09:02.563 回答