কখন আপনি ডাব্লুপি_কিউয়ারি বনাম কোয়েরি_পোস্টগুলি () বনাম get_posts () ব্যবহার করবেন?


418

দেখে মনে হচ্ছে কোডেক্সের অর্ধেক টিউটোরিয়াল এবং ব্লগস্ফিয়ারের ব্যবহার query_posts()এবং অর্ধ ব্যবহারের চারপাশে WP_Query। চুক্তিটি কি ছিল?


এই পরীক্ষা করে দেখুন আর বিশ্লেষণ
prosti থেকে

উত্তর:


667
  • query_posts()একটি পৃষ্ঠার মূল ক্যোয়ারীটিকে কোয়েরির নতুন উদাহরণ দিয়ে প্রতিস্থাপন করে এটি অতিমাত্রায় সরল এবং সমস্যাযুক্ত উপায়। এটি অদক্ষ (আবার এসকিউএল কোয়েরিগুলি চালায়) এবং কিছু পরিস্থিতিতে সম্পূর্ণ ব্যর্থ হবে (বিশেষত প্রায়শই পোস্ট পৃষ্ঠাগুলি নিয়ে কাজ করার সময়)। যে কোনও আধুনিক ডাব্লুপি কোডকে pre_get_postsএই উদ্দেশ্যে হুক ব্যবহারের মতো আরও নির্ভরযোগ্য পদ্ধতি ব্যবহার করা উচিত । টিএল; ডিআর কখনই ক্যোয়ারী_পোস্টগুলি () ব্যবহার করবেন না

  • get_posts() ব্যবহারের ক্ষেত্রে খুব অনুরূপ এবং একই যুক্তিগুলি গ্রহণ করে (কিছু ডিভান্স সহ বিভিন্ন ডিফল্ট হিসাবে) তবে পোস্টগুলির একটি অ্যারে প্রদান করে, বৈশ্বিক পরিবর্তনগুলি সংশোধন করে না এবং যে কোনও জায়গায় ব্যবহার করা নিরাপদ।

  • WP_Queryএমন এক শ্রেণি যা উভয় পর্দার পিছনেই শক্তি দেয় তবে আপনি এটি তৈরি করতে এবং এটির নিজের উদাহরণ দিয়েও কাজ করতে পারেন। কিছুটা জটিল, কম সীমাবদ্ধতা, যে কোনও জায়গায় ব্যবহার করা নিরাপদ।


8
@ জজেটন query_posts()হ'ল ক্ষুদ্র মোড়ক ফাংশন WP_Query, এটি কেবলমাত্র অতিরিক্ত কাজ করে (ফ্লোচার্ট অনুসারে) $wp_query
গ্লোবালকে

7
@ জাজিটন এর সাথে প্রতিস্থাপন query_posts()করা WP_Queryপারফরম্যান্সে কোনও পার্থক্য তৈরি করবে না, মূল পৃষ্ঠার ক্যোয়ারী এখনও চলবে কারণ এটি মূল বোঝার অংশ। আপনার টেম্পলেট ফাইলটির কোনও লুপ না থাকলেও এই অনুসন্ধানগুলি চলবে।
রাস্ট

116
ডাব্লুপিএসই-র এটি সর্বাধিক জেনারেল এবং উন্নত পোস্টের অনুভূতি থেকে মুক্তি পেতে পারেন না। কোডেক্সেও হওয়া উচিত।
কায়সার

8
আমি কেবলমাত্র "ক্যোয়ারী_পোস্টগুলি ()" ইস্যুটির পারফরম্যান্সের আমার স্পষ্ট বর্ণনাটি যুক্ত করব: টেম্পলেট ফাইলের মধ্যে ক্যোয়ারী_পোস্টগুলি () বা ডাব্লুপিউকিউয়ারি ব্যবহার করার ক্ষেত্রে একই পারফরম্যান্স ব্যয় হবে: আপনার সবেমাত্র সম্পাদিত ক্যোয়ারী। কোডেক্স নিবন্ধে আলোচিত সমস্যাটি হ'ল যদি আপনি আসলে ক্যোয়ারীটি প্রতিস্থাপন করতে চান তবে আপনার 'ক্যালিওকোয়ারি' ফিল্টারটি দিয়ে মূল ক্যোয়ারী_পোস্টগুলি () ফিল্টার করে এমনটি করা উচিত। এইভাবে আপনার কাছে বিশ্রীভাবে প্রতিস্থাপনের জন্য দ্বিতীয় কোয়েরি না করে কেবল একটি, মূল, আকাঙ্ক্ষিত ক্যোয়ারী রয়েছে have ক্যোয়ারী_পোস্টগুলি () উপায় নেই !! না!
জার্কার্ক

