有条件地加载公共和管理代码,并在两端都使用AJAX

时间:2020-03-03 作者:DaftPlug

我正在尝试有条件地加载我的前端和管理区号,因此创建管理区的文件和类将在管理端加载,而需要在前端运行的文件和类将只在前端运行,不会接触管理区的任何内容。

我试着用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在双方都工作,我如何防止在管理区号上加载公共代码,反之亦然?

1 个回复
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;
        }
    }
}

相关推荐

AJAX and custom pages

我有一个自定义页面,我正在使用该页面,用户可以转录存档文档并将其上载到关系数据库(用于历史研究)。我目前正在尝试添加一个功能,以便他们可以选择他们正在转录的报告的照片(已上载到媒体库),以便在研究人员查看报告时显示。我跟着https://dobsondev.com/2015/01/23/using-the-wordpress-media-uploader/ 本教程几乎完全复制了代码,除了使用https://www.smashingmagazine.com/2011/10/how-to-use-ajax-i