플러그인 없이 워드프레스 공사 중 페이지 만들기

워드프레스 관리페이지에서 코어 또는 플러그인을 업데이트할 때 사이트(프런트)에 접속하면 다음 그림의 메시지를 볼 수 있습니다. .maintenance 파일에 의한 결과입니다.

예약되어 있는 유지보수를 위해 잠시 사용할 수 없습니다. 잠시 후에 다시 확인하세요.

가능성은 작지만, 업데이트 완료 전 관리페이지를 새로 고치면 위의 그림과 같은 메시지를 보게 되거나 업데이트를 제대로 완료하지 못할 때가 있습니다. 관리페이지나 사이트에서 그림의 메시지가 계속 나온다면 .maintenance 파일을 직접 삭제하면 쉽게 해결할 수 있습니다.

삭제하지 않았을 때 .maintenance 파일에 설정된 시각이 지나면 사이트 접근에 문제는 없지만, 관리페이지에서 ‘업데이트를 완료하지 못했다’는 메시지가 계속 나오므로 직접 이 파일을 삭제해야 합니다.

.maintenance

이 파일은 워드프레스가 업데이트 등의 유지 상태일 때 자동으로 생성한 후 삭제하도록 정의되어 있으며, 워드프레스 설치 루트 경로에 생성합니다. 보통 wp-config.php, wp-settings.php 파일이 있는 경로입니다.

이 파일을 사용하여 직접 유지 관리 상태를 구성하려면 다음 코드만 추가한 후 관리페이지나 사이트를 보면 됩니다.

// .maintenance 이름의 파일을 워드프레스 루트에 만들고 아래 코드 추가
<?php
$upgrading = time(); // 반드시 추가

$upgrading 전역 변수로 이 파일을 만든 시각을 포함합니다. 파일이 10분 이내에 생성된 경우, 쉽게 말해 10분 동안 유지 관리 상태를 유지하는 것이 기본입니다.

그런데, 이 파일은 워드프레스가 필요할 때 자동으로 생성하고 삭제하므로 사용자가 사이트를 새로 구성하거나 개편 중일 때 사용한다면 관리페이지를 포함한 사이트 전체 접근이 불가하므로 적절한 방법이 아닙니다. 추가 조건이 필요하며 다양한 방법이 있지만, 간단하게 특정 아이피만 관리자페이지 및 사이트에 접근할 수 있도록 정의한다면 다음 코드로 처리할 수 있습니다.

<?php
$my_ip = '1.23.456.789'; // 제외할 아이피
if ( $my_ip && $_SERVER['REMOTE_ADDR'] != $my_ip ) {
    $upgrading = time(); // 반드시 추가
}

특정 아이피를 제외하여 유지 관리 상태에서 사이트를 개편할 때도 기본 설정된 10분의 시간이 경과하면 유지 관리 상태가 해제되므로 전역 변수의 값을 변경해야 원하는 시각까지 유지 관리 상태를 유지할 수 있습니다. 우선, 기본 설정된 10분의 시간 계산은 wp_maintenance() 함수에 다음 코드로 정의되어 있습니다.

/* https://developer.wordpress.org/reference/functions/wp_maintenance/ */
// If the $upgrading timestamp is older than 10 minutes, don't die.
    if ( ( time() - $upgrading ) >= 600 )
        return;

위 코드의 3번 줄은 ‘시간의 차이’를 10분(600)과 비교하는 것으로 계산 결과를 음수나 양수로 생각하지 않아야 혼동하지 않습니다. 또, 3번 줄은 ‘유지 관리 상태 해제 시각 기준은 10분’으로만 이해하면 되며, 머리나 마음으로 계산할 필요가 전혀 없고 하지 말기를 바랍니다.

추가로, 워드프레스가 자동으로 .maintenance 파일을 생성하여 사이트가 유지 관리 상태일 때는 관리페이지에서 특정 파일을 업데이트할 경우이며, 자동으로 삭제하므로 사이트(브라우저)를 새로 고치면 경과 시간이 초기화된다는 것을 위의 코드 3번 줄에서 알 수 있습니다.

이 포스트에서는 사이트 운영자가 현재 운영 중인 사이트에서 지정한 시각에 유지 관리 상태가 해제되는지 확인하기 위해 먼저, 다음처럼 조건을 변경합니다. 아니라면 기능을 확인하기 어려운데, 아직 정식으로 운영하는 사이트가 아니라면 다음 코드에서 2, 3, 5번 줄은 삭제하면 됩니다.