22
ডেভেলপার.ওয়ার্ডপ্রেস.কম ব্লগে জন জেমস জ্যাকবির লিখিত ক্যোরিপোস্টগুলির ক্যোয়ারী_পোস্টগুলির একটি চমকপ্রদ বিস্ময়কর ব্যাখ্যা রয়েছে যা এই উত্তরগুলি সমস্ত জল থেকে সরিয়ে দেয়। মূল বিষয়: মূল লুপটি একেবারে সংশোধনquery_posts করে না , এটি ইতিমধ্যে এটি চালানোর পরে এটি প্রতিস্থাপন করে । প্রধান লুপটি সংশোধন করার সর্বোত্তম উপায় হ'ল ফিল্টার। বিকাশকারী.ওয়ার্ডপ্রেস.কমpre_get_posts
ড্যান গেইল

65

query_posts- আপনার কখনই ব্যবহার করা উচিত নয় query_posts। @ রার্স্ট যা বলেছে তা বাদে, সত্যই বড় সমস্যাটি query_postsহ'ল এটি মূল ক্যোয়ারী অবজেক্টকে (সঞ্চিত $wp_query) ভেঙে দেয় । প্রচুর প্লাগইন এবং কাস্টম কোড মূল ক্যোয়ারী অবজেক্টের উপর নির্ভর করে, তাই মূল ক্যোয়ারী অবজেক্টটি ভাঙার অর্থ আপনি প্লাগইন এবং কাস্টম কোডের কার্যকারিতা ভঙ্গ করছেন। যেমন একটি ফাংশন হ'ল সমস্ত গুরুত্বপূর্ণ পৃষ্ঠাগুলি ফাংশন, সুতরাং আপনি যদি মূল ক্যোয়ারীটি ভাঙ্গেন তবে আপনি পৃষ্ঠাটি ভাঙেন।

যে query_postsকোনও টেম্পলেটে কতটা খারাপ তা প্রমাণ করার জন্য, নিম্নলিখিতটি করুন এবং ফলাফলগুলি তুলনা করুন

var_dump( $wp_query );
query_posts( '&posts_per_page=-1' );
var_dump( $wp_query );

get_postsএবং মাধ্যমিক প্রশ্নগুলি ( সম্পর্কিত পোস্ট, স্লাইডার, বৈশিষ্ট্যযুক্ত সামগ্রী এবং স্ট্যাটিক প্রথম পৃষ্ঠাগুলির সামগ্রীর মতো)WP_Query তৈরির সঠিক উপায় । এটি লক্ষ করা উচিত, আপনি হোম পৃষ্ঠায়, একক পৃষ্ঠায় বা কোনও ধরণের সংরক্ষণাগার পৃষ্ঠায় মূল প্রশ্নের সন্ধানের জন্য দু'এর একটিও ব্যবহার করবেন না কারণ এটি পৃষ্ঠার কার্যকারিতা ভঙ্গ করবে। আপনার যদি মূল ক্যোয়ারীটি সংশোধন করতে হয় তবে তা করার জন্য ব্যবহার করুন এবং কাস্টম কোয়েরি নয়। ( আপডেট): স্ট্যাটিক সম্মুখ পৃষ্ঠাগুলি এবং সত্য পৃষ্ঠাগুলির জন্য, সত্য পৃষ্ঠাগুলি এবং স্থির সম্মুখ পৃষ্ঠাগুলিতে pre_get_posts ব্যবহার করে দেখুন *)pre_get_posts

