¿Deshabilitar el front-end para usar WordPress solo como CMS?
Estoy usando la base de datos y el back-end de WordPress para administrar las noticias del sitio web de mi banda y todo funciona muy bien, sin embargo, me gustaría deshabilitar el front-end de WordPress.
Tengo WordPress instalado en /wordpress/
y obviamente la sección de administración está en /wordpress/wp-admin/
.
¿Cuál sería la mejor manera de restringir el acceso al sitio de WordPress que está sin configurar sin afectar la sección de administración?
En todo caso, podría simplemente redirigir a la página de inicio principal del sitio web (domain.com/
).

Para asegurarte de que solo el frontend redirija a domain.com
, crea un tema que utilice la función PHP header().
Crea una carpeta llamada redirect o algo similar.
Añade dos archivos a la carpeta:
style.css
yindex.php
(necesarios para un tema válido de WordPress).En
style.css
, añade algo como esto:/* Theme Name: Redirect Description: Redirige el frontend a domain.com */
En
index.php
añade esto:<?php header( "Location: http://domain.com" ); ?>
Sube la carpeta al directorio de temas y luego actívala desde la interfaz de administración.

Es gracioso porque de repente se me encendió la bombilla. ¿Por qué no hacer simplemente un tema que redireccione! Gracias.

puede ser obvio para algunos, pero esto solo funcionó para mí cuando la primera línea de index.php era <?php

Esto funciona para instalaciones individuales, pero cuando configuras una red multisitio, no funciona.

Esto funciona para una red multisitio: https://wordpress.stackexchange.com/a/52994/112498

Aunque esta es una pregunta bastante antigua con una respuesta ya aceptada, alguien podría encontrar esto útil, especialmente ya que ninguna de estas soluciones funcionó para mí.
function redirect_to_backend() {
if( !is_admin() ) {
wp_redirect( site_url('wp-admin') );
exit();
}
}
add_action( 'init', 'redirect_to_backend' );
El código en sí es bastante explicativo:
- ejecuta la verificación en el hook 'init'
- verifica si la página que estamos cargando es el front end (no wp-admin)
- redirige al back end (wp-admin)
Solo coloca el código en cualquier plugin o en el functions.php del tema y debería funcionar inmediatamente.
EDITADO:
Si esto no funciona para ti (tuve problemas menores incluso con este código), puedes crear un nuevo tema (o un tema hijo) y colocar solo este contenido dentro del archivo header.php
:
<?php
header("Location: ".get_admin_url());
exit();

Coloca esto en tu archivo .htaccess y lista las rutas que deseas mantener disponibles:
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://tunuevodominio.com/ [R=301,L]

En mi opinión, un plugin requeriría menos trabajo y es más apropiado para este caso específico.
<?php
/*
Plugin Name: Desactivar Frontend
Description: Deshabilita la interfaz frontal del sitio web, dejando solo el CMS y la API REST
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')) {
/**
* Verifica si la solicitud actual es una petición a la API REST de WordPress.
*
* Caso #1: Después de la inicialización de WP_REST_Request
* Caso #2: Soporta ajustes de enlaces permanentes "simples"
* Caso #3: La ruta URL comienza con wp-json/ (tu prefijo REST)
* También soporta instalaciones de WP en subdirectorios
*
* @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');
}

agrega esto al archivo .htaccess en tu directorio raíz
redirect 301 /wordpress http://www.domain.com
EDITADO: Esto es realmente una solución rápida, podría haber mejores alternativas. Otra forma sería agregar una función a tu archivo functions.php que luego se llame en wp_head() para redirigir de esa manera. Usando ese método también podrías permitirte verlo con una simple verificación de IP.

Estoy construyendo un sitio con Gatsby y GraphQL, usando WordPress como CMS headless. Realmente no me gustaba la idea de que alguien llegara por casualidad al backend de WordPress y descubriera cómo colarse, así que seguí las instrucciones de @Marcin (ver arriba), es decir, creé:
- una nueva carpeta de tema (la llamé turn-off-frontend como @Marcin) y dentro coloqué:
- un style.css (usando el código predeterminado de @Marcin) y un
- index.php
Dentro de index.php seguí las sugerencias de @dev_masta, pero las modifiqué ligeramente:
- No puse el código dentro de header.php - no creé este archivo - sino en index.php.
- No quería que la redirección fuera al /wp-login.php de WordPress. Preferí que fuera a mi sitio Gatsby:
Obviamente, este es el entorno de desarrollo de Gatsby y deberá cambiarse a la URL correcta cuando el sitio esté en vivo.
//index.php
<?php
/* Redirigir navegador */
header("Location: http://localhost:8000");
exit;
Subí el tema turn-off-frontend a wp-content/themes y lo activé, y funcionó. Cuando fui a mi URL de WordPress, me redirigió directamente a mi sitio Gatsby. Sin embargo, cuando volví al administrador de WordPress > Apariencia para editar el menú, ¡el enlace 'Menús' había desaparecido!
Para solucionarlo, creé un archivo functions.php dentro del tema turn-off-frontend y agregué el siguiente código (del Wordpress Codex):
//functions.php
<?php
function register_my_menu() {
register_nav_menu('header-menu',__( 'Header Menu' ));
}
add_action( 'init', 'register_my_menu' );
Y el menú estuvo disponible nuevamente para agregar páginas y publicaciones.
Espero que alguien encuentre esto útil.

Si deseas mantener tu API REST funcionando utiliza esto en tu index.php:
<?php
/**
* Frontend de la aplicación WordPress. Este archivo no hace nada, pero carga
* wp-blog-header.php que sí lo hace y le indica a WordPress que cargue el tema.
*
* @package WordPress
*/
/**
* Indica a WordPress que cargue el tema de WordPress y lo muestre.
*
* @var bool
*/
define( 'WP_USE_THEMES', false );
/** Carga el Entorno y la Plantilla de WordPress */
require __DIR__ . '/wp-blog-header.php';
