【发布时间】:2020-03-03 08:45:24
【问题描述】:
我正在尝试在 WordPress 插件中有条件地加载我的前端和管理区域代码,因此创建管理区域的文件和类将在管理端加载,并且需要在前端运行的文件和类 - end 将仅在前端运行,不会触及管理区域的任何内容。
我尝试使用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 在公共方面不起作用,因为绑定到 wp_ajax_ 或 wp_ajax_nopriv_ 操作的 AJAX 请求在 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 在双方都工作?
【问题讨论】: