Отключение фронтенда WordPress для использования только как CMS
Я использую базу данных WordPress и административную панель для управления новостями на сайте моей группы, и всё работает отлично, однако я хотел бы отключить фронтенд WordPress.
WordPress установлен в директории /wordpress/
, а административная часть, соответственно, находится в /wordpress/wp-admin/
.
Какой самый лучший способ ограничить доступ к неоформленному сайту WordPress, не затрагивая при этом административную часть?
В крайнем случае, я мог бы просто настроить перенаправление на основную страницу сайта (domain.com/
).
Чтобы обеспечить перенаправление только фронтенда на domain.com
, создайте тему, которая использует PHP-функцию header().
Создайте папку с названием redirect или подобным.
Добавьте в папку два файла:
style.css
иindex.php
(необходимо для валидной темы WordPress).В
style.css
добавьте следующее:/* Theme Name: Redirect Description: Перенаправляет фронтенд на domain.com */
В
index.php
добавьте этот код:<?php header( "Location: http://domain.com" ); ?>
Загрузите папку в директорию тем и активируйте её через админ-панель.

Забавно, потому что у меня только что осенило. Почему бы просто не сделать тему с редиректом! Спасибо.

может быть очевидно для некоторых, но у меня сработало только когда первой строкой в index.php было <?php

Это работает для одиночных установок, но когда вы настраиваете мультисайтовую сеть, это не срабатывает.

Это работает для мультисайтовой сети: https://wordpress.stackexchange.com/a/52994/112498

Хотя это довольно старый вопрос с уже принятым ответом, кому-то может пригодиться эта информация, особенно учитывая, что ни одно из предложенных решений у меня не сработало.
function redirect_to_backend() {
if( !is_admin() ) {
wp_redirect( site_url('wp-admin') );
exit();
}
}
add_action( 'init', 'redirect_to_backend' );
Сам код достаточно понятный:
- проверка выполняется на хуке 'init'
- проверяется, загружается ли фронтенд (не wp-admin)
- перенаправление в бэкенд (wp-admin)
Просто поместите этот код в любой плагин или файл function.php вашей темы, и он должен заработать сразу.
РЕДАКТИРОВАНИЕ:
Если это не работает у вас (у меня были небольшие проблемы даже с этим кодом), вы можете создать новую тему (или дочернюю тему) и поместить только это содержимое в файл header.php
:
<?php
header("Location: ".get_admin_url());
exit();

Поместите это в ваш файл .htaccess и укажите пути, которые должны оставаться доступными:
RewriteCond %{REQUEST_URI} !^/wp-admin
RewriteCond %{REQUEST_URI} !^/wp-includes
RewriteCond %{REQUEST_URI} !^/wp-login
RewriteCond %{REQUEST_URI} !^/wp-content/uploads
RewriteCond %{REQUEST_URI} !^/wp-content/plugins
RewriteCond %{REQUEST_URI} !^/wp-content/cache
RewriteRule (.*) http://yournewdomain.com/ [R=301,L]

IMO, плагин потребует меньше работы и больше подходит для данного конкретного случая.
<?php
/*
Plugin Name: Отключение фронтенда
Description: Отключает интерфейс фронтенда сайта, оставляя только CMS и 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')) {
/**
* Проверяет, является ли текущий запрос запросом к WP REST API.
*
* Случай #1: После инициализации WP_REST_Request
* Случай #2: Поддержка "простых" настроек постоянных ссылок
* Случай #3: URL путь начинается с wp-json/ (ваш префикс REST)
* Также поддерживает установки WP в подпапках
*
* @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');
}

Добавьте это в файл .htaccess в корневой директории вашего сайта
redirect 301 /wordpress http://www.domain.com
РЕДАКТИРОВАНО: Это действительно просто быстрое решение, могут быть и лучшие варианты. Другой способ - добавить функцию в файл functions.php, которая затем будет вызываться в wp_head() для перенаправления. Используя этот метод, вы также можете разрешить себе просмотр с помощью простой проверки IP-адреса.

Я создаю сайт на Gatsby с использованием GraphQL, где WordPress выступает в качестве headless CMS. Мне не нравилась мысль о том, что кто-то случайно может попасть в админку WordPress и попытаться взломать её, поэтому я последовал инструкциям @Marcin (см. выше), а именно:
- создал новую папку темы (я назвал её turn-off-frontend, как предложил @Marcin), внутри которой разместил:
- файл style.css (с использованием стандартного кода от @Marcin) и
- index.php
В файле index.php я воспользовался подсказками от @dev_masta, но немного их изменил:
- Я не размещал код в header.php — я не создавал этот файл — а добавил его прямо в index.php.
- Я не хотел, чтобы редирект вел на страницу WordPress /wp-login.php. Вместо этого я хотел перенаправлять на мой сайт на Gatsby:
Очевидно, что это URL для разработки Gatsby, и его нужно будет изменить на корректный, когда сайт выйдет в продакшен.
//index.php
<?php
/* Перенаправление браузера */
header("Location: http://localhost:8000");
exit;
Я загрузил тему turn-off-frontend в wp-content/themes, активировал её, и это сработало. Когда я перешёл по URL WordPress, меня сразу перенаправило на мой сайт Gatsby. Однако, когда я вернулся в админку WordPress > Внешний вид, чтобы отредактировать меню, ссылка "Меню" исчезла!
Чтобы это исправить, я создал файл functions.php внутри темы turn-off-frontend и добавил следующий код (из WordPress Codex):
//functions.php
<?php
function register_my_menu() {
register_nav_menu('header-menu',__( 'Header Menu' ));
}
add_action( 'init', 'register_my_menu' );
После этого меню снова стало доступным для добавления страниц и записей.
Надеюсь, это кому-то пригодится.

Если вам необходимо сохранить работоспособность REST API, добавьте этот код в ваш index.php:
<?php
/**
* Главный файл WordPress. Сам по себе ничего не делает, а загружает
* wp-blog-header.php, который инициализирует WordPress и загружает тему.
*
* @package WordPress
*/
/**
* Указывает WordPress загружать тему и выводить её.
*
* @var bool
*/
define( 'WP_USE_THEMES', false );
/** Загружает среду WordPress и шаблон */
require __DIR__ . '/wp-blog-header.php';
