আমি কি কোনও ফলাফল ফেরত দিতে ডাব্লুপিউকিউয়ারিকে জোর করতে পারি?


23

আমি একটি ওয়েবসাইটে একটি অনুসন্ধান বৈশিষ্ট্য নিয়ে কাজ করছি যা ব্যবহারকারীদের অনেকগুলি পোস্ট মেটার মাধ্যমে অনুসন্ধান করতে দেয়। একটি সুনির্দিষ্ট অনুসন্ধানের প্যাটার্ন রয়েছে যা আমি জোর করে কোনও ফলাফল না দিয়ে দিতে চাই। ডাব্লুপিউকিউয়ারি প্রযুক্তিগতভাবে ডাটাবেসগুলিতে ফলাফলগুলি সন্ধান করবে, তবে আমি if( $example->have_posts() )ব্যর্থ হওয়ার জন্য ট্রিগারটির জন্য কোনও ফলাফল ফিরিয়ে দিতে বাধ্য করার জন্য এটি কোনওভাবেই ওভাররাইড করতে চাই ।

আমি কি WP_Query এ এমন কোনও প্যারামিটার দিয়ে যেতে পারি 'force_no_results' => trueযে এটি কোনও ফল দিতে বাধ্য করবে?


1
এটি দেখে মনে হচ্ছে আপনি কীভাবে মূল সমস্যার সমাধান করবেন সে সম্পর্কে জিজ্ঞাসা না করে আপনি ইতিমধ্যে নির্ধারিত প্রয়োগের জন্য জিজ্ঞাসা করছেন। লাইনের মধ্যে পড়া, আমার মনে হয় আপনার আসলেই যা জিজ্ঞাসা করা উচিত তা হ'ল: কীভাবে আমি একটি নির্দিষ্ট অনুসন্ধানের প্যাটার্নটিকে জিজ্ঞাসাবাদী করব না? । ঘটাচ্ছে WP_Query()ফলাফল শূণ্য অথবা সবচেয়ে ভালো উপায় যে প্রশ্নের উত্তর দিতে হতে পারে। আপনি অনুসন্ধানের প্যাটার্নটি যা আপনি জিজ্ঞাসাযোগ্য হতে চান তা বর্ণনা করলেও এটি সহায়ক হতে পারে । অনুসন্ধানের প্যাটার্নটি জানলে কোনও সমাধান বের করাতে পারে।
চিপ বেনেট

উত্তর:


28

চেষ্টা

'post__in' => array(0)

সহজ এবং যথাযথ.


আমার প্রথম চিন্তা ছিল - এই কোথাও ভুল হতে হবে, তবে সম্পর্কিত কোডটি স্কিমিং থেকে এটি আসলে বরং সুন্দরভাবে কাজ করা উচিত। :)
রাস্ট

5
শূন্যটি খুব গুরুত্বপূর্ণ কারণ ঠিক একটি খালি অ্যারে সাম্প্রতিক পোস্টগুলি ফিরিয়ে দেবে।
মার্ক কাপলুন

ধন্যবাদ! post__inখালি অ্যারে পাস করার সময় পোস্টগুলি ফেরত দেওয়ার সময় এটি আমার জন্য একটি বাগ সমাধান করেছিল ... array(0)দুর্দান্ত কাজ করে! এটি অদ্ভুত তবে এটি আসলে ডাব্লুপি কোরে একটি বাগ হিসাবে উপস্থিত একটি ইস্যুতে সনাক্ত করা যেতে পারে তবে এটি পরে যেমনটি রেখে দেওয়া হয়েছিল কারণ অনেকগুলি থিম / প্লাগইন বিকাশকারীরা এটির চারপাশে কার্যকারিতা তৈরি করে -_- কোর.ট্রাক.ওয়ার্ডপ্রেস.আর / টিকিট / 28099
এরানশ

3

কৌতূহলজনকভাবে শর্ট সার্কিটের কোনও পরিষ্কার / সুস্পষ্ট উপায় নেই WP_Query

যদি এটির মূল জিজ্ঞাসাটি আপনি প্রায় বাইরে কাজ করতে পারেন তবে WP->parse_request()সেখানে তুলনামূলকভাবে সাম্প্রতিক (3.5) do_parse_requestফিল্টার উপস্থিত রয়েছে।

তবে WP_Queryনিজের জন্য নোংরা হ্যাকগুলি সাধারণত ক্রমে থাকে যেমন শর্ট সার্কিট এসকিউএল কোয়েরি ফিল্টার ইত্যাদির AND 1=0মাধ্যমে যোগ করে posts_whereetc.


2
তথ্যের জন্য ধন্যবাদ। এটি একটি গৌণ লুপ বিটিডব্লিউ ছিল। এবং আমি সবেমাত্র একটি নোংরা হ্যাক করে শেষ করেছি "post_type" => "break_loop"যা একটি অ অযৌক্তিক পোস্ট টাইপ।
ব্রায়ান

2