<?php
$my_ip = '1.23.456.789'; // 유지 관리 상태 노출 지정 아이피
if ( $my_ip && $_SERVER['REMOTE_ADDR'] == $my_ip ) {
    $upgrading = time(); // 반드시 추가
}

만약, 원하는 유지 관리 상태 해제 시각이 2018년 1월 1일 01시 00분이라면 $upgrading 전역 변수의 값은 2018년 1월 1일 12시 50분으로 지정해야 합니다. 이때 설정값은 Unix Timestamp 기준이므로 변환하여 지정해야 합니다. 다음 링크에서 시각 형식 변환을 쉽게 할 수 있습니다.

Epoch & Unix Timestamp Conversion Tools

<?php
$my_ip = '1.23.456.789'; // 유지 관리 상태 노출 지정 아이피
if ( $my_ip && $_SERVER['REMOTE_ADDR'] == $my_ip ) {
    $upgrading = 1514778600 // 2018년 1월 1일 12시 50분
}

10분 기준으로 지정하였으므로 기다리는 시간이 지겨울 수 있습니다. 빨리 확인하기 위해 다음의 기준으로 진행해봅니다.

  • 원하는 유지 관리 상태 해제 시각 : 각자의 현재 시각에서 2분 후. (예) 현재 2018년 1월 1일 15시 22분
  • 변수에 지정할 시각 : 현재 시각에서 12분 이전의 시각. (예) 2018년 1월 1일 15시 10분

Unix Timestamp 변환 값으로 다음처럼 정의하면 됩니다.

<?php
$my_ip = '1.23.456.789'; // 유지 관리 상태 노출 지정 아이피
if ( $my_ip && $_SERVER['REMOTE_ADDR'] == $my_ip ) {
    $upgrading = 1514787000 // 2018년 1월 1일 15시 10분
}

위의 코드로 정의하고 저장한 후 사이트를 빠르게 새로 고치고 유지 관리 상태 확인 후, 2분 정도 후에 다시 사이트를 새로 고치면 유지 관리 상태가 해제되는 것을 확인할 수 있습니다.

2가지 시각 기준으로 예를 든 것은 처음 경험하는 사용자가 혼동할 확률이 크기 때문인데, 종합하면 하나의 기준밖에 없습니다.

유지 관리 상태 해제를 원하는 미래의 시각에서 10분 이전의 시각을 Unix Timestamp 기준으로 변환 후 $upgrading 전역 변수의 값으로 설정

미래의 시각이 한 달, 일 년 후 어느 날이든 상관이 없습니다. 다시 특정 아이피를 제외하고 미래의 어느날까지 사이트를 유지 관리 상태로 유지하려면 다음의 코드로 정의할 수 있습니다.

<?php
// 2018년 8월 13일 06시 00분에 사이트 공개 기준 (유지 관리 상태 해제)
$my_ip = '1.23.456.789'; // 제외 아이피
if ( $my_ip && $_SERVER['REMOTE_ADDR'] != $my_ip ) {
    $upgrading = 1534107000 // 2018년 8월 13일 05시 50분
}

몇 가지 시각을 설정하여 테스트하면 금방 이해할 수 있습니다.

유지 관리 상태 안내 페이지에 이미지나 스타일을 적용하여 조금 더 풍부한 정보를 제공할 수 있습니다. 다음 코드 전체를 .maintenance 파일에 붙여넣고 저장 후 사이트를 확인해보세요.

<?php
$my_ip = '1.23.456.789'; // 유지 관리 적용 아이피 (자신의 아이피)
if ( $my_ip && $_SERVER['REMOTE_ADDR'] == $my_ip ) {
    $upgrading = time(); // 반드시 추가
    
    echo '<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>공사 중 - 워드프레스 사이트</title>
    <style type="text/css" media="screen">
        h1 {font-size: 5rem}
        h1, p {text-align:center}
        .message {font-size: 3rem}
        
    </style>
</head>
<body>
    <h1>미안합니다. 지금 너무 바빠서....</h1>
    <div>
        <p class="message">감동으로 보답하겠습니다. 조금 더 기다리세요.</p>
        <p><em>원하는 마크업으로 다른 정보도 제공하면 됩니다.</em></p>
        <p><em>스타일도 정의할 수 있습니다.</em></p>
    </div>
</body>
</html>';
}

사이트 결과 화면이 다음과 같은데, 기본으로 제공하는 유지 관리 안내 메시지와 추가한 텍스트가 함께 출력됩니다.

.maintenance 파일에 정보를 추가한 경우