সংক্ষেপে, WP_Queryমূল ক্যোয়ারী দ্বারা ব্যবহৃত হয় এবং এটি দ্বারা ব্যবহৃত হয় get_posts, তবে যদিও get_posts()ব্যবহার হয় তবে WP_Queryকয়েকটি পার্থক্য রয়েছে

  • get_postsতুলনায় দ্রুত WP_Query। মার্জিন সাইটের মোট পোস্টের পরিমাণের উপর নির্ভর করে। এর কারণ হ'ল, ডিফল্টরূপে get_postsচলে যায় যেখানে কোনও এড়িয়ে যায় / আইনত প্যাজিগেশন ভাঙে। এর সাথে , পোস্টগুলির পরিমাণ জিজ্ঞাসিত হয়, পরে ব্যাল আউট হয়ে যায়, যেখানে ডিফল্টরূপে এটি পৃষ্ঠাগুলি গণনা করার জন্য ক্যোয়ারীর সাথে মেলে সমস্ত পোস্ট অনুসন্ধান করে।'no_found_rows' => trueWP_Query'no_found_rows' => trueWP_Query

    এই কারণে, get_posts()কেবলমাত্র অচিহ্নবদ্ধ প্রশ্নের জন্য ব্যবহার করা উচিত। প্যাটিং get_postsকরা সত্যিই একটি বড় জগাখিচুড়ি। WP_Queryসমস্ত পৃষ্ঠাযুক্ত প্রশ্নের জন্য ব্যবহার করা উচিত

  • get_posts()এই ফিল্টারগুলি দ্বারা প্রভাবিত হয় posts_*যেখানে ফিল্টার দ্বারা প্রভাবিত হয় না WP_Query। কারণ যে get_posts, ডিফল্টরূপে, পাসের 'suppress_filters' => trueজন্যWP_Query

  • get_postsমত অতিরিক্ত পরামিতি একটি দম্পতি আছে include, exclude, numberpostsএবং category। এই পরামিতিগুলি WP_Queryপাস করার আগে বৈধ পরামিতিগুলিতে পরিবর্তিত হয় WP_Queryincludeপরিবর্তিত হয় post__in, excludeমধ্যে post__not_in, categoryমধ্যে catএবং numberpostsমধ্যে posts_per_page। কেবলমাত্র একটি নোট, সমস্ত প্যারামিটার যা দিয়ে WP_Queryকাজ করা যেতে পারে get_posts, আপনি সেগুলির ডিফল্ট পরামিতিগুলি উপেক্ষা করতে এবং ব্যবহার করতে পারবেন নাget_posts

  • get_postsসম্পূর্ণ বস্তুটি ফেরত দেওয়ার সময় কেবল তার $postsসম্পত্তি প্রদান করে । শর্তসাপেক্ষ, পৃষ্ঠাবদ্ধকরণ এবং লুপের অভ্যন্তরে ব্যবহার করা যেতে পারে এমন অন্যান্য দরকারী তথ্যের ক্ষেত্রে এই অবজেক্টটি বেশ কার্যকর।WP_QueryWP_Query

  • get_postsলুপ ব্যবহার করে না, তবে foreachপোস্টগুলি প্রদর্শনের জন্য একটি লুপ ব্যবহার করে । এছাড়াও, কোনও টেম্পলেট ট্যাগ ডিফল্টরূপে উপলব্ধ। setup_postdata( $post )টেমপ্লেট ট্যাগগুলি উপলভ্য করতে ব্যবহার করতে হবে। WP_Queryলুপ এবং টেমপ্লেট ট্যাগগুলি ডিফল্টরূপে উপলব্ধ

  • get_postsএ চলে 'ignore_sticky_posts' => 1যায় WP_Query, তাই get_postsডিফল্টরূপে স্টিকি পোস্টগুলিকে উপেক্ষা করে

উপরের উপর ভিত্তি করে, ব্যবহার করতে হবে get_postsবা আপনার উপর নির্ভর করে WP_Queryএবং কোয়েরি থেকে আপনার আসলে কী দরকার। উপরেরগুলি আপনার পছন্দমতো আপনাকে গাইড করবে


1
আমি চাই আমি উত্তর পছন্দ করতে পারে। এটি এত ব্যাখ্যা করে।
প্যাট্রিক এলিয়েনাস

1
দুর্দান্ত ব্যাখ্যা! "get_posts () কেবলমাত্র অচিরাচরিত প্রশ্নের জন্য ব্যবহার করা উচিত get
বুলিয়ান

32

