কেন 404s এ লুপটি খালি নেই?


10

আমি একটি অদ্ভুত বিষয় জুড়ে এসেছি।

বলুন যে আপনি একটি এলোমেলো url অ্যাক্সেস করুন, তিন বা ততোধিক স্তর আরও গভীর:

http://example.com/a/b/c
http://example.com/a/b/c/d
...

তারপর is_404()হয় true। এ পর্যন্ত সব ঠিকই. তবে কোনও কারণে শেষ পোস্টগুলি অনুসন্ধান করা হয়।

$wp_query->request

হয়

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID 
    FROM wp_posts 
    WHERE 1=1 
        AND wp_posts.post_type = 'post' 
        AND (
            wp_posts.post_status    = 'publish' 
            OR wp_posts.post_status = 'private'
            ) 
    ORDER BY wp_posts.post_date DESC 
    LIMIT 0, 5

যা তবে অবশ্যই have_posts()ফিরে আসে trueএবং আরও অনেক কিছু। কেউ এই ব্যাখ্যা করতে পারেন?

আমি এ পর্যন্ত যা জানতে পেরেছি:

কেবলমাত্র তিন বা ততোধিক মাত্রায় গভীরভাবে লাথি মারার কারণটি হ'ল এর আগে ডাব্লুপি পোস্ট এবং সংযুক্তিগুলি সন্ধান করে যা কোনও না কোনওভাবে অন্য আচরণের ফলস্বরূপ।

দেখে মনে হয় যদিও ডাব্লুপিপি অনুরোধটিকে একটি সময়ে 404 হিসাবে স্বীকৃতি দেয় তবে এটি সর্বাধিক সাম্প্রতিক পোস্টগুলি নিয়ে আসে। থেকে সাহায্যে @kaiser এবং @GM আমি থেকে কোথাও এই নিচে ট্র্যাক করে থাকেন /wp-includes/class-wp.php:608


আপনি যদি পৃষ্ঠার কোডটি যুক্ত না করেন তবে আপনাকে সাহায্য করা শক্ত হতে পারে
টমস কট

3
এটি আমার কোডের সাথে নির্দিষ্ট নয়। সমস্ত ডিফল্ট থিমের পাশাপাশি একেবারে নতুন ইনস্টল করে এটির আচরণ করে।
ক্রাফ্টনার

আমার কাস্টম থিমটি কি কাজ করছে না, আপনি কি কমপক্ষে একটি থিমের নাম রাখতে পারেন? আপনি কি নির্দিষ্ট পরামিতি ব্যবহার করছেন? আপনি স্লাগগুলি পরিবর্তন করেছেন? আপনি ডাব্লুপি এর কোন সংস্করণ ব্যবহার করছেন?
টমসের খাট

সত্যিই যে কোন। তবে আপনার পছন্দ হলে কুড়ি ইলেভেন চেষ্টা করুন।
kraftner

সমস্ত প্রশ্নের জন্য দুঃখিত, আমি ভেবেছিলাম পোস্টগুলি প্রদর্শিত হচ্ছে।
টমস খাট

উত্তর:


9

আপনি অবাক হতে পারেন, তবে সেখানে অদ্ভুত কিছু নেই।

প্রথমে স্পষ্ট করে বলি যে ওয়ার্ডপ্রেসে আপনি যখন কোনও ফ্রন্টএন্ড ইউআরএল পরিদর্শন করেন তখন আপনি একটি ক্যোয়ারী ট্রিগার করেন। সর্বদা.

এই ক্যোয়ারীটি কেবলমাত্র একটি স্ট্যান্ডার্ড WP_Query, ঠিক যেমনটি চালিত হয়:

$query = new WP_Query( $args );

শুধুমাত্র একটি পার্থক্য আছে: পদ্ধতিটি $argsব্যবহার করে ওয়ার্ডপ্রেস দ্বারা ভেরিয়েবলগুলি তৈরি করা হয় WP::parse_request()। এই পদ্ধতিটি যা করে তা হ'ল ইউআরএল এবং পুনর্লিখনের নিয়মগুলিতে নজর দেওয়া এবং ইউআরএলকে আর্গুমেন্টের অ্যারে রূপান্তর করা।

কিন্তু যখন ইউআরএলটি বৈধ নয় বলে সেই পদ্ধতিটি এটি করতে সক্ষম হয় না তখন কী ঘটে? ক্যোয়ারী আরোগুলি ঠিক এর মতো একটি অ্যারে:

array( 'error' => '404' );

(উত্স এখানে এবং এখানে )।

