Условно загрузить publi c и код администратора с AJAX, работающими с обеих сторон на WordPress. - PullRequest
1 голос
/ 03 марта 2020

Я пытаюсь условно загрузить свой интерфейсный код и код области администрирования в плагине WordPress, поэтому файл и класс, создающий область администратора, будут загружаться на стороне администратора, а файл и класс, которые необходимо запустить на фронте, -. end будет работать только на front-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 не работал на стороне c, так как 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 работал на стороне publi c и не работал на стороне администратора.

Итак, как я могу предотвратить загрузку открытого кода c в код области администратора и наоборот, если AJAX работает с обеих сторон?

1 Ответ

0 голосов
/ 04 марта 2020

Мне удалось решить эту проблему, также проверив интерфейс publi c. Я создал новую функцию isPublic(), чтобы проверить, опубликована ли она c. Итак, вот мой окончательный код:

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;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...