在IMO中,插件所需的工作更少,更适合特定情况。
<?php
/*
Plugin Name: Disalbe Frontend
Description: Disable the frontend interface of the website, leave only CMS and REST API
Version: 1.0
*/
add_action(\'init\', \'redirect_to_backend\');
function redirect_to_backend() {
if(
!is_admin() &&
!is_wplogin() &&
!is_rest()
) {
wp_redirect(site_url(\'wp-admin\'));
exit();
}
}
if (!function_exists(\'is_rest\')) {
/**
* Checks if the current request is a WP REST API request.
*
* Case #1: After WP_REST_Request initialisation
* Case #2: Support "plain" permalink settings
* Case #3: URL Path begins with wp-json/ (your REST prefix)
* Also supports WP installations in subfolders
*
* @returns boolean
* @author matzeeable
*/
function is_rest() {
$prefix = rest_get_url_prefix( );
if (defined(\'REST_REQUEST\') && REST_REQUEST // (#1)
|| isset($_GET[\'rest_route\']) // (#2)
&& strpos( trim( $_GET[\'rest_route\'], \'\\\\/\' ), $prefix , 0 ) === 0)
return true;
// (#3)
$rest_url = wp_parse_url( site_url( $prefix ) );
$current_url = wp_parse_url( add_query_arg( array( ) ) );
return strpos( $current_url[\'path\'], $rest_url[\'path\'], 0 ) === 0;
}
}
function is_wplogin(){
$ABSPATH_MY = str_replace(array(\'\\\\\',\'/\'), DIRECTORY_SEPARATOR, ABSPATH);
return ((in_array($ABSPATH_MY.\'wp-login.php\', get_included_files()) || in_array($ABSPATH_MY.\'wp-register.php\', get_included_files()) ) || (isset($_GLOBALS[\'pagenow\']) && $GLOBALS[\'pagenow\'] === \'wp-login.php\') || $_SERVER[\'PHP_SELF\']== \'/wp-login.php\');
}