সুতরাং যে অ্যারে পাস করা হয় WP_Query

এখন করার চেষ্টা করুন:

$query = new WP_Query( array( 'error' => '404' ) );
var_dump( $query->request );

আপনি কি অবাক হয়েছেন যে ওপিতে কোয়েরিটি হুবহু এক? আমি নই.

সুতরাং,

  1. parse_request() একটি ত্রুটি কী দিয়ে একটি অ্যারে তৈরি করে
  2. যে অ্যারে পাস করা হয় WP_Query, এটি কেবল এটি চালায়
  3. handle_404()যা ক্যোয়ারির পরে চলে , 'error'প্যারামিটারটি দেখে is_404()সত্য হয়ে যায় sets

সুতরাং, have_post()এবং is_404()সম্পর্কিত হয় না। সমস্যাটি হ'ল WP_Queryকোনও সমস্যা হয়ে গেলে কোয়েরিকে শর্ট সার্কিট করার কোনও সিস্টেম নেই, সুতরাং একবার অবজেক্টটি তৈরি হয়ে গেলে এটিতে কিছু আরগস দিন এবং কোয়েরিটি চলবে ...

সম্পাদনা:

এই সমস্যাটি কাটিয়ে ওঠার জন্য দুটি উপায় রয়েছে:

  • একটি 404.phpটেম্পলেট তৈরি করুন ; ওয়ার্ডপ্রেস এটি 404 টি ইউআরএলে লোড করবে এবং সেখানে আপনাকে যাচাই করতে হবে নাhave_posts()
  • ফোর্স $wp_query404 খালি হতে, ভালো কিছু:

    add_action( 'wp', function() {
        global $wp_query;
        if ( $wp_query->is_404() ) {
            $wp_query->init();
            $wp_query->is_404 = true; // init() reset 404 too
        }
    } );

4
আমি যুক্ত করব যে কারণটি সাধারণত এটি হয় না তা হ'ল 404 সাধারণত ক্যোয়ারীর ফলাফল । তবে এক্ষেত্রে এটি মেলে না এমন পুনর্লিখনের বিধি ( $wp->matched_rule) এর ফলাফল , তবে ক্যোয়ারী এখনও গতিগুলির মধ্য দিয়ে যাচ্ছে কারণ এটি এতে মনোযোগ দেয় না।
র‌্যাস্ট

+1 টি। হ্যাঁ, ক্যোয়ারি এতে মনোযোগ দেয় না এবং বর্তমান কোড সহ এটি মনোযোগ দিতে পারে না , কারণ এটি থামানোর কোনও উপায় নেই। উদাহরণ হিসাবে যখন একটি অ বৈধ বর্গীকরণ সূত্র ওয়ার্ডপ্রেস সেট জানতে চাওয়া হয় WHERE 1=0SQL এর যে কারণ এটি ক্যোয়ারী যাতে প্রত্যাবর্তন কিছুই ... @Rarst একটি ক্যোয়ারী বাধ্য বন্ধ করতে পারবেন
gmazzap

ঠিক আছে এখন আমি এটি পেয়েছি। সুতরাং যে আসল প্রশ্নটি রয়ে গেছে তা হল ডাব্লুপিউকিউয়ারি যখন কোনও যুক্তিই পাস না করে পোস্ট পাওয়ার বিষয়ে একটি ডিফল্ট ক্যোয়ারী গ্রহণ করে তখন যখন কিছুই না ফেরানো হয় তখন কী বোঝা যায়?
kraftner

2
@ ক্র্যাফনার যেমনটি বলেছে যে ওয়ার্ডপ্রেস ক্যোয়ারি রান চালায় তা এড়াতে পারে না, এবং যখন কোন অনুরোধযোগ্য যুক্তি না থাকে তখন 2 টি পছন্দ রয়েছে: এমন একটি ক্যোয়ারী চালান যা নিশ্চিতভাবে কিছুই দেয় না (যেমন কোনও বৈধ শ্রেণিবদ্ধ জিজ্ঞাসা করা হয়, উপরে মন্তব্য দেখুন) বা ডিফল্ট ক্যোয়ারী চালান । কেন এই ক্ষেত্রে ডাব্লুপি পরবর্তীকালে একটি Q হয় যা কোর
ডিভসকে

@ টমসকোট অবশ্যই যাইহোক, জিনিসগুলি এখন পরিষ্কার হয়ে গেছে এবং আমার কেবল একটি অতিরিক্ত is_404()চেক করা দরকার।
ক্র্যাফটনার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.