প্রয়োজনীয় প্রশ্ন
ত্রয়ী মধ্যে আসুন খনন: ::query_posts
, ::get_posts
এবং class WP_Query
বুঝতে ::query_posts
ভালো।
ওয়ার্ডপ্রেসে ডেটা পাওয়ার মূল ভিত্তিটি হল WP_Query
ক্লাস। উভয় পদ্ধতি ::query_posts
এবং ::get_posts
এই শ্রেণীর ব্যবহার।
নোট করুন যে শ্রেণিতে WP_Query
একই নামের পদ্ধতি রয়েছে: WP_Query::query_posts
এবং WP_Query::get_posts
, কিন্তু আমরা আসলে কেবলমাত্র বৈশ্বিক পদ্ধতিগুলি বিবেচনা করি, তাই বিভ্রান্ত হবেন না।
বোঝা WP_Query
বলা ক্লাসটি WP_Query
2004 সালে আবার চালু হয়েছিল 2004 (ছাতা) চিহ্নযুক্ত সমস্ত ক্ষেত্র যেখানে 2004 সালে উপস্থিত ছিল The
এখানে WP_Query
কাঠামোটি রয়েছে:
class WP_Query (as in WordPress v4.7)
public $query; ☂
public $query_vars = array(); ☂
public $tax_query;
public $meta_query = false;
public $date_query = false;
public $queried_object; ☂
public $queried_object_id; ☂
public $request;
public $posts; ☂
public $post_count = 0; ☂
public $current_post = -1; ☂
public $in_the_loop = false;
public $post; ☂
public $comments;
public $comment_count = 0;
public $current_comment = -1;
public $comment;
public $found_posts = 0;
public $max_num_pages = 0;
public $max_num_comment_pages = 0;
public $is_single = false; ☂
public $is_preview = false; ☂
public $is_page = false; ☂
public $is_archive = false; ☂
public $is_date = false; ☂
public $is_year = false; ☂
public $is_month = false; ☂
public $is_day = false; ☂
public $is_time = false; ☂
public $is_author = false; ☂
public $is_category = false; ☂
public $is_tag = false;
public $is_tax = false;
public $is_search = false; ☂
public $is_feed = false; ☂
public $is_comment_feed = false;
public $is_trackback = false; ☂
public $is_home = false; ☂
public $is_404 = false; ☂
public $is_embed = false;
public $is_paged = false;
public $is_admin = false; ☂
public $is_attachment = false;
public $is_singular = false;
public $is_robots = false;
public $is_posts_page = false;
public $is_post_type_archive = false;
private $query_vars_hash = false;
private $query_vars_changed = true;
public $thumbnails_cached = false;
private $stopwords;
private $compat_fields = array('query_vars_hash', 'query_vars_changed');
private $compat_methods = array('init_query_flags', 'parse_tax_query');
private function init_query_flags()
WP_Query
সুইস সেনা ছুরি।
সম্পর্কে কিছু জিনিস WP_Query
:
- এটি এমন কিছু যা আপনি আর্গুমেন্টের মাধ্যমে নিয়ন্ত্রণ করতে পারেন
- এটি ডিফল্টরূপে লোভী
- এটি লুপিংয়ের জন্য পদার্থটি ধারণ করে
- এটি গ্লোবাল স্পেস x2 এ সংরক্ষিত হয়েছে
- এটি প্রাথমিক বা গৌণ হতে পারে
- এটি সহায়ক শ্রেণি ব্যবহার করে
- এটি একটি সহজ
pre_get_posts
হুক আছে
- এমনকি এটি নেস্টেড লুপগুলির জন্য সমর্থন রয়েছে
- এটিতে এসকিউএল কোয়েরি স্ট্রিং রয়েছে
- এটি ফলাফলের সংখ্যা ধারণ করে
- এটি ফলাফল ধারণ করে
- এটি সমস্ত সম্ভাব্য ক্যোয়ারী আর্গুমেন্টের তালিকা ধারণ করে
- এটি টেম্পলেট পতাকা ধারণ করে
- ...
আমি এই সমস্ত ব্যাখ্যা করতে পারি না, তবে এর মধ্যে কয়েকটি কৌশলপূর্ণ, তাই আসুন সংক্ষিপ্ত টিপস সরবরাহ করুন।
WP_Query
এমন কিছু যা আপনি আর্গুমেন্টের মাধ্যমে নিয়ন্ত্রণ করতে পারেন
The list of the arguments
---
attachment
attachment_id
author
author__in
author__not_in
author_name
cache_results
cat
category__and
category__in
category__not_in
category_name
comments_per_page
day
embed
error
feed
fields
hour
ignore_sticky_posts
lazy_load_term_meta
m
menu_order
meta_key
meta_value
minute
monthnum
name
no_found_rows
nopaging
order
p
page_id
paged
pagename
post__in
post__not_in
post_name__in
post_parent
post_parent__in
post_parent__not_in
post_type
posts_per_page
preview
s
second
sentence
static
subpost
subpost_id
suppress_filters
tag
tag__and
tag__in
tag__not_in
tag_id
tag_slug__and
tag_slug__in
tb
title
update_post_meta_cache
update_post_term_cache
w
year
ওয়ার্ডপ্রেস সংস্করণ 4.7 থেকে এই তালিকাটি ভবিষ্যতে অবশ্যই পরিবর্তিত হবে।
এটি WP_Query
আর্গুমেন্ট থেকে অবজেক্ট তৈরি করা সর্বনিম্ন উদাহরণ হবে :
// WP_Query arguments
$args = array ( /* arguments*/ );
// creating the WP_Query object
$query = new WP_Query( $args );
// print full list of arguments WP_Query can take
print ( $query->query_vars );
WP_Query
লোভী হয়
ধারণাটির ভিত্তিতে তৈরি get all you can
ওয়ার্ডপ্রেস বিকাশকারীরা সম্ভাব্য সমস্ত ডেটা তাড়াতাড়ি পাওয়ার সিদ্ধান্ত নিয়েছেন কারণ এটি পারফরম্যান্সের পক্ষে ভাল । এই কারণেই যখন ডিফল্টরূপে ক্যোয়ারী ডাটাবেস থেকে 10 টি পোস্ট নেয় তখন এটি পৃথক প্রশ্নের মাধ্যমে এই পদগুলির জন্য পদগুলি এবং মেটাডেটাও পাবেন। শর্তাদি এবং মেটাডেটা ক্যাশে করা হবে (পূর্বনির্ধারিত)।
নোট করুন ক্যাচিং কেবলমাত্র একক অনুরোধের আজীবন।
আপনি সেট করা থাকলে update_post_meta_cache
এবং সেটিংস সেট update_post_term_cache
করার false
সময় আপনি ক্যাচিংটি অক্ষম করতে পারেনWP_Query
আর্গুমেন্ট । যখন ক্যাচিং অক্ষম করা হয় কেবলমাত্র চাহিদা অনুযায়ী ডাটাবেস থেকে ডেটা অনুরোধ করা হবে।
বেশিরভাগ ওয়ার্ডপ্রেস ব্লগের জন্য ক্যাশেগুলি ভালভাবে কাজ করে তবে কিছু সময় এমন হয় যখন আপনি ক্যাচিং অক্ষম করতে পারেন।
WP_Query
সহায়ক ক্লাস ব্যবহার করে
যদি আপনি WP_Query
সেখানে ক্ষেত্রগুলি পরীক্ষা করে থাকেন তবে আপনার এই তিনটি রয়েছে:
public $tax_query;
public $meta_query;
public $date_query;
আপনি ভবিষ্যতে নতুন যোগ করার কল্পনা করতে পারেন।
WP_Query
লুপিংয়ের জন্য পদার্থটি ধারণ করে
এই কোডে:
$query = new WP_Query( $args )
if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
$query->the_post();
আপনি খেয়াল WP_Query
করতে পারেন যে পদার্থটি আপনি পুনরাবৃত্তি করতে পারেন। সহায়তার পদ্ধতিগুলিও রয়েছে। আপনি কেবল while
লুপ সেট করেছেন ।
বিঃদ্রঃ. for
এবং while
লুপগুলি শব্দার্থগতভাবে সমতুল্য।
WP_Query
প্রাথমিক ও মাধ্যমিক
ওয়ার্ডপ্রেসে আপনার একটি প্রাথমিক এবং শূন্য বা আরও বেশি মাধ্যমিক অনুসন্ধান রয়েছে।
প্রাথমিক জিজ্ঞাসা না থাকা সম্ভব, তবে এটি এই নিবন্ধের আওতার বাইরে।
প্রধান ক্যোয়ারী বা নিয়মিত ক্যোয়ারী হিসাবে পরিচিত প্রাথমিক ক্যোয়ারী । মাধ্যমিক ক্যোয়ারিকে কাস্টম কোয়েরিও বলা হয় ।
ওয়ার্ডপ্রেসটি WP_Rewrite
ইউআরএলের উপর ভিত্তি করে ক্যোয়ারী আর্গুমেন্ট তৈরি করতে প্রাথমিক শ্রেণি ব্যবহার করে। এই যুক্তিগুলির ভিত্তিতে এটি দুটি বিশ্বব্যাপী অভিন্ন বস্তু সংরক্ষণ করে। এই উভয়ই মূল জিজ্ঞাসা করবে।
global $wp_query @since WordPress 1.5
global $wp_the_query @since WordPress 2.1
যখন আমরা প্রধান ক্যোয়ারি বলি তখন আমরা এই ভেরিয়েবলগুলি মনে করি। অন্যান্য প্রশ্নগুলিকে মাধ্যমিক বা প্রথা বলা যেতে পারে।
এটি ব্যবহার করা সম্পূর্ণরূপে আইনী global $wp_query
বা হয়$GLOBALS['wp_query']
, কিন্তু দ্বিতীয় স্বরলিপি ব্যবহার অনেক বেশি উল্লেখযোগ্য, এবং ফাংশন পরিধি ভিতরে একটি অতিরিক্ত লাইন টাইপ পরিমাণ সঞ্চয় হয়।
$GLOBALS['wp_query']
এবং $GLOBALS['wp_the_query']
পৃথক বস্তু হয়। $GLOBALS['wp_the_query']
হিমশীতল থাকা উচিত
WP_Query
হ্যান্ড pre_get_posts
হুক আছে
এটি অ্যাকশন হুক। এটি যে কোনও WP_Query
উদাহরণে প্রযোজ্য হবে । আপনি এটিকে ডাকেন:
add_action( 'pre_get_posts', function($query){
if ( is_category() && $query->is_main_query() ) {
// set your improved arguments
$query->set( ... );
...
}
return $query;
});
এই হুক দুর্দান্ত এবং এটি কোনও কোয়েরি আর্গুমেন্ট পরিবর্তন করতে পারে।
আপনি যা পড়তে পারেন তা এখানে :
ক্যোয়ারী ভেরিয়েবল অবজেক্ট তৈরি হওয়ার পরে আগুন লেগেছে, তবে আসল কোয়েরি চালানোর আগে।
সুতরাং এই হুক আর্গুমেন্ট ম্যানেজার কিন্তু নতুন WP_Query
অবজেক্ট তৈরি করতে পারে না । আপনার যদি একটি প্রাথমিক এবং একটি মাধ্যমিক কোয়েরি থাকে pre_get_posts
তবে তৃতীয়টি তৈরি করতে পারবেন না। অথবা আপনার যদি সবেমাত্র একটি প্রাথমিক থাকে তবে এটি মাধ্যমিকটি তৈরি করতে পারে না।
নোটের ক্ষেত্রে যদি আপনাকে মূল ক্যোয়ারীটি পরিবর্তন করতে হয় তবে আপনি কেবল request
হুকটিও ব্যবহার করতে পারেন ।
WP_Query
নেস্টেড লুপগুলিকে সমর্থন করে
আপনি যদি প্লাগইন ব্যবহার করেন এবং আপনি টেমপ্লেট থেকে প্লাগইন ফাংশন কল করেন তবে এই দৃশ্যপট ঘটতে পারে।
এখানে নেস্টেড লুপগুলির জন্য ওয়ার্ডপ্রেসটির সহায়তা কার্যকারিতা রয়েছে যা শোকেস উদাহরণটি এখানে:
global $id;
while ( have_posts() ) : the_post();
// the custom $query
$query = new WP_Query( array( 'posts_per_page' => 5 ) );
if ( $query->have_posts() ) {
while ( $query->have_posts() ) : $query->the_post();
echo '<li>Custom ' . $id . '. ' . get_the_title() . '</li>';
endwhile;
}
wp_reset_postdata();
echo '<li>Main Query ' . $id . '. ' . get_the_title() . '</li>';
endwhile;
থিম ইউনিট পরীক্ষার ডেটা ইনস্টল করার পরে আউটপুটটি এরকম হবে :
Custom 100. Template: Sticky
Custom 1. Hello world!
Custom 10. Markup: HTML Tags and Formatting
Custom 11. Markup: Image Alignment
Custom 12. Markup: Text Alignment
Custom 13. Markup: Title With Special Characters
Main Query 1. Hello world!
আমি কাস্টম-কোয়েরিতে 5 টি পোস্টের জন্য অনুরোধ করলেও এটি আমাকে ছয়টি ফিরিয়ে দেবে, কারণ স্টিকি পোস্টটি পাশাপাশি চলে যাবে। wp_reset_postdata
পূর্ববর্তী উদাহরণে যদি না থাকে তবে আউটপুটটি এর মতো হবে, কারণটি $GLOBALS['post']
অবৈধ।
Custom 1001. Template: Sticky
Custom 1. Hello world!
Custom 10. Markup: HTML Tags and Formatting
Custom 11. Markup: Image Alignment
Custom 12. Markup: Text Alignment
Custom 13. Markup: Title With Special Characters
Main Query 13. Markup: Title With Special Characters
WP_Query
হয়েছে wp_reset_query
ফাংশন
এটি রিসেট বোতামের মতো। $GLOBALS['wp_the_query']
সর্বদা হিমশীতল হওয়া উচিত, এবং প্লাগইন বা থিমগুলি কখনই এটি পরিবর্তন করে না।
এখানে কি wp_reset_query
করবেন:
function wp_reset_query() {
$GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];
wp_reset_postdata();
}
মন্তব্য get_posts
get_posts
দেখতে
File: /wp-includes/post.php
1661: function get_posts( $args = null ) {
1662: $defaults = array(
1663: 'numberposts' => 5,
1664: 'category' => 0, 'orderby' => 'date',
1665: 'order' => 'DESC', 'include' => array(),
1666: 'exclude' => array(), 'meta_key' => '',
1667: 'meta_value' =>'', 'post_type' => 'post',
1668: 'suppress_filters' => true
1669: );
... // do some argument parsing
1685: $r['ignore_sticky_posts'] = true;
1686: $r['no_found_rows'] = true;
1687:
1688: $get_posts = new WP_Query;
1689: return $get_posts->query($r);
ভবিষ্যতে লাইন নম্বরগুলি পরিবর্তন হতে পারে।
এটি শুধু একটি হল মোড়কের প্রায় WP_Query
যে আয় ক্যোয়ারী বস্তুর পোস্ট নেই।
ignore_sticky_posts
সত্য মানে সেট চটচটে পোস্ট শুধুমাত্র একটি প্রাকৃতিক অবস্থানে দেখানো হতে পারে। সামনে কোনও স্টিকি পোস্ট থাকবে না। no_found_rows
সত্যে সেট করা অন্যটি অর্থ ওয়ার্ডপ্রেস ডাটাবেস এপিআই ব্যবহারের SQL_CALC_FOUND_ROWS
সময়সীমার প্রয়োগের জন্য ব্যবহার করবে না , পাওয়া সারিগুলির গণনা কার্যকর করতে ডাটাবেসে লোড হ্রাস করবে ।
আপনার যখন পৃষ্ঠাগুলির প্রয়োজন হয় না তখন এটি কার্যকর। আমরা এখন বুঝতে পেরেছি যে এই প্রশ্নের সাথে আমরা এই ফাংশনটি নকল করতে পারি:
$args = array ( 'ignore_sticky_posts' => true, 'no_found_rows' => true);
$query = new WP_Query( $args );
print( $query->request );
এখানে সম্পর্কিত এসকিউএল অনুরোধ রইল:
SELECT 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, 10
পূর্ববর্তী এসকিউএল অনুরোধ যেখানে SQL_CALC_FOUND_ROWS
উপস্থিত রয়েছে তার সাথে আমাদের এখন তুলনা করুন ।
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, 10
বিনা অনুরোধটি SQL_CALC_FOUND_ROWS
দ্রুত হবে।
মন্তব্য query_posts
টিপ: ২০০৪ সালে প্রথমে কেবল ছিল global $wp_query
। ওয়ার্ডপ্রেস হিসাবে 2.1 সংস্করণ $wp_the_query
আসে। টিপ: $GLOBALS['wp_query']
এবং $GLOBALS['wp_the_query']
পৃথক বস্তু।
query_posts()
হয় WP_Query
মোড়কের। এটি মূল WP_Query
অবজেক্টের রেফারেন্স দেয় এবং একই সাথে এটি সেট করে global $wp_query
।
File: /wp-includes/query.php
function query_posts($args) {
$GLOBALS['wp_query'] = new WP_Query();
return $GLOBALS['wp_query']->query($args);
}
পিএইচপি 4 এ অবজেক্টস সহ সমস্ত কিছু মান দিয়ে পাস হয়েছিল। query_posts
এই মত ছিল:
File: /wp-includes/query.php (WordPress 3.1)
function &query_posts($args) {
unset($GLOBALS['wp_query']);
$GLOBALS['wp_query'] =& new WP_Query();
return $GLOBALS['wp_query']->query($args);
}
একটি প্রাথমিক এবং একটি গৌণ ক্যোয়ারী সহ সাধারণ দৃশ্যে আমাদের এই তিনটি ভেরিয়েবল রয়েছে নোট করুন:
$GLOBALS['wp_the_query']
$GLOBALS['wp_query'] // should be the copy of first one
$custom_query // secondary
ধরা যাক এই তিনটির প্রত্যেকেরই 1M মেমরি লাগে। মোট স্মৃতি 3M হবে। যদি আমরা ব্যবহার query_posts
, $GLOBALS['wp_query']
সেট না করে আবার তৈরি করা হবে।
পিএইচপি 5 + হ'ল স্মার্টটি খালি খালি করা উচিত $GLOBALS['wp_query']
, যেমন পিএইচপি 4 এর মতো আমরা এটি দিয়েছিলামunset($GLOBALS['wp_query']);
function query_posts($args) {
$GLOBALS['wp_query'] = new WP_Query();
return $GLOBALS['wp_query']->query($args);
}
ফলস্বরূপ query_posts
মোট 2M মেমরি গ্রহণ করে, যখন get_posts
3M মেমরি গ্রহণ করে।
মনে রাখবেন query_posts
আমরা আসল বস্তুটি ফিরিয়ে দিচ্ছি না, তবে বস্তুর একটি উল্লেখ।
পিএইচপি নেট থেকে : পিএইচপি রেফারেন্স একটি উপনাম, যা দুটি ভিন্ন ভিন্ন ভেরিয়েবলকে একই মানটিতে লেখার অনুমতি দেয়। পিএইচপি 5 হিসাবে, কোনও অবজেক্ট ভেরিয়েবলটিতে সেই বস্তুটি আর মান হিসাবে থাকে না। এটিতে কেবল একটি অবজেক্ট আইডেন্টিফায়ার রয়েছে যা অবজেক্ট অ্যাকসেসরদের প্রকৃত অবজেক্টটি সন্ধান করতে দেয়। যখন কোনও বস্তু আর্গুমেন্টের মাধ্যমে প্রেরণ করা হয়, ফেরত দেওয়া হয় বা অন্য ভেরিয়েবলের কাছে বরাদ্দ করা হয়, তখন বিভিন্ন ভেরিয়েবলের উপকরণ নয়: এগুলি সনাক্তকারীটির একটি অনুলিপি রাখে, যা একই বস্তুকে নির্দেশ করে।
এছাড়াও পিএইচপি 5 + এ্যাসাইন (=) অপারেটরটি স্মার্ট। এটি অগভীর অনুলিপি ব্যবহার করবে এবং হার্ড অবজেক্ট কপি ব্যবহার করবে না। যখন আমরা এটি লিখি $GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];
কেবলমাত্র ডেটা অনুলিপি করা হবে, পুরো বস্তুটি নয় কারণ এইগুলি একই বস্তুর প্রকারের ভাগ করে।
এখানে একটি উদাহরণ
print( md5(serialize($GLOBALS['wp_the_query']) ) );
print( md5(serialize($GLOBALS['wp_query'] ) ) );
query_posts( '' );
print( md5(serialize($GLOBALS['wp_the_query']) ) );
print( md5(serialize($GLOBALS['wp_query'] ) ) );
ফলাফল হবে:
f14153cab65abf1ea23224a1068563ef
f14153cab65abf1ea23224a1068563ef
f14153cab65abf1ea23224a1068563ef
d6db1c6bfddac328442e91b6059210b5
কোয়েরিটি পুনরায় সেট করার চেষ্টা করুন:
print( md5(serialize($GLOBALS['wp_the_query'] ) ) );
print( md5(serialize($GLOBALS['wp_query'] ) ) );
query_posts( '' );
wp_reset_query();
print( md5(serialize($GLOBALS['wp_the_query'] ) ) );
print( md5(serialize($GLOBALS['wp_query'] ) ) );
ফলাফল হবে:
f14153cab65abf1ea23224a1068563ef
f14153cab65abf1ea23224a1068563ef
f14153cab65abf1ea23224a1068563ef
f14153cab65abf1ea23224a1068563ef
আপনি ব্যবহার করেও সমস্যা তৈরি করতে পারেন WP_Query
print( md5(serialize($GLOBALS['wp_the_query'] ) ) );
print( md5(serialize($GLOBALS['wp_query'] ) ) );
global $wp_query;
$wp_query = new WP_Query( array( 'post_type' => 'post' ) );
print( md5(serialize($GLOBALS['wp_the_query'] ) ) );
print( md5(serialize($GLOBALS['wp_query'] ) ) );
অবশ্যই, সমাধানটি wp_reset_query
আবার ফাংশন ব্যবহার করা হবে।
print( md5(serialize($GLOBALS['wp_the_query'] ) ) );
print( md5(serialize($GLOBALS['wp_query'] ) ) );
global $wp_query;
$wp_query = new WP_Query( array( 'post_type' => 'post' ) );
wp_reset_query();
print( md5(serialize($GLOBALS['wp_the_query'] ) ) );
print( md5(serialize($GLOBALS['wp_query'] ) ) );
এ কারণেই আমি মনে করি query_posts
স্মৃতি দৃষ্টিভঙ্গি থেকে ভাল হতে পারে। তবে আপনার সবসময় wp_reset_query
কৌতুক করা উচিত ।