我正在尝试有条件地加载我的前端和管理区号,因此创建管理区的文件和类将在管理端加载,而需要在前端运行的文件和类将只在前端运行,不会接触管理区的任何内容。
我试着用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在双方都工作,我如何防止在管理区号上加载公共代码,反之亦然?
SO网友:DaftPlug
我还通过检查公共接口来解决这个问题。我创建了新函数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;
}
}
}