이때, 크롬 브라우저로 HTTP 헤더 정보를 확인하면 다음 그림과 같습니다.

HTTP 헤더 정보

상태 코드 ‘503 (Service Unavailable)’과 서비스가 재개될 예측 시간(시각) ‘다운 타임(retry-after) 600’을 제공하여 검색 봇에게 서비스 상태와 인덱싱 시기를 알리고 있습니다.

maintenance.php

유지 관리 상태에 나오는 ‘기본 출력 안내 메시지’를 노출하지 않고, 상태 코드와 다운 타임 등의 정보를 변경하려면 다음 파일을 만들면 됩니다.

wp-content/maintenance.php

‘wp-content’ 경로에 maintenance.php 파일이 있어야 하며, 다음 코드로 정의할 수 있습니다.

<?php
$protocol = $_SERVER['SERVER_PROTOCOL'];
if ( 'HTTP/1.1' != $protocol && 'HTTP/1.0' != $protocol )
    $protocol = 'HTTP/1.0';
// 검색 봇을 위해 에러 상태, 지속 시간을 설정
header( "$protocol 503 Service Unavailable", true, 503 );
header( 'Content-Type: text/html; charset=utf-8' );
header( 'Retry-After: 600' ); // 10분
// header( 'Retry-After: Wed, 21 Oct 2018 07:28:00 GMT' ); // 특정 시각 지정
?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>공사 중 - 워드프레스 사이트</title>
    <style type="text/css" media="screen">
        h1 {font-size: 5rem}
        h1, p {text-align:center}
        .message {font-size: 3rem}
        
    </style>
</head>
<body>
    <h1>미안합니다. 지금 너무 바빠서....</h1>
    <div>
        <p class="message">감동으로 보답하겠습니다. 조금 더 기다리세요.</p>
        <p><em>원하는 마크업으로 다른 정보도 제공하면 됩니다.</em></p>
        <p><em>스타일도 정의할 수 있습니다.</em></p>
    </div>
</body>
</html>
<?php
    die(); // 반드시 유지

위 코드는 wp_maintenance 함수에 정의된 코드 일부를 기준으로 작성된 것이며, 대부분 이 패턴에서 가감하여 사용하므로 참고하면 편리합니다.
maintenance.php 파일을 사용할 때도 .maintenance 파일은 반드시 존재해야 하며, 다음처럼 간단하게 정의하면 됩니다.

<?php
$my_ip = '1.23.456.789'; // 유지 관리 적용 아이피
if ( $my_ip && $_SERVER['REMOTE_ADDR'] == $my_ip ) {
    $upgrading = time(); // 반드시 추가, 시각은 원하는 것으로
}

.maintenance, maintenance.php 파일 2개를 모두 사용한다면 다음처럼 정리할 수 있습니다.

  • .maintenance 파일의 $upgrading 전역 변수의 시각 설정
  • $upgrading 전역 변수의 시각은 유지 관리 상태 해제 시각에서 10분 전 시각의 Unix Timestamp 시각
  • .maintenacne 파일에 유지 관리 상태 지정 또는 제외 아이피 등의 조건 사용 가능
  • maintenance.php 파일에 HTTP 헤더 (status, retry-after) 정보 설정
  • maintenance.php 파일의 retry-after 정보는 .maintenance 파일에서 지정한 시각으로 입력
  • maintenance.php 파일에 HTML, CSS, PHP 등의 언어로 유지 관리 정보 정의
  • 수동으로 생성한 .maintenance, maintenance.php 파일은 사용하지 않을 때 직접 삭제

.maintenance 파일에 아이피 조건 등을 추가하고, 시각을 설정하여 직접 경험하면 쉽게 이해할 수 있으며, maintenance.php 파일을 사용할 때도 .maintenance 파일은 반드시 있어야 한다는 것 기억하면 됩니다.

Must Use Plugins, Drop-ins

유지 관리 상태를 위해 추가한 maintenance.php 파일처럼 특정 기능을 대체하며 특정 위치에 존재할 때 사이트에 적용되는 일종의 플러그인(파일)을 ‘Drop-ins’라고 부릅니다.

Must Use Plugins(MUP)과 비슷하지만, 워드프레스 헤더를 호출하지 않기에 워드프레스 함수 등을 바로 사용할 수 없습니다. MUP와 마찬가지로 관리페이지에서 활성, 비활성이 기본으로 불가하지만, 관리페이지 플러그인 목록 페이지에 필터할 수 있는 링크가 자동으로 생성됩니다.

