মজার প্রশ্ন! আমি ক্লাউজের WHERE
একগুচ্ছ দিয়ে ক্যোয়ারীটি প্রসারিত করে সমাধান করেছি post_title LIKE 'A%' OR post_title LIKE 'B%' ...
। আপনি একটি ব্যাপ্তি অনুসন্ধান করতে একটি নিয়মিত প্রকাশটিও ব্যবহার করতে পারেন তবে আমি বিশ্বাস করি যে ডাটাবেসগুলি তখন কোনও সূচক ব্যবহার করতে সক্ষম হবে না।
এটি সমাধানের মূল: ধারাটিতে একটি ফিল্টার WHERE
:
add_filter( 'posts_where', 'wpse18703_posts_where', 10, 2 );
function wpse18703_posts_where( $where, &$wp_query )
{
if ( $letter_range = $wp_query->get( 'wpse18703_range' ) ) {
global $wpdb;
$letter_clauses = array();
foreach ( $letter_range as $letter ) {
$letter_clauses[] = $wpdb->posts. '.post_title LIKE \'' . $letter . '%\'';
}
$where .= ' AND (' . implode( ' OR ', $letter_clauses ) . ') ';
}
return $where;
}
অবশ্যই আপনি আপনার ক্যোয়ারিতে এলোমেলো বাহ্যিক ইনপুটটিকে অনুমতি দিতে চান না। এজন্য আমার কাছে একটি ইনপুট স্যানিটাইজেশন পদক্ষেপ রয়েছে pre_get_posts
, যা দুটি ক্যোয়ারী ভেরিয়েবলকে বৈধ পরিসরে রূপান্তর করে। (যদি আপনি এটি ভাঙার কোনও উপায় খুঁজে পান তবে দয়া করে একটি মন্তব্য করুন যাতে আমি এটি সংশোধন করতে পারি)
add_action( 'pre_get_posts', 'wpse18703_pre_get_posts' );
function wpse18703_pre_get_posts( &$wp_query )
{
// Sanitize input
$first_letter = $wp_query->get( 'wpse18725_first_letter' );
$last_letter = $wp_query->get( 'wpse18725_last_letter' );
if ( $first_letter || $last_letter ) {
$first_letter = substr( strtoupper( $first_letter ), 0, 1 );
$last_letter = substr( strtoupper( $last_letter ), 0, 1 );
// Make sure the letters are valid
// If only one letter is valid use only that letter, not a range
if ( ! ( 'A' <= $first_letter && $first_letter <= 'Z' ) ) {
$first_letter = $last_letter;
}
if ( ! ( 'A' <= $last_letter && $last_letter <= 'Z' ) ) {
if ( $first_letter == $last_letter ) {
// None of the letters are valid, don't do a range query
return;
}
$last_letter = $first_letter;
}
$wp_query->set( 'posts_per_page', -1 );
$wp_query->set( 'wpse18703_range', range( $first_letter, $last_letter ) );
}
}
চূড়ান্ত পদক্ষেপটি হ'ল একটি সুন্দর পুনর্লিখনের নিয়ম তৈরি করা যাতে আপনি যেতে পারেন example.com/posts/a-g/
বা example.com/posts/a
এই পোস্টের (ব্যাপ্তি) অক্ষর দিয়ে শুরু হওয়া সমস্ত পোস্ট দেখতে পারেন see
add_action( 'init', 'wpse18725_init' );
function wpse18725_init()
{
add_rewrite_rule( 'posts/(\w)(-(\w))?/?', 'index.php?wpse18725_first_letter=$matches[1]&wpse18725_last_letter=$matches[3]', 'top' );
}
add_filter( 'query_vars', 'wpse18725_query_vars' );
function wpse18725_query_vars( $query_vars )
{
$query_vars[] = 'wpse18725_first_letter';
$query_vars[] = 'wpse18725_last_letter';
return $query_vars;
}
আপনি অন্য কিছু দিয়ে শুরু করতে পুনরায় লেখার নিয়ম প্যাটার্নটি পরিবর্তন করতে পারেন। এটি যদি কাস্টম পোস্টের ধরণের জন্য &post_type=your_custom_post_type
হয় তবে সাবস্টিটিউশনটিতে যুক্ত হওয়া নিশ্চিত করুন (দ্বিতীয় স্ট্রিং যা শুরু হয় index.php
)।
পৃষ্ঠাগুলি লিঙ্ক যুক্ত করা পাঠকের জন্য অনুশীলন হিসাবে ছেড়ে গেছে :-)