WordPress에서 404를 강제 실행하는 방법


40

조건에 따라 일부 게시물에 404를 적용해야합니다. 나는 그것을 올바르게 수행했는지 알지 못했지만 그것을 관리하고 404.php템플릿을 예상대로로드하고 있습니다.

내 코드 :

function rr_404_my_event() {
  global $post;
  if ( is_singular( 'event' ) && !rr_event_should_be_available( $post->ID ) ) {
    include( get_query_template( '404' ) );
    exit; # so that the normal page isn't loaded after the 404 page
  }
}

add_action( 'template_redirect', 'rr_404_my_event', 1 );

이 관련 질문의 코드 2- 동일한 문제 :

function rr_404_my_event() {
  global $post;
  if ( is_singular( 'event' ) && !rr_event_should_be_available( $post->ID ) ) {
    global $wp_query;
    $wp_query->set_404();
  }
}

add_action( 'wp', 'rr_404_my_event' );

내 문제 :

그것이 비록 보이는 좋은, 나는 상태를 가져 200 OK내가 네트워크 탭을 확인합니다. 그것은 상태이기 때문에 200검색 엔진이 해당 페이지를 색인 할 수도 있습니다.

예상되는 행동 :

상태 404 Not Found를 보내고 싶습니다 .


로부터 관련 질문 : wordpress.stackexchange.com/questions/73738/... - 당신은 읽었다?
fuxia

예, 여전히 상태 200가 유지됩니다.
RRikesh 2016 년

답변:


50

Wordpress 함수 status_header()를 사용하여 HTTP/1.1 404 Not Found헤더 를 추가 할 수 있습니다 .

따라서 코드 2 예제는 다음과 같습니다.

function rr_404_my_event() {
  global $post;
  if ( is_singular( 'event' ) && !rr_event_should_be_available( $post->ID ) ) {
    global $wp_query;
    $wp_query->set_404();
    status_header(404);
  }
}
add_action( 'wp', 'rr_404_my_event' );

이 기능은 예를 들어이 부분에서 사용됩니다.

function handle_404() {
    ...cut...
    // Guess it's time to 404.
    $wp_query->set_404();
    status_header( 404 );
    nocache_headers();
    ...cut...
}

로부터 wp의 클래스 /wp-includes/class-wp.php.

따라서 코드 외에이 수정 된 코드 2 예제를 사용해보십시오 template_include.


Code 2게시 한 스 니펫은 완벽하게 작동합니다. 은 set_header()없어진 것이었다.
RRikesh

@birgire 코드에 set_header()추가 HTTP/1.1 404 Not Found했지만 사용 status_header()했습니까?
henrywright

@henrywright 그것은 오타처럼 보입니다. 나는 대답을 업데이트했습니다. 감사합니다 ;-)
birgire

15

이 코드는 저에게 효과적이었습니다.

add_action ( 'wp', 'force_404');
함수 force_404 () {
    글로벌 $ wp_query; // $ posts (필요한 경우)
    if (is_page ()) {// 조건
        status_header (404);
        nocache_headers ();
        include (get_query_template ( '404'));
        주사위();
    }
}

능숙한. 사용자 정의 쿼리 매개 변수를 확인하고 있으므로 작업을 사용하지 않지만 플러그인 클래스에서 매우 유용한 메소드를 만듭니다.
John Reid

2
페이지 제목을 수정하려면 다음을 추가하십시오.global $wp_query; $wp_query->is_404 = true;
developerbmw

2

404를 강요하지 않는 것이 좋습니다.

검색 엔진이 걱정된다면 왜 해당 페이지에서 "색인 없음, 팔로우 없음"메타를 수행하고 robots.txt로 차단하지 않겠습니까?

콘텐츠를 보지 못하게하는 더 좋은 방법 일 수 있습니다.

add_filter( 'template_include', 'nifty_block_content', 99 );

function nifty_block_content( $template ) {
  if ( is_singular( 'event' ) && !rr_event_should_be_available( $post->ID ) ) {
        $template = locate_template( array( 'nifty-block-content.php' ) );
     }
    return $template;
}

아마도이 방법을 사용하여로드 404.php할 수도 있지만 페이지 템플릿을 사용하는 것이 더 나은 옵션이라고 생각합니다.

출처


링크에 감사드립니다 locate_template(). 대신 사용으로 전환하겠습니다 . 이것이 robots.txt.색인 생성을 보호하는 보장 방법은 아니라고 생각합니다 . 일부 검색 엔진은 여전히 ​​페이지를 선택할 수 있습니다. 페이지가 일반 404 페이지처럼 보이기를 원합니다. 또한 게시물이 동적으로 추가되므로 robots.txt파일을 편집하면 문제가 더 발생합니다.
RRikesh 2016 년

1

내 해결책 :

add_action( 'wp', 'my_404' );
function my_404() 
{
    if ( is_404() ) 
    {
        header("Status: 404 Not Found");
        $GLOBALS['wp_query']->set_404();
        status_header(404);
        nocache_headers();
        //var_dump(getallheaders()); var_dump(headers_list()); die();
    }
}

1
페이지 순위가 잘못되어 오류를 리디렉션하는 것이 끔찍합니다. 잘못된 요청과 같은 위치에 템플릿을 표시하십시오. 이렇게하면 처음에 404를 설정 한 다음 리디렉션이 301 또는 302로 변경되어 200을 반환하는 페이지로 리디렉션됩니다. 그러면 검색 엔진이 유효한 페이지로 색인을 생성합니다. OP가 원하지 않았다고 명시 적으로 말한 것입니다.
1

0

상태 코드는 HTTP 요청의 헤더로 전송됩니다. 현재 함수가 너무 늦게 호출되는 후크에 연결되었습니다.

함수 rr_404_my_event()를 동작 에 연결해야합니다 send_headers.

그 시점에서 게시물 ID를 확인할 수 있는지 확실하지 않지만 다음과 같이하십시오.

add_action( 'send_headers', 'rr_404_my_event' );
function rr_404_my_event() {
    global $post;
    if ( is_singular( 'event' ) && !rr_event_should_be_available( $post->ID ) ) {
        include( get_query_template( '404' ) );
        header('HTTP/1.0 404 Not Found');
        exit; 
    }
}

귀하의 코드에서 일부 구문 오류가 수정되었습니다. 404 템플릿을로드 할 수도 없습니다.
RRikesh

아마도, 404.php당신은 당신이 다른로드 header.php, 예 <?php get_header('404'); ?>를 들어 로드 할 수 header-404.php있습니다. 해당 헤더 header('HTTP/1.0 404 Not Found');에서 <head>섹션을 추가 합니다 .
Marc Dingena

0

표시된 솔루션을 사용하는 방식을 공유하고 싶었습니다.

function fail_safe_for_authors() {
    if ((is_user_logged_in()) && (is_author()) && ($_COOKIE["user_role"] !== "administrator")) {
            global $wp_query;
            $wp_query->set_404();
            status_header(404);
        }
}
add_action("wp", "fail_safe_for_authors");

이 프로젝트 에서 모든 사용자 유형관리자 와 분리하기 위해이 작업을 수행했습니다.이 프로젝트에서는 관리자 만 author.php페이지를 볼 수 있습니다 .

나는 그것이 다른 누군가를 도울 수 있기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.