ОК, мне было скучно, поэтому я потратил некоторое время на это сегодня:)
Очевидно, в WP есть встроенная функция, позволяющая сайту переходить в режим обслуживания. Все, что нужно, - это файл в корне установки WP, и ему должно быть присвоено имя .maintenance
- таким же образом .htaccess
файлы получают имена с начальным периодом (это обозначает файл как скрытый), и нет расширение.
Итак, создайте файл .maintenace
в корне вашей установки WP (должен быть на том же уровне, что и wp-config.php
, wp-login.php
и т. Д.). В этом файле добавьте следующее:
<?php $upgrading = time(); ?>
сообщает WP, что сайт находится в режиме обслуживания. ПРИМЕЧАНИЕ: с этим файлом в каталоге, как есть, сайт будет недоступен.
Вы можете изменить внешний вид сообщения о режиме обслуживания и даже установить таймер, чтобы сайт возвращался через определенное время. См. здесь для получения дополнительной информации.
С этим на месте, проверьте сайт, чтобы убедиться, что режим обслуживания включен. Если это так, переименуйте .maintenance
в .maintenance_off
. Это будет наше состояние по умолчанию для этого файла; он будет находиться там с именем .maintenance_off
, позволяя сайту нормально функционировать, пока вы не захотите включить режим обслуживания, когда он будет переименован в .maintenance
.
Я уже устал писать режим обслуживания, поэтому с этого момента я буду называть режим обслуживания m-m, хорошо?
Итак, теперь о сценариях;
При каждой установке WP, которую вы хотите включить и выключить, вам понадобятся 2 вещи:
- файл
.maintenance_off
, описанный выше;
- PHP-скрипт для переименования:
создайте файл с именем remote_maint.php
в корне вашей установки WP, на том же уровне, что и ваш .maintenance_off
файл. В него добавить следующее:
<?php
$p=$_GET;
/*
this is just some basic auth; not safe, not secure, but better than nothing.
Change the key to something more complicated. Though, because we're using GET,
even if it's really complicated, it's still not secure. You should really improve
this if you don't want random people putting your WP installs into maintenance mode...
*/
$key='test';
//if mode==on, use turn_on() function otherwise use turn_off() function
($p['mode']=='on')?turn_on($p):turn_off($p);
function turn_on($p){
//if the key in the request matches our key here, rename the file, otherwise set page header as unauthorized
($p['key']==$key)?rename('.maintenance_off','.maintenance'):header("HTTP/1.0 401 Unauthorized");
}
function turn_off($p){
//if the key in the request matches our key here, rename the file, otherwise set page header as unauthorized
($p['key']==$key)?rename('.maintenance','.maintenance_off'):header("HTTP/1.0 401 Unauthorized");
}
?>
ОК, как говорится в комментариях, «безопасность» небезопасна. Вы должны улучшить его ... Если это утешит вас, если кто-то получит ключ, который вы решите использовать, худшее, что он может сделать, это поместить ваш сайт в m-m.
Этот скрипт выполняет проверку запроса на странице, например:
http://site.com/remote_maint.php?mode=on&key=test
этот запрос сообщит сценарию, что режим on
, а ключ test
. Первая троичная операция увидит режим on
и вызовет функцию turn_on()
, отправив вместе с ней массив $_GET
, который был присвоен переменной $p
. Функция turn_on()
затем проверяет ключ, отправленный в запросе ($p['key']
), против ключа, установленного в верхней части скрипта ($key
); если он совпадает, он переименует .maintenance_off
в .maintenance
, фактически включив m-m. Если ключ не соответствует запросу, он устанавливает заголовок страницы на 401 Unauthorized
, см. Ниже.
С этим все на месте, время для центрального командования; код, который будет делать вызов. В своем тестировании я использовал jQuery , чтобы можно было включать и выключать m-m на нескольких сайтах с одной страницы без перезагрузки.
На другом сайте или там, где вы хотите администрировать mm, создайте страницу с именем remote_maint_admin.php
(на самом деле это не обязательно должен быть .php, может быть .html или любой другой) и добавьте следующее:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>Remote Maintenance</title>
<script src="js/jquery.js"></script>
</head>
<body>
<div id='main'>
<fieldset>
<legend>site 1</legend>
<div id='site-1' style='border:0px solid #000'>
Auth key:
<input type="text" id='key-1' size="30"/>
<input type="button" value="Turn on" onClick="change_mode('on','http://site.com/','1');" />
<input type="button" value="Turn off" onClick="change_mode('off','http://site.com/','1');" />
</div>
<br>
<div id='status-1' style='border:1px solid #ccc;color:#666'>Status</div>
</fieldset>
</div>
<script>
function change_mode(mode,url,id){
var key = $('#key-'+id).attr('value');
var url=url+'remote_maint.php?mode='+mode+'&key='+key;
$.ajax({
url:url,
type: 'GET',
complete: function(){
$('#status-'+id).html('<b>Request Completed');
},
});
}
</script>
</body>
измените http://site.com/
на ваш URL. Чтобы добавить больше сайтов, скопируйте основной div и повторите его:
<div id='main'>
<fieldset>
<legend>site 2</legend>
<div id='site-2' style='border:0px solid #000'>
Auth key:
<input type="text" id='key-2' size="30"/>
<input type="button" value="Turn on" onClick="change_mode('on','http://site2.com/','2');" />
<input type="button" value="Turn off" onClick="change_mode('off','http://site2.com/','2');" />
</div>
<br>
<div id='status-2' style='border:1px solid #ccc;color:#666'>Status</div>
</fieldset>
</div>
вот еще один счастливый маленький div здесь, чтобы управлять другим сайтом
<div id='main'>
<fieldset>
<legend>site 3</legend>
<div id='site-3' style='border:0px solid #000'>
Auth key:
<input type="text" id='key-3' size="30"/>
<input type="button" value="Turn on" onClick="change_mode('on','http://site3.com/','3');" />
<input type="button" value="Turn off" onClick="change_mode('off','http://myothersite.com/','3');" />
</div>
<br>
<div id='status-3' style='border:1px solid #ccc;color:#666'>Status</div>
</fieldset>
</div>
... и измените номер идентификатора ввода (например, id='key-1'
на id='key-2'
и номер идентификатора состояния (например, id='status-1'
до id='status-2'
и вызов javascript (например, onClick="change_mode('on','http://site.com/','1');"
до onClick="change_mode('on','http://myothersite.com/','3');"
соответственно для каждого сайт, который вы хотите добавить ...
Теперь, когда вы вводите свой ключ в текстовое поле и нажимаете «Включить» или «Выключить», js возьмет ваш ключ и режим (в зависимости от того, какую кнопку вы нажали) и отправит его на другой сервер.Если клавиша совпадает, mm будет включен или выключен, а div под кнопками обновится и сообщит, что запрос выполнен.Если клавиша не совпадает, Div под кнопками все равно скажет, что запрос выполнен, хотя мм не изменится.Я думал, что смогу обновить div статуса с помощью возвращенного кода состояния страницы, поэтому я установил заголовок на 401, если он потерпел неудачу, но из-за одной и той же политики происхождения коды состояния межсайтовых запросов всегда возвращаются как 0
,Однако, если вы используете такой инструмент, как Firebug, вы можете посмотреть консоль, чтобы увидеть, действительно ли запрос не выполнен ...
HTH