首页 > 解决方案 > 有条件地加载公共和管理代码,AJAX 在 WordPress 的两边都工作

问题描述

我正在尝试在 WordPress 插件中有条件地加载我的前端和管理区域代码,因此创建管理区域的文件和类将在管理端加载,并且需要在前端运行的文件和类将运行仅在前端,不会触及管理区域的任何内容。

我尝试使用is_admin()条件:

if (!is_admin()) {
    require_once(plugin_dir_path(dirname(__FILE__)) . 'public/class-public.php');
    $this->Public = new Public();
} else {
    require_once(plugin_dir_path(dirname(__FILE__)) . 'admin/class-admin.php');
    $this->Admin = new Admin();
}

代码加载很好,但 AJAX 在公共方面不起作用,因为 AJAX 请求绑定到其中一个wp_ajax_wp_ajax_nopriv_操作在 WP Admin 上下文中执行。所以我决定创建自己的isAdmin()函数:

public static function isAdmin() {
    $currentUrl = set_url_scheme(
        sprintf(
            'http://%s%s',
            $_SERVER['HTTP_HOST'],
            $_SERVER['REQUEST_URI']
        )
    );
    $adminUrl = strtolower(admin_url());
    $referrer  = strtolower(wp_get_referer());

    if (strpos($currentUrl, $adminUrl) === 0) {
        if (strpos($referrer, $adminUrl) === 0) {
            return true;
        } else {
            if (function_exists('wp_doing_ajax')) {
                return !wp_doing_ajax();
            } else {
                return !(defined('DOING_AJAX') && DOING_AJAX);
            }
        }
    } else {
        if (!defined('REST_REQUEST') || !REST_REQUEST) {
            return false;
        }
        return (isset($_REQUEST['context']) && $_REQUEST['context'] === 'edit');
    }
}

代码加载仍然很好,但现在 AJAX 在公共方面工作,而不是在管理方面工作。

那么,如何防止在管理区号上加载公共代码,反之亦然,AJAX 在双方都工作?

标签: phpajaxwordpress

解决方案


我还通过检查公共接口设法解决了这个问题。我创建了新函数isPublic()来检查它是否是公开的。所以这是我的最终代码:

if ($this->isPublic()) {
    require_once(plugin_dir_path(dirname(__FILE__)) . 'public/class-public.php');
    $this->Public = new Public();
} elseif ($this->isAdmin()) {
    require_once(plugin_dir_path(dirname(__FILE__)) . 'admin/class-admin.php');
    $this->Admin = new Admin();
}

这里是助手isPublic()isAdmin()函数:

public static function isAdmin() {
    if (function_exists('is_admin') && is_admin()) {
        return true;
    } else {
        if (strpos($_SERVER['REQUEST_URI'], 'wp-admin') !== false) {
            return true;
        } else {
            return false;
        }
    }
}

public static function isPublic() {
    if (function_exists('is_admin') && is_admin()) {
        if (function_exists('wp_doing_ajax') && wp_doing_ajax()) {
            return true;
        } else {
            return false;
        }
    } else {
        if (strpos($_SERVER['REQUEST_URI'], 'wp-admin') !== false) {
            if (strpos($_SERVER['REQUEST_URI'], 'admin-ajax.php') !== false) {
                return true;
            } else {
                return false;
            }
        } else {
            return true;
        }
    }
}

推荐阅读