방문자를 임시 유지 보수 페이지로 리디렉션


13

유지 관리 중에 방문자가 내 사이트의 깨진 버전을 보지 못하게하고 업데이트에 대한 정보를 제공하기 위해 자동으로 임시 유지 관리 페이지로 리디렉션하고 싶습니다. URL을 하드 코딩하지 않고도 모든 사이트에서 사용할 수있는 휴대용 솔루션을 찾고 있습니다.

로그인 한 관리자 (또는 다른 사용자 선택 수준)는 백엔드 및 프론트 엔드에 대한 전체 액세스 권한을 가져야합니다. 이 기능을 제공하는 플러그인이 많이 있지만 코드 전용 솔루션을 찾고 있습니다.


플러그인에서 코드를 복사 하시겠습니까?
Mark Kaplun

왜 바퀴를 재발 명합니까? 플러그인을 사용하십시오. 특히, 제한된 사이트 액세스.
vancoder

2
내 사용자 지정 테마에 가능한 한 적은 플러그인을 사용하려고합니다. "더 적을
수록

답변:


24

WordPress에는 유지 관리 모드 처리를위한 기능이 내장되어 있습니다.

플러그인 또는 WP 대시 보드에서 WordPress 코어를 업그레이드 할 때 WordPress는 유지 관리 모드로 들어갑니다 maintenance.php. 컨텐츠 폴더 (일반적으로 /wp-content) 에있는 이름의 파일을로드하려고 시도하고 해당 파일이없는 경우 WP는 기본 메시지를 표시합니다.

이 파일을 사용하면 수동 트리거 유지 관리 및 WordPress 처리 유지 관리에 일관된 방식으로 파일을 사용하는 것이 좋습니다.

어떻게

  1. 우선 maintenance.php파일을 작성하고 원하는 내용을 저장하십시오. 스타일링을 위해서는 <style>태그를 사용하여 파일 자체에 CSS를 넣는 것이 좋습니다 . 일반적으로 이것은 좋은 조언은 아니지만이 경우 테마가로드되지 않은 경우 (및 테마가 업그레이드되어 신뢰할 수없는 경우) WordPress 처리 유지 관리 모드에서 파일을 사용할 수 있습니다.

  2. 컨텐츠 폴더에 방금 생성 한 파일을 저장하십시오 (보통 /wp-content).

  3. 당신의 functions.php넣어에서 :

    add_action( 'wp_loaded', function() {
        global $pagenow;
        if(
            defined( 'IN_MAINTENANCE' )
            && IN_MAINTENANCE
            && $pagenow !== 'wp-login.php'
            && ! is_user_logged_in()
        ) {
            header( 'HTTP/1.1 Service Unavailable', true, 503 );
            header( 'Content-Type: text/html; charset=utf-8' );
            header( 'Retry-After: 3600' );
            if ( file_exists( WP_CONTENT_DIR . '/maintenance.php' ) ) {
                require_once( WP_CONTENT_DIR . '/maintenance.php' );
            }
            die();
        }
    });
    

    이 코드는 상수를 확인하고 (다음 포인트 참조) 사용자가 로그인하지 않은 경우 포인트 # 1에서 생성 된 파일을로드하고 종료합니다.

    특정 기능을 가진 사용자 만 허용하려면 current_user_can('capability_to_allow')대신을 사용하십시오 is_user_logged_in(). 자세한 내용은 코덱 을 참조하십시오 .

    maintenance.php로그인 페이지 링크에 추가 할 수 있습니다 . 이 방법으로 로그인하지 않은 사용자는 주소 표시 줄에 로그인 URL을 수동으로 입력하지 않고도 클릭 할 수 있습니다.

    타사에서 개발 한 테마를 사용하는 경우 하위 테마를 사용하십시오 . 이러한 방식으로 변경 사항을 잃지 않고 테마를 안전하게 업데이트 할 수 있습니다.

  4. 유지 관리 모드를 활성화하려면 다음을 열고 wp_config.php거기에 넣으십시오.

    define('IN_MAINTENANCE', true);

    그런 다음 사이트를 다시 공개 할 준비가되면 해당 라인을 제거하거나 쉽게 다시 사용 true하도록 변경하십시오 false.


이것은 매우 자세한 답변이며 가능한 적은 노력으로 내 문제를 해결할 수있는 좋은 방법입니다! 나중에 시도하고 작동하면 답변을 수락하겠습니다. 너무 너무 감사합니다!
NewUser

안녕하세요 GM- "wp-content"라는 이름의 사용자 정의 디렉토리를 사용하지만 WP_CONTENT_DIR .....을 변경하여 작동시키는 방법을 모릅니다. 최고
NewUser

오래된 스레드, 나는 알고있다. 그러나 누군가가 그 대답을 필요로하는 경우를 대비하여 define('WP_CONTENT_DIR','/url/to/define/');, wp-config.php파일에 추가하는 것만 큼 쉽습니다 .
gmo

@ gmazzap, 이것은 놀랍습니다. 이미 로그인 한 경우 (예 : 관리자) 관리 콘솔에 액세스하여 수정할 수 있다는 의미입니까?
paranza

@paranza 예, 맞습니다.
gmazzap

2

이전 답변은 완전하고 잘 작성되었습니다. 어쨌든 당신이 나와 같은 곳에서 모든 것을 한곳에두고 싶다면 function.php파일에 다음 줄을 드롭하고 maintenance.php테마 디렉토리에 파일을 만들 수 있습니다 .

이것은 Git 저장소가 테마 디렉토리만을 가리키는 경우에 특히 유용합니다.

add_action( 'wp_loaded', function() 
{
    global $pagenow;

    // - - - - - - - - - - - - - - - - - - - - - - 
    // Turn on/off you Maintenance Mode (true/false)
    define('IN_MAINTENANCE', true);
    // - - - - - - - - - - - - - - - - - - - - - - 

    if(
        defined( 'IN_MAINTENANCE' )
        && IN_MAINTENANCE
        && $pagenow !== 'wp-login.php'
        && ! is_user_logged_in()
    ) {
        header('HTTP/1.1 503 Service Temporarily Unavailable');
        header( 'Content-Type: text/html; charset=utf-8' );
        if ( file_exists( get_template_directory() . '/maintenance.php' ) ) {
            require_once( get_template_directory() . '/maintenance.php' );
        }
        die();
    }
});

노트

header('HTTP/1.1 503 Service Temporarily Unavailable');위 의 헤더가 작동하지 않아 헤더를 변경했습니다 .


나는 이것의 요점을 볼 수 있지만 몇 가지 사항을 주목하십시오-WordPress는 자체 유지 관리를 수행 할 때 테마 디렉토리 내 에서이 유지 관리 파일을 사용하지 않습니다 (따라서 wp-content / maintenance.php를 만드는 것이 좋습니다. 글쎄 그리고 나서 (당신의 테마 하나를 요구하십시오); 또한 이와 같은 상수를 정의하면 커밋을 통해 유지 관리 모드를 켜거나 끄는 대신 wp-config.php 또는 환경 변수로 저장됩니다. :)
Tim Malone

@TimMalone, 동의합니다. 결국 그것은 짧은 기간 동안 잘 작동하는 해결 방법이며, 개발자 (모든 개발자)는 모든 업데이트를 수행합니다.
a.barbieri
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.