Disabilitare il front-end per utilizzare WordPress solo come CMS?
Sto utilizzando il database e il back-end di WordPress per amministrare le news del sito web della mia band e tutto funziona perfettamente, tuttavia vorrei disabilitare il front-end di WordPress stesso.
Ho l'installazione di WordPress nella directory /wordpress/
e ovviamente la sezione di amministrazione si trova in /wordpress/wp-admin/
.
Qual è il modo migliore per impedire l'accesso al sito WordPress (che non è configurato) senza influenzare la sezione di amministrazione?
Al limite, potrei semplicemente reindirizzare alla homepage principale del sito (domain.com/
).

Per assicurarti che solo il front end venga reindirizzato a domain.com
, crea un tema che utilizzi la funzione PHP header().
Crea una cartella chiamata redirect o simile.
Aggiungi due file alla cartella:
style.css
eindex.php
(necessari per un tema WP valido)In
style.css
, aggiungi qualcosa del genere:/* Theme Name: Redirect Description: Reindirizza il front end verso domain.com */
In
index.php
aggiungi questo codice:<?php header( "Location: http://domain.com" ); ?>
Carica la cartella nella directory dei temi e poi attivala dall'interfaccia di amministrazione.

È divertente perché mi si è appena accesa la lampadina. Perché non creare semplicemente un tema che reindirizza! Grazie.

potrebbe essere ovvio per alcuni, ma per me ha funzionato solo quando la prima riga di index.php era <?php

Questo funziona per installazioni singole, ma quando configuri una rete multisite, non va.

Funziona per una rete multisite: https://wordpress.stackexchange.com/a/52994/112498

Mi piace questa soluzione, in questo modo puoi facilmente tornare a un tema completamente funzionante. Inoltre puoi aggiungere qualcosa come <?php wp_redirect(site_url('wp-admin'));die();
invece di exit per reindirizzare automaticamente a una risorsa specificata.

Sebbene questa sia una domanda piuttosto vecchia con una risposta già accettata, qualcuno potrebbe trovarla utile, specialmente poiché nessuna di queste soluzioni ha funzionato per me.
function redirect_to_backend() {
if( !is_admin() ) {
wp_redirect( site_url('wp-admin') );
exit();
}
}
add_action( 'init', 'redirect_to_backend' );
Il codice in sé è abbastanza esplicativo:
- esegui il controllo sull'hook 'init'
- controlla se la pagina che stiamo caricando è il front end (non wp-admin)
- reindirizza al back end (wp-admin)
Basta inserire il codice in qualsiasi plugin o nel file function.php del tema e dovrebbe funzionare immediatamente.
MODIFICA:
Se questo non funziona per te (ho avuto piccoli problemi anche con questo codice), puoi creare un nuovo tema (o un tema child) e inserire solo questo contenuto nel file header.php
:
<?php
header("Location: ".get_admin_url());
exit();

Inserisci questo nel tuo file .htaccess e elenca i percorsi che vuoi mantenere disponibili:
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, un plugin richiederebbe meno lavoro e sarebbe più appropriato per questo caso specifico.
<?php
/*
Plugin Name: Disabilita Frontend
Description: Disabilita l'interfaccia frontend del sito, lasciando solo il CMS e l'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 se la richiesta corrente è una richiesta dell'API REST di WP.
*
* Caso #1: Dopo l'inizializzazione di WP_REST_Request
* Caso #2: Supporta le impostazioni di permalink "semplice"
* Caso #3: Il percorso URL inizia con wp-json/ (il prefisso REST)
* Supporta anche installazioni WP in sottocartelle
*
* @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');
}

aggiungi questo al file .htaccess nella tua directory principale
redirect 301 /wordpress http://www.domain.com
MODIFICA: Questa è solo una soluzione rapida, potrebbero esserci soluzioni migliori. Un altro modo sarebbe aggiungere una funzione al tuo file functions.php, che viene poi richiamata in wp_head() per effettuare il reindirizzamento. Usando quel metodo potresti anche permetterti di visualizzarlo con un semplice controllo dell'IP.

Sto realizzando un sito Gatsby con GraphQL, utilizzando WordPress come CMS headless. Non mi piaceva affatto l'idea che qualcuno potesse atterrare per caso sul backend di WordPress e capire come hackerarlo, quindi ho seguito le istruzioni di @Marcin (vedi sopra), ovvero ho creato:
- una nuova cartella per il tema (l'ho chiamata turn-off-frontend come suggerito da @Marcin) e al suo interno ho inserito:
- uno style.css (utilizzando il codice predefinito di @Marcin) e un
- index.php
Dentro index.php ho seguito i suggerimenti di @dev_masta, ma li ho modificati leggermente:
- Non ho inserito il codice in header.php - non ho creato questo file - ma l'ho messo direttamente in index.php.
- Non volevo che il reindirizzamento andasse alla pagina /wp-login.php di WordPress. Piuttosto, volevo che andasse al mio sito Gatsby:
Ovviamente, questo è l'ambiente di sviluppo Gatsby e dovrà essere modificato con l'URL corretto quando il sito sarà online.
//index.php
<?php
/* Reindirizza il browser */
header("Location: http://localhost:8000");
exit;
Ho caricato il tema turn-off-frontend in wp-content/themes, l'ho attivato e ha funzionato. Quando sono andato all'URL di WordPress, sono stato reindirizzato direttamente al mio sito Gatsby. Tuttavia, quando sono tornato nell'admin di WordPress > Aspetto per modificare il menu, il link 'Menu' era scomparso!
Per risolvere questo problema, ho creato un file functions.php all'interno del tema turn-off-frontend e ho aggiunto il seguente codice (tratto dal WordPress Codex):
//functions.php
<?php
function register_my_menu() {
register_nav_menu('header-menu',__( 'Menu Header' ));
}
add_action( 'init', 'register_my_menu' );
E il menu è tornato disponibile per aggiungere pagine e post.
Spero che qualcuno trovi utile questa soluzione.

Se vuoi mantenere la tua API REST funzionante, usa questo nel tuo index.php:
<?php
/**
* Frontend dell'applicazione WordPress. Questo file non fa nulla, ma carica
* wp-blog-header.php che invece lo fa e dice a WordPress di caricare il tema.
*
* @package WordPress
*/
/**
* Dice a WordPress di caricare il tema e di mostrarlo.
*
* @var bool
*/
define( 'WP_USE_THEMES', false );
/** Carica l'ambiente WordPress e il template */
require __DIR__ . '/wp-blog-header.php';