অসামঞ্জস্য মানের একটি কোয়েরি প্যারামিটার সেট করতে সমস্যাগুলি হ'ল 2:

  • কোয়েরিটি চলবে, সুতরাং আপনার যদি ইতিমধ্যে জানা থাকে যে কোনও ফলাফল না হয় তবে প্রদানের জন্য সামান্য পারফরম্যান্সের মূল্য থাকবে
  • ওয়ার্ডপ্রেস ক্যোয়ারিতে 19 টি পৃথক 'posts_*'ফিল্টার হুক ( 'posts_where', 'post_join'ইত্যাদি।) রয়েছে যা কোয়েরিতে কাজ করে, তাই আপনি কখনই নিশ্চিত হতে পারবেন না যে কোয়েস্টের অসামঞ্জস্য পরম কোনও ফলাফল দেয় না, ORফিল্টার দ্বারা ফিরে আসা একটি সহজ ধারাটি কিছু ফেরত দেয়।

আপনি একটি সামান্য বিট প্রয়োজন হার্ডকোর রুটিন হতে নিশ্চিত একটি ক্যোয়ারী কোন ফলাফল আসতে আর কোন (অথবা খুব minimun) কার্য সম্পাদন বিষয়।

সেই রুটিন ট্রিগার করতে, আপনি প্রতিটি পদ্ধতি ব্যবহার করতে পারেন, প্রযুক্তিগতভাবে আপনি কোনও যুক্তি পাস করতে পারেন WP_Query , ইভেন্ট যুক্তিগুলি অস্তিত্ব

সুতরাং আপনি যদি এর মতো কিছু পছন্দ করেন তবে আপনি 'force_no_results' => trueএটির মতো ব্যবহার করতে পারেন:

$a = new WP_Query( array( 's' => 'foo', 'force_no_results' => true ) );

এবং 'pre_get_posts'এতে কঠোর পরিশ্রম করে একটি কলব্যাক যোগ করুন :

add_action( 'pre_get_posts', function( $q ) {
  if (array_key_exists('force_no_results', $q->query) && $q->query['force_no_results']) {
    $q->query = $q->query_vars = array();
    $added = array();
    $filters = array(
      'where', 'where_paged', 'join', 'join_paged', 'groupby', 'orderby', 'distinct',
      'limits', 'fields', 'request', 'clauses', 'where_request', 'groupby_request',
      'join_request', 'orderby_request', 'distinct_request','fields_request',
      'limits_request', 'clauses_request'
    );
    // remove all possible interfering filter and save for later restore
    foreach ( $filters as $f ) {
      if ( isset($GLOBALS['wp_filter']["posts_{$f}"]) ) {
        $added["posts_{$f}"] = $GLOBALS['wp_filter']["posts_{$f}"];
        unset($GLOBALS['wp_filter']["posts_{$f}"]);
      }
    }
    // be sure filters are not suppressed
    $q->set( 'suppress_filters', FALSE );
    $done = 0;
    // use a filter to return a non-sense request
    add_filter('posts_request', function( $r ) use( &$done ) {
      if ( $done === 0 ) { $done = 1;
        $r = "SELECT ID FROM {$GLOBALS['wpdb']->posts} WHERE 0 = 1";
      }
      return $r;
    });
    // restore any filter that was added and we removed
    add_filter('posts_results', function( $posts ) use( &$done, $added ) {
      if ( $done === 1 ) { $done = 2;
        foreach ( $added as $hook => $filters ) {
          $GLOBALS['wp_filter'][$hook] = $filters;
        }
      }
      return $posts;
    });
  }
}, PHP_INT_MAX );

এই কোডটি যা করে তা 'pre_get_posts'যতটা সম্ভব দেরীতে চালিত হয় । যদি 'বল_নো_সাল্টস' যুক্তি কোয়েরিতে উপস্থিত থাকে, তবে:

  1. প্রথমে সমস্ত সম্ভাব্য ফিল্টারগুলি সরিয়ে ফেলুন যা ক্যোয়ারিতে হস্তক্ষেপ করতে পারে এবং সেগুলি হেল্পারের অ্যারেতে সংরক্ষণ করে
  2. ফিল্টার ট্রিগার হয়েছে তা নিশ্চিত হওয়ার পরে, অ্যাডা ফিল্টার যা এই ধরণের অনুরোধটি ফিরিয়ে দেয়: SELECT ID FROM wp_posts WHERE 0 = 1 সমস্ত ফিল্টার সরিয়ে , এই কোয়েরিটি পরিবর্তিত হওয়ার কোনও সম্ভাবনা নেই এবং এটি খুব দ্রুত, এবং নিশ্চিতরূপে কোনও ফলাফল নেই
  3. এই কোয়েরিটি চালুর সাথে সাথেই সমস্ত মূল ফিল্টার (যদি থাকে তবে) পুনরুদ্ধার করা হয় এবং পরবর্তী সমস্ত ক্যোয়ারী প্রত্যাশার মতো কাজ করবে।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.