워드프레스 Drop-ins

Drop-ins 파일 몇 가지 나열하면 다음과 같습니다.

  • advanced-cache.php
  • db.php
  • db-error.php
  • install.php
  • maintenance.php
  • object-cache.php
  • sunrise.php

필요하다면 검색하여 더 많은 정보를 찾아보세요.

정리

지금까지 안내한 내용 외에도 워드프레스 페이지 템플릿과 워드프레스 리디렉트 관련 함수를 이용하여 특정 아이피나 사용자가 아니면 다른 페이지로 이동하도록 정의하여 사이트가 유지 관리 상태임을 알리는 등, 여러 방법이 있습니다.

보통 ‘공사 중 페이지’로 부르는 유지 관리 상태 안내 페이지를 설치형 플러그인을 사용하여 만들면 간편하지만, 사이트를 개편하거나 처음 구성할 때 특정 플러그인의 간섭을 최소화할 필요가 있으므로 설치형 플러그인보다 포스트에서 안내한 방법을 사용하면 조금 더 유리할 것입니다.

댓글 8

  1. 좋은 정보… 지식 나눔 해주셔서 감사합니다.

    블로그나 출판하신 책에 있는 내용들이 하나하나 피가 되고 살이 되네요. ^^

    2018년 새해 복 많이 받으시고, 작년보다 더 나은 한해가 되시기를 기원 드리겠습니다.

    1. 아바타 아주 멋지네요. 인상적입니다.
      랭커님 반갑습니다. 올 해 승승장구 기원합니다.^^

    2. 앗! 감사합니다. ^^

      그런데, 댓글 폼 아래에 달린 “댓글/새글 알림 이메일 받기”를 체크했는데도… 이메일이 안 오네요. ㅠㅠ

    3. “글/새글 알림 이메일 받기”는 Jetpack 기능 중에 하나인데, 처음인지 매번인지 기억이 나지 않지만, 체크하고 나면 Confirm 메일이 왔던 것 같습니다.

      충분히 알고 계실 내용인데, 그래도 혹시 모르니 메일 확인해보세요. 저도 역시 따로 알아보겠습니다.

    4. 제가 알기로는 매번인 것 같은데요…

      이곳 블로그에서 발행되는 글을 구독하고 싶어서 “댓글/새글 알림 이메일 받기”를 체크했는데 이메일이 안 옵니다. (gmail 을 사용하고 있고, 스팸함도 다 확인했는데도요)

      여기 블로그에서 새 글이 발행, 또는 제 글에 답글이 달려도 이메일이 안 옵니다. ㅠㅠ

      덧) 쿠키는 남아있어서인지… 여기 블로그에 접속하면 “댓글/새글 알림 이메일 받기” 에 자동으로 체크는 되어 있습니다.

    5. 2개의 다른 메일과 아이피로 테스트를 거쳤습니다. 다음 글로 간략하게 정보를 적었는데, 나중에 한 번 보세요.

      워드프레스 블로그나 사이트의 Jetpack 새 댓글 및 새 소식 알림 받기 후 메일이 안 올 때

      우선, 다음 링크로 접근하면 구독 관리 박스에 이메일 입력 필드가 나옵니다. 이메일을 입력하고 버튼을 클릭하면 메일이 옵니다. 메일로온 링크를 클릭하여 정보를 확인하세요.

      https://subscribe.wordpress.com/?locale=ko

      WordPress.com 계정으로 브라우저에 로그인된 상태라면 바로 구독 사이트 목록과 댓글 포스트 목록이 나옵니다.

      여기에 이 블로그나 댓글 알림 받기 위한 포스트 목록이 있는지 확인하시고, 원하지 않는 사이트나 포스트는 구독 취소하시면 됩니다.

      최초에 댓글 또는 새 글 알림 이메일 받기 옵션 선택하고 댓글을 작성했을 때 이메일로 수신된 메일의 링크를 클릭하여 승인하지 않으면 구독이 불가하므로 한 번 더 해보세요.

      사이트 오른쪽의 위젯 ‘소식 알림 받기’도 댓글 입력 폼 아래 ‘새 글 알림 이메일 받기’와 같으므로 한 번 요청하셔서 결과를 보면 좋겠습니다.

  2. 아.. 세세하게 다시 확인해주셔서 감사합니다.

    알려주신대로 저도 다시 테스트/확인해 보겠습니다. ^^

    1. 이제 잘 되네요. 메일이 제대로 오는 것 같아요. 감사합니다. 꾸벅