কিভাবে ওয়ার্ডপ্রেসে একটি 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/... - আপনি যে পড়তে হয়নি?
ফুসিয়া

হ্যাঁ, আমি এখনও 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 2Snippet আপনি পুরোপুরি কাজ পোস্ট করা হয়েছে। set_header()কি অনুপস্থিত হয়েছিল।
রিরিকেশ

@ বিবিরগায়ার আপনি set_header()যোগ করার জন্য উল্লেখ করেছেন HTTP/1.1 404 Not Foundকিন্তু status_header()আপনার কোড ব্যবহার করেছেন?
হেনরিউইট

@ চেনাবার্তে এটি সেখানে টাইপোর মতো মনে হচ্ছে, আমি উত্তরটি আপডেট করেছি, ধন্যবাদ ;-)
বার্জায়ার

15

এই কোডটি আমার পক্ষে কাজ করেছে:

যোগ_অ্যাকশন ('wp', 'ফোর্স_404');
ফাংশন বল_404 () {
    গ্লোবাল $ wp_query; // $ পোস্ট (প্রয়োজনে)
    যদি (is_page ()) {// আপনার শর্ত
        স্ট্যাটাস_হেডার (404);
        nocache_headers ();
        (get_query_template ('404')) অন্তর্ভুক্ত করুন;
        মরা ();
    }
}

কুশলী। আমি কাস্টম ক্যোয়ারী প্যারামিটারগুলি পরীক্ষা করছি তাই আমি অ্যাকশনটি ব্যবহার করছি না, তবে এটি আমার প্লাগইন শ্রেণিতে একটি খুব দরকারী পদ্ধতি তৈরি করে।
জন রেড

2
পৃষ্ঠার শিরোনাম ঠিক করতে নিম্নলিখিতটি যুক্ত করুন:global $wp_query; $wp_query->is_404 = true;
developerbmw

2

আমি 404 জোর করার পরামর্শ দেব না।

আপনি যদি সার্চ ইঞ্জিনগুলি নিয়ে উদ্বিগ্ন থাকেন তবে কেন কেবল সেই পৃষ্ঠাগুলিতে একটি "নং-সূচক, নো-ফলো" মেটা করবেন না এবং এটিকে রোবটস.টিএক্সটি দিয়ে ব্লক করবেন না?

এই বিষয়বস্তু দেখা থেকে ব্লক করার ভাল উপায় হতে পারে

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 সেট করেন এবং তারপরে এটি পুনর্নির্দেশ 3030 বা 302 এ পুনরায়নির্দেশ করে যা এমন পৃষ্ঠায় ফিরে যায় যা 200 ফেরত দেয় That ওপি যা চায়নি তা স্পষ্টতই বলেছিল।
মপসাইড

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 টেম্পলেটটিও পাই না।
RRikesh

সম্ভবত, আপনার 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

আমি আশা করি এটি অন্য কাউকে সাহায্য করতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.