वर्डप्रेस पर 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साथ एक दर्जा प्राप्त है।
आरिकेश

जवाबों:


50

आप शीर्ष लेख 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

@ प्रसव आप set_header()जोड़ने के लिए देखें, HTTP/1.1 404 Not Foundलेकिन status_header()अपने कोड में इस्तेमाल किया है?
मेंहदी लेखक

@ जब्री राइट यह एक टाइपो की तरह दिखता है, तो मैंने जवाब को अपडेट किया, धन्यवाद ;-)
बीरगीर

15

इस कोड ने मेरे लिए काम किया:

add_action ('wp', 'force_404');
समारोह बल_404 () {
    वैश्विक $ wp_query; // $ पोस्ट (यदि आवश्यक हो)
    if (is_page ()) {// आपकी स्थिति
        status_header (404);
        nocache_headers ();
        शामिल (get_query_template ('404'));
        मरने ();
    }
}

हैंडी। मैं कस्टम क्वेरी मापदंडों के लिए जाँच कर रहा हूँ इसलिए मैं कार्रवाई का उपयोग नहीं कर रहा हूँ, लेकिन यह मेरे प्लगइन वर्ग में एक बहुत ही उपयोगी विधि के लिए बनाता है।
जॉन रीड

2
पृष्ठ का शीर्षक ठीक करने के लिए निम्नलिखित जोड़ें:global $wp_query; $wp_query->is_404 = true;
डेवलपर

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फ़ाइल को संपादित करने से अधिक परेशानी होगी।
आरिकेश

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 पर लौटने वाले पेज पर रीडायरेक्ट हो जाता है। फिर एक वैध पेज के रूप में सर्च इंजन द्वारा अनुक्रमित हो जाता है, जो स्पष्ट रूप से ओपी ने कहा कि वह नहीं चाहता था।
mopsyd

0

HTTP अनुरोधों के शीर्षलेखों में स्थिति कोड भेजे जाते हैं। आपका वर्तमान फ़ंक्शन एक हुक में झुका हुआ है जिसे बहुत देर से कहा जाएगा।

आपको अपने फ़ंक्शन rr_404_my_event()को कार्रवाई में हुक करने का प्रयास करना चाहिए send_headers

मुझे यकीन नहीं है कि अगर उस समय में पोस्ट आईडी की जांच करना संभव है, लेकिन यह एक जाना है:

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 टेम्पलेट भी नहीं मिला है।
ऋषिकेश

शायद, 404.phpआप में आप एक अलग लोड कर सकते हैं header.php, उदाहरण के <?php get_header('404'); ?>लिए लोड करने के लिए header-404.php। उस शीर्ष लेख में, आप अनुभाग header('HTTP/1.0 404 Not Found');में जोड़ देंगे <head>
मार्क डिंगेना

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पृष्ठ देख सकता है ।

मुझे उम्मीद है कि यह किसी और की मदद कर सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.