php - 有条件地加载公共和管理代码,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 在双方都工作?
解决方案
我还通过检查公共接口设法解决了这个问题。我创建了新函数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;
}
}
}
推荐阅读
- c# - Leetcode:添加反向链表中表示的两个数字不起作用
- angularjs - $templateCache、ng-template 和缓存问题 - angularjs
- python - 如何根据 Python 中的匹配值将信息从一个 CSV 文件添加到另一个文件?
- java - 如何从 gradle idea 插件中排除 jar
- awk - 根据列属性重复行
- xamarin - 如何滚动到 iOS 的 xamarin ui 测试中的特定元素
- django - 尝试对用户进行身份验证时出现类型错误
- javascript - 在 Javascript 中使用变量在调用查询的 cfml 标记中添加功能
- sql-server - SSIS 2014 - 列镜像
- javascript - express-validator - req.checkBody 不是函数