সমস্যাটি
ডিফল্টরূপে, যে কোনও প্রসঙ্গে, ওয়ার্ডপ্রেস পৃষ্ঠাগুলি নির্ধারণের জন্য মূল ক্যোয়ারী ব্যবহার করে। মূল ক্যোয়ারী অবজেক্টটি $wp_queryবিশ্বব্যাপী সংরক্ষণ করা হয় , যা মূল ক্যোয়ারী লুপ আউটপুট করতে ব্যবহৃত হয়:
if ( have_posts() ) : while ( have_posts() ) : the_post();
আপনি যখন একটি কাস্টম ক্যোয়ারী ব্যবহার করেন , আপনি সম্পূর্ণ পৃথক ক্যোয়ারী অবজেক্ট তৈরি করেন:
$custom_query = new WP_Query( $custom_query_args );
এবং এই ক্যোয়ারীটি সম্পূর্ণ আলাদা লুপের মাধ্যমে আউটপুট হয়:
if ( $custom_query->have_posts() ) :
while ( $custom_query->have_posts() ) :
$custom_query->the_post();
কিন্তু সহ পত্রাঙ্কন টেমপ্লেট ট্যাগ, previous_posts_link(), next_posts_link(), posts_nav_link(), এবং paginate_links(), তাদের আউটপুট বেস প্রধান ক্যোয়ারী বস্তুর , $wp_query। এই মূল ক্যোয়ারী পৃষ্ঠাবদ্ধ বা নাও থাকতে পারে। যদি বর্তমান প্রসঙ্গটি কোনও কাস্টম পৃষ্ঠার টেম্পলেট হয়, উদাহরণস্বরূপ, মূল $wp_queryঅবজেক্টটি কেবল একটি একক পোস্ট নিয়ে থাকবে - সেই পৃষ্ঠার আইডি যা কাস্টম পৃষ্ঠার টেম্পলেটটি নির্ধারিত হয়েছে।
যদি বর্তমান প্রসঙ্গটি কোনও প্রকারের সংরক্ষণাগার সূচক হয় তবে প্রধান $wp_queryপৃষ্ঠায় পৃষ্ঠাগুলি সৃষ্টির জন্য পর্যাপ্ত পোস্ট থাকতে পারে যা সমস্যার পরবর্তী অংশের দিকে নিয়ে যায়: মূল $wp_queryঅবজেক্টের জন্য ওয়ার্ডপ্রেস কোয়েরিতে একটি paged পরামিতি পাস করবে , তার উপর ভিত্তি করে pagedইউআরএল ক্যোয়ারী ভেরিয়েবল। যখন ক্যোয়ারীটি আনা হবে, তখন সেই pagedপ্যারামিটারটি ফিরিয়ে আনার জন্য কোন সেট পৃষ্ঠাতে পোস্ট করা হবে তা নির্ধারণ করতে ব্যবহৃত হবে। যদি প্রদর্শিত পৃষ্ঠাগুলি লিঙ্কটি ক্লিক করা হয় এবং পরের পৃষ্ঠাটি লোড করা হয়, তবে আপনার কাস্টম ক্যোরিয়ামটি জানার কোনও উপায় থাকবে না যে পৃষ্ঠাগুলি পরিবর্তন হয়েছে ।
সমাধান
কাস্টম ক্যোয়ারিতে সঠিক পেজ প্যারামিটার পাস করা
ধরে নিচ্ছি যে কাস্টম ক্যোয়ারী একটি আরোগুলি অ্যারে ব্যবহার করে:
$custom_query_args = array(
// Custom query parameters go here
);
আপনাকে pagedঅ্যারেতে সঠিক পরামিতিটি দিতে হবে। আপনি এটির মাধ্যমে বর্তমান পৃষ্ঠাটি নির্ধারণ করতে ব্যবহৃত URL ক্যোয়ারী ভেরিয়েবলটি আনার মাধ্যমে এটি করতে পারেন get_query_var():
get_query_var( 'paged' );
এরপরে আপনি আপনার কাস্টম ক্যোয়ারী আরগস অ্যারেতে সেই প্যারামিটারটি যুক্ত করতে পারেন:
$custom_query_args['paged'] = get_query_var( 'paged' )
? get_query_var( 'paged' )
: 1;
দ্রষ্টব্য: আপনার পৃষ্ঠার একটি হয়, তাহলে স্ট্যাটিক সামনে পাতা ব্যবহার নিশ্চিত করা pageপরিবর্তে pagedএকটি স্ট্যাটিক সামনে পাতা ব্যবহার যেমন pageএবং paged। একটি স্থিতিশীল সম্মুখ পৃষ্ঠার জন্য আপনার এটি হওয়া উচিত
$custom_query_args['paged'] = get_query_var( 'page' )
? get_query_var( 'page' )
: 1;
এখন, কাস্টম ক্যোয়ারী আনার সময়, পৃষ্ঠাযুক্ত পোস্টগুলির সঠিক সেটটি ফিরে আসবে।
পৃষ্ঠাগুলি ফাংশনগুলির জন্য কাস্টম ক্যোয়ারী অবজেক্ট ব্যবহার করা
পৃষ্ঠার জন্য সঠিক ক্রিয়াকলাপ উত্পন্ন করার জন্য - যেমন কাস্টম ক্যোয়ারীর সাথে সম্পর্কিত পূর্ববর্তী / পরবর্তী / পৃষ্ঠার লিঙ্কগুলি - ওয়ার্ডপ্রেসকে কাস্টম কোয়েরিটি সনাক্ত করতে বাধ্য করা দরকার needs এটির জন্য "হ্যাক" এর কিছুটা প্রয়োজন: $wp_queryকাস্টম ক্যোয়ারী অবজেক্টের সাথে প্রধান বিষয়টিকে প্রতিস্থাপন করা $custom_query:
মূল ক্যোয়ারী অবজেক্টটি হ্যাক করুন
- মূল ক্যোয়ারী অবজেক্টটির ব্যাকআপ দিন:
$temp_query = $wp_query
- মূল ক্যোয়ারী অবজেক্টটি নাল করুন:
$wp_query = NULL;
প্রধান ক্যোয়ারী অবজেক্টে কাস্টম ক্যোয়ারী অদলবদল করুন: $wp_query = $custom_query;
$temp_query = $wp_query;
$wp_query = NULL;
$wp_query = $custom_query;
এই "হ্যাক" অবশ্যই যেকোন পৃষ্ঠাগুলির ফাংশন কল করার আগেই করা উচিত
মূল ক্যোয়ারী অবজেক্টটি রিসেট করুন
পৃষ্ঠাগুলি ফাংশনগুলি একবার আউটপুট হয়ে গেলে মূল ক্যোয়ারী অবজেক্টটি পুনরায় সেট করুন:
$wp_query = NULL;
$wp_query = $temp_query;
পৃষ্ঠাগুলি ফাংশন স্থির করে
previous_posts_link()ফাংশন সাধারণত, পত্রাঙ্কন নির্বিশেষে কাজ করবে। এটি কেবলমাত্র বর্তমান পৃষ্ঠাটি নির্ধারণ করে এবং তারপরে লিঙ্কটি আউটপুট করে page - 1। তবে next_posts_link()সঠিকভাবে আউটপুট দেওয়ার জন্য একটি স্থির প্রয়োজন । এটি কারণ প্যারামিটার next_posts_link()ব্যবহার করে max_num_pages:
<?php next_posts_link( $label , $max_pages ); ?>
অন্যান্য ক্যোয়ারী প্যারামিটারগুলির মতো, ডিফল্টরূপে ফাংশনটি max_num_pagesমূল $wp_queryঅবজেক্টের জন্য ব্যবহার করবে । বস্তুর next_posts_link()জন্য অ্যাকাউন্টে বাধ্য করার জন্য $custom_query, আপনাকে max_num_pagesফাংশনে পাস করতে হবে । আপনি $custom_queryঅবজেক্ট থেকে এই মানটি আনতে পারেন $custom_query->max_num_pages:
<?php next_posts_link( 'Older Posts' , $custom_query->max_num_pages ); ?>
সবগুলোকে একত্রে রাখ
নীচে সঠিকভাবে কার্যকরী পৃষ্ঠাগুলি ফাংশন সহ একটি কাস্টম ক্যোয়ারী লুপের একটি মৌলিক নির্মাণ:
// Define custom query parameters
$custom_query_args = array( /* Parameters go here */ );
// Get current page and append to custom query parameters array
$custom_query_args['paged'] = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;
// Instantiate custom query
$custom_query = new WP_Query( $custom_query_args );
// Pagination fix
$temp_query = $wp_query;
$wp_query = NULL;
$wp_query = $custom_query;
// Output custom query loop
if ( $custom_query->have_posts() ) :
while ( $custom_query->have_posts() ) :
$custom_query->the_post();
// Loop output goes here
endwhile;
endif;
// Reset postdata
wp_reset_postdata();
// Custom query loop pagination
previous_posts_link( 'Older Posts' );
next_posts_link( 'Newer Posts', $custom_query->max_num_pages );
// Reset main query object
$wp_query = NULL;
$wp_query = $temp_query;
সংযোজন: কী query_posts()?
query_posts() মাধ্যমিক লুপগুলির জন্য
যদি আপনি query_posts()একটি কাস্টম লুপ আউটপুট ব্যবহার করে থাকেন WP_Query(), তবে তারপরে কাস্টম ক্যোয়ারির জন্য পৃথক বস্তুর তাত্ক্ষণিক ব্যবহার করে থাকেন _doing_it_wrong(), তবে আপনি হয়ে থাকেন এবং বেশ কয়েকটি সমস্যার মধ্যে চলে যাবেন ( যার মধ্যে কমপক্ষে পৃষ্ঠাগুলির সমস্যাগুলিও হবে)। এই সমস্যাগুলি সমাধানের প্রথম পদক্ষেপটি হ'ল অনুপযুক্ত ব্যবহারকে query_posts()একটি সঠিক WP_Query()কলে রূপান্তর করা ।
query_posts()প্রধান লুপটি সংশোধন করতে ব্যবহার করা হচ্ছে
যদি আপনি কেবল প্রধান লুপ ক্যোয়ারির জন্য প্যারামিটারগুলি পরিবর্তন করতে চান - যেমন প্রতি পৃষ্ঠায় পোস্ট পরিবর্তন করা বা কোনও বিভাগ বাদ দিয়ে - আপনি ব্যবহারে প্ররোচিত হতে পারেন query_posts()। কিন্তু আপনার এখনও করা উচিত নয়। আপনি যখন ব্যবহার করেন query_posts(), আপনি ওয়ার্ডপ্রেসকে মূল ক্যোয়ারী অবজেক্টটি প্রতিস্থাপন করতে বাধ্য করেন । (ওয়ার্ডপ্রেস আসলে একটি দ্বিতীয় ক্যোয়ারী তৈরি করে এবং ওভাররাইট করে $wp_query।) সমস্যাটি হ'ল, পৃষ্ঠাগুলি আপডেট করার প্রক্রিয়াটি খুব বেশি দেরিতে এই প্রতিস্থাপনটি করে।
সমাধান হুক মাধ্যমে পোস্ট আনার আগে মূল ক্যোয়ারী ফিল্টার করা হয়pre_get_posts ।
এটি বিভাগ টেম্পলেট ফাইল ( category.php) এ যুক্ত করার পরিবর্তে :
query_posts( array(
'posts_per_page' => 5
) );
নিম্নলিখিতগুলিতে এতে যুক্ত করুন functions.php:
function wpse120407_pre_get_posts( $query ) {
// Test for category archive index
// and ensure that the query is the main query
// and not a secondary query (such as a nav menu
// or recent posts widget output, etc.
if ( is_category() && $query->is_main_query() ) {
// Modify posts per page
$query->set( 'posts_per_page', 5 );
}
}
add_action( 'pre_get_posts', 'wpse120407_pre_get_posts' );
এটি ব্লগ পোস্ট সূচি টেম্পলেট ফাইল ( home.php) যুক্ত করার পরিবর্তে :
query_posts( array(
'cat' => '-5'
) );
নিম্নলিখিতগুলিতে এতে যুক্ত করুন functions.php:
function wpse120407_pre_get_posts( $query ) {
// Test for main blog posts index
// and ensure that the query is the main query
// and not a secondary query (such as a nav menu
// or recent posts widget output, etc.
if ( is_home() && $query->is_main_query() ) {
// Exclude category ID 5
$query->set( 'category__not_in', array( 5 ) );
}
}
add_action( 'pre_get_posts', 'wpse120407_pre_get_posts' );
এইভাবে, ওয়ার্ডপ্রেস $wp_queryকোনও টেমপ্লেট পরিবর্তনের প্রয়োজন নেই, পৃষ্ঠাগুলি নির্ধারণ করার সময় ইতিমধ্যে সংশোধিত অবজেক্টটি ব্যবহার করবে ।
কখন কোন ফাংশন ব্যবহার করবেন
গবেষণা এই প্রশ্ন ও উত্তর এবং এই প্রশ্ন ও উত্তর বুঝতে এবং কখন ব্যবহার করতে WP_Query, pre_get_postsএবং query_posts()।