মূল পার্থক্যটি হ'ল query_posts()কেবলমাত্র বর্তমান লুপটি সংশোধন করার জন্য। একবার শেষ হয়ে গেলে লুপটি পুনরায় সেট করা এবং এটি তার আনন্দের পথে প্রেরণ করা প্রয়োজন। এই পদ্ধতিটি বোঝার জন্যও কিছুটা সহজ, কেবল কারণ আপনার "ক্যোয়ারী" মূলত একটি ইউআরএল স্ট্রিং যা আপনি ফাংশনে পৌঁছান, তেমন:

query_posts('meta_key=color&meta_value=blue'); 

অন্যদিকে, WP_Queryএকটি সাধারণ উদ্দেশ্য হাতিয়ার বেশি, এবং আরও সরাসরি মাইএসকিউএল প্রশ্নের লেখার চেয়ে ভালো হয় query_posts()হয়। আপনি এটিকে যে কোনও জায়গায় (কেবলমাত্র লুপে নয়) ব্যবহার করতে পারেন এবং এটি বর্তমানে চলমান কোনও পোস্ট প্রশ্নের সাথে হস্তক্ষেপ করে না।

আমি WP_Queryআরও প্রায়ই ব্যবহার করার ঝোঁক , যেমন এটি হয়। সত্যিই, এটি আপনার নির্দিষ্ট ক্ষেত্রে নেমে আসতে চলেছে।


15

ব্যবহার করার দরকার নেই query_posts()। এটি যা করে তা হ'ল একটি নতুন ডাব্লুপি_কিউয়ারি আইটেমটি ইনস্ট্যান্ট করে এবং সেই নতুন অবজেক্টটিকে পুনরায় নিযুক্ত করে global wp_query

রেফারেন্সের জন্য, নিম্নলিখিতটি আসল query_posts()ফাংশন।

 function query_posts($query) {
        $GLOBALS['wp_query'] = new WP_Query();
        return $GLOBALS['wp_query']->query($query);
    }

আপনি যদি গভীরতার কাস্টম কোয়েরি স্ক্রিপ্ট তৈরি করতে চান তবে আপনার নিজের WP_Query অবজেক্টটি ইনস্ট্যান্ট করুন। বা get_posts()আপনাকে যা করতে হবে তা ব্যবহার করুন এখানে এবং সেখানে কিছু হালকা ম্যানিপুলেশন।

উভয় ক্ষেত্রেই, আমি নিজেকে অত্যন্ত অনুগ্রহ wp_includes/query.phpকরে WP_Queryক্লাসে যাওয়া এবং অনুধাবন করার পরামর্শ দিচ্ছি ।


14

নিশ্চিত হয়ে নিন যে আপনি ব্যবহারের wp_reset_query()পরে ব্যবহার করেছেন query_posts()কারণ এটি অন্যান্য প্রশ্নের ফলাফলকেও প্রভাবিত করবে।


10

যদি আমি সঠিকভাবে পড়ার কথা মনে করি তবে মূলত "লুপ" WP_Queryমূল ফাইলগুলিতে করছে তবে সহজে বোঝার উপায়।


6
  • ক্যোয়ারী_পোস্টগুলি () : আপনি যদি মূল জিজ্ঞাসাটি সংশোধন করতে চান তবে একমাত্র ক্ষেত্রেই এটি ব্যবহৃত হতে পারে। এটি প্রচুর বৈশ্বিক চলক নির্ধারণ করে;
  • get_posts () : এটি মেকানিক্সের ক্ষেত্রে খুব অনুরূপ এবং একই যুক্তি গ্রহণ করে, তবে পোস্টের অ্যারে দেয়
  • ডাব্লুপি_কিউয়ারি : আপনি এটির নিজস্ব অবজেক্ট তৈরি এবং কাজ করতে পারেন। বিট আরও জটিল, কম সীমাবদ্ধতা, এটি যে কোনও জায়গায় ব্যবহার করা নিরাপদ।

-6

আমি বলব get_posts()একটি প্লাগইন ব্যবহার করবেন না । এটি কিছু ক্ষেত্রে (সেট এর suppress_filters, ignore_sticky_postsইত্যাদি) খুব সীমাবদ্ধ ফিল্টার আরোপ করে এবং আপনি যখন কিছু দ্রুত করতে চান তখন সম্ভবত কোনও থিমে ব্যবহার করা উচিত।

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