Bir 404 WordPress zorla


40

Koşullara göre bazı yayınlarda 404 zorlaman gerekiyor. Yapmayı başardım (doğru şekilde yapıp yapmadığımı bilmeme rağmen) ve 404.phpşablonumun beklendiği gibi yüklenmesini sağlıyorum.

Benim kod:

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 );

Bu ilgili sorudan Kod 2 - aynı problem:

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' );

Sorunum:

Her ne kadar iyi görünse200 OK de ağ sekmesini kontrol edersem durum alırım . Durum olduğundan 200, arama motorlarının bu sayfaları da dizine ekleyebileceğinden korkuyorum.

Beklenen Davranış:

Bir durumun 404 Not Foundgönderilmesini istiyorum .


Gönderen ilgili sorular: wordpress.stackexchange.com/questions/73738/... - okudun?
fuxia

Evet, hala 200bununla bir statü alıyorum .
RReshesh

Yanıtlar:


50

Üstbilgiyi status_header()eklemek için Wordpress işlevini deneyebilirsiniz HTTP/1.1 404 Not Found;

Yani Kod 2 örneğiniz şöyle olacaktır:

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' );

Bu işlev örneğin bu bölümde kullanılır:

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

dan wpsınıf /wp-includes/class-wp.php.

Bu nedenle , kodunuza ek olarak bu değiştirilmiş Kod 2 örneğini kullanmayı deneyin template_include.


Code 2Eğer mükemmel eserler yayınlanmıştır pasajı. set_header()Ne eksikti oldu.
RRikesh

@birgire set_header()eklemek istiyor HTTP/1.1 404 Not Foundama status_header()kodunda kullandın mı?
henrywright

@ henrywright orada bir yazım hatası gibi görünüyor, cevabı güncelledim, teşekkürler ;-)
birgire

15

Bu kod benim için çalıştı:

add_action ('wp', 'force_404');
işlev force_404 () {
    global $ wp_query; // $ yayın (gerekirse)
    if (is_page ()) {// durumunuz
        status_header (404);
        nocache_headers ();
        dahil (get_query_template ('404'));
        ölmek();
    }
}

Kullanışlı. Özel sorgu parametrelerini kontrol ediyorum, bu yüzden eylemi kullanmıyorum, ancak eklenti sınıfımda çok kullanışlı bir yöntem.
John Reid

2
Sayfa başlığını düzeltmek için aşağıdakileri ekleyin:global $wp_query; $wp_query->is_404 = true;
developerbmw

2

Bir 404 zorla tavsiye etmem.

Arama motorları hakkında endişe duyuyorsanız, neden bu sayfalarda yalnızca "endekssiz, no-follow" meta yapmıyor ve robots.txt ile engellemiyorsunuz?

Bu, içeriğin görüntülenmesini engellemenin daha iyi bir yolu olabilir

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;
}

Muhtemelen yüklemek için bu yöntemi de kullanabilirsiniz, 404.phpancak bir sayfa şablonu kullanmanın daha iyi bir seçenek olabileceğini düşünüyorum.

kaynak


Bağlantı için çok teşekkürler, locate_template()bunun yerine kullanmaya geçeceğim . robots.txt.İndekslemeden korunmanın garantili bir yolu olmadığını düşünüyorum . Bazı arama motorları hala sayfayı alabilir. Sayfanın normal bir 404 sayfası gibi görünmesini istiyorum. Ayrıca yazılar dinamik olarak eklenecek, robots.txtdosyanın düzenlenmesi daha fazla sorun yaratacaktır.
RReshesh

1

Çözümüm:

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
Hataların yönlendirilmesi sayfa sıralamanız için çok korkunç. Sadece kötü istekle aynı konumda bir şablon göster. Bunu yaptığınız zaman ne olacak başlangıçta bir 404 ayarladınız ve sonra yönlendirme bunu bir 301 veya 302 olarak değiştirir, bu daha sonra 200 döndüren bir sayfaya yönlendirir. Bu arama motorları tarafından geçerli bir sayfa olarak dizine alınır. açıkça OP'nin istemediğini söylediği şeydi.
mopsyd

0

Durum kodları HTTP isteklerinin başlığına gönderilir. Mevcut fonksiyonunuz çok geç çağrılacak bir kancaya bağlanır.

İşlevinizi rr_404_my_event()eyleme geçirmeye çalışmalısınız send_headers.

Bu noktada, Posta Kimliğini kontrol etmenin bile mümkün olup olmadığından emin değilim, ancak şunu yapın:

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; 
    }
}

Kodlarınızdaki bazı sözdizimi hatalarını düzelttim. 404 şablonumun bununla yüklenmesini bile istemiyorum.
RRikesh

Belki, 404.phpsizde farklı bir yükleyebilirsiniz header.php, örneğin <?php get_header('404'); ?>yüklemek header-404.php. Bu başlıkla, eklemek istiyorum header('HTTP/1.0 404 Not Found');içinde <head>bölüm.
Marc Dingena

0

İşaretli çözümü kullanma yöntemimi paylaşmak istedim

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");

Ben ayırmak için bu yaptığımız tüm kullanıcı tipleri gelen yönetici , bu projede, Sadece yönetici görebilirsiniz author.phpsayfayı.

Umarım başka birine yardım edebilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.