इंटर्नल को समझना
आसन्न (अगले / मौजूदा) पदों का "क्रमबद्ध" क्रम वास्तव में "क्रम" नहीं है। यह प्रत्येक अनुरोध / पृष्ठ पर एक अलग क्वेरी है, लेकिनpost_date
यदि आपके पास वर्तमान में प्रदर्शित ऑब्जेक्ट के रूप में एक पदानुक्रमित पोस्ट है - तो यह - या पोस्ट अभिभावक द्वारा क्वेरी को सॉर्ट करता है ।
जब आप के आंतरिक पर एक नज़र डालते हैं next_post_link()
, तो आप देखते हैं कि यह मूल रूप से एक एपीआई आवरण है adjacent_post_link()
। बाद के फ़ंक्शन अगले या पिछले पोस्ट लिंक को हथियाने के लिए तर्क / ध्वज सेट के get_adjacent_post()
साथ आंतरिक रूप से कॉल करते हैं ।$previous
bool(true|false)
क्या फ़िल्टर करें?
इसमें गहराई से खुदाई करने के बाद, आप देखेंगे कि get_adjacent_post()
स्रोत लिंक में इसके आउटपुट (उर्फ क्वेरी परिणाम) के लिए कुछ अच्छे फ़िल्टर हैं: (फ़िल्टर नाम / छंद)
"get_{$adjacent}_post_join"
$join
// Only if `$in_same_cat`
// or: ! empty( $excluded_categories`
// and then:
// " INNER JOIN $wpdb->term_relationships AS tr
// ON p.ID = tr.object_id
// INNER JOIN $wpdb->term_taxonomy tt
// ON tr.term_taxonomy_id = tt.term_taxonomy_id";
// and if $in_same_cat then it APPENDS:
// " AND tt.taxonomy = 'category'
// AND tt.term_id IN (" . implode(',', $cat_array) . ")";
$in_same_cat
$excluded_categories
"get_{$adjacent}_post_where"
$wpdb->prepare(
// $op = $previous ? '<' : '>'; | $current_post_date
"WHERE p.post_date $op %s "
// $post->post_type
."AND p.post_type = %s "
// $posts_in_ex_cats_sql = " AND tt.taxonomy = 'category'
// AND tt.term_id NOT IN (" . implode($excluded_categories, ',') . ')';
// OR empty string if $in_same_cat || ! empty( $excluded_categories
."AND p.post_status = 'publish' $posts_in_ex_cats_sql "
",
$current_post_date,
$post->post_type
)
$in_same_cat
$excluded_categories
"get_{$adjacent}_post_sort"
"ORDER BY p.post_date $order LIMIT 1"`
तो आप इसके साथ बहुत कुछ कर सकते हैं । यह WHERE
क्लॉज़ को फ़िल्टर करने के साथ-साथ JOIN
एड टेबल और ORDER BY
स्टेटमेंट के साथ शुरू होता है ।
परिणाम वर्तमान अनुरोध के लिए मेमोरी में कैश हो जाता है, इसलिए यदि आप एक ही पृष्ठ पर कई बार उस फ़ंक्शन को कॉल करते हैं तो यह अतिरिक्त प्रश्न नहीं जोड़ता है।
स्वचालित क्वेरी बिल्डिंग
जैसा कि @StephenHarris ने टिप्पणियों में बताया, एक मुख्य कार्य है जो SQL क्वेरी बनाते समय काम में आ सकता है: get_meta_sql()
- उदाहरण कोडेक्स में । मूल रूप से इस फ़ंक्शन का उपयोग केवल मेटा SQL स्टेटमेंट के निर्माण के लिए किया जाता है जो इसमें उपयोग किया जाता है WP_Query
, लेकिन आप इसे इस मामले में (या अन्य) भी उपयोग कर सकते हैं। जो तर्क आप इसमें फेंकते हैं वह एक सरणी है, ठीक वही जो एक में जोड़ा जाएगा WP_Query
।
$meta_sql = get_meta_sql(
$meta_query,
'post',
$wpdb->posts,
'ID'
);
वापसी मान एक सरणी है:
$sql => (array) 'join' => array(),
(array) 'where' => array()
तो आप उपयोग कर सकते हैं $sql['join']
और $sql['where']
अपने कॉलबैक में।
ध्यान में रखने के लिए निर्भरताएँ
आपके मामले में सबसे आसान काम यह होगा कि आप इसे एक छोटे (म्यू) प्लग इन या अपने थीम फंक्शन्स.php फाइल में इंटरप्ट करें और इसे $adjacent = $previous ? 'previous' : 'next';
वेरिएबल और वेरिएबल के आधार पर बदल दें $order = $previous ? 'DESC' : 'ASC';
:
वास्तविक फ़िल्टर नाम
तो फिल्टर नाम हैं:
get_previous_post_join
, get_next_post_join
get_previous_post_where
, get_next_post_where
get_previous_post_sort
, get_next_post_sort
एक प्लगइन के रूप में लिपटे
... और फ़िल्टर कॉलबैक निम्नानुसार होगा (उदाहरण के लिए):
<?php
/** Plugin Name: (#73190) Alter adjacent post link sort order */
function wpse73190_adjacent_post_sort( $orderby )
{
return "ORDER BY p.menu_order DESC LIMIT 1";
}
add_filter( 'get_previous_post_sort', 'wpse73190_adjacent_post_sort' );
add_filter( 'get_next_post_sort', 'wpse73190_adjacent_post_sort' );