खैर, मैं श्रेणी / वर्गीकरण द्वारा कस्टम पोस्ट प्रकारों को छाँटने में अपने अनुभव को उजागर करना चाहूंगा।
मकड़जाल
- वर्डप्रेस पर चलने वाली एक ट्रैवल एजेंसी वेब साइट
- कस्टम पोस्ट प्रकार पर मुख्य सामग्री जिसे 'रूटा' कहा जाता है
- इस संरचना के साथ वर्गीकरण - प्रकार> देश> महाद्वीप> देश
मुकदमा
संग्रह श्रेणी सूची पृष्ठों में, ग्राहक चाहते थे कि पदों को क्रमबद्ध किया जाए
- महाद्वीप, प्रत्येक पर मार्गों की संख्या के आधार पर।
- देश, वर्णानुक्रम में आदेश दिया।
कदम
सबसे पहले , मैं अनमॉडिफाइड आर्काइव पेज क्वेरी से अनुरोध को पकड़ता हूं जो इस तरह से हुआ:
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
WHERE 1=1
AND ( wp_term_relationships.term_taxonomy_id IN (5,6,7,8,9,10,11,12,13,15,16,17,18,19,20,21,22,23,25,26,28,29,31,32,33,35,38,95,101,102,193) )
AND wp_posts.post_type IN ('ruta', 'nav_menu_item')
AND (wp_posts.post_status = 'publish' OR wp_posts.post_author = 45
AND wp_posts.post_status = 'private')
GROUP BY wp_posts.ID
ORDER BY wp_posts.post_date DESC LIMIT 0, 20
दूसरा , मैंने अपनी आवश्यकताओं के अनुरूप डेटाबेस के लिए सीक्वल प्रो में एसक्यूएल कोड को संपादित किया। मैं इसके साथ बाहर आता हूं (हां, शायद इसमें सुधार किया जा सकता है: MySQL पर मेरा ज्ञान बकाया नहीं है):
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID, tt1.parent AS pare,
(
SELECT COUNT(*)
FROM wp_posts
INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
INNER JOIN wp_term_taxonomy AS tt1 ON ( tt1.term_taxonomy_id = wp_term_relationships.term_taxonomy_id )
INNER JOIN wp_term_taxonomy AS tt2 ON ( tt2.term_taxonomy_id = tt1.term_taxonomy_id )
WHERE 1=1
AND tt1.parent = pare
) AS Total
FROM wp_posts
INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
INNER JOIN wp_term_taxonomy AS tt1 ON ( tt1.term_taxonomy_id = wp_term_relationships.term_taxonomy_id )
INNER JOIN wp_terms ON ( tt1.term_id = wp_terms.term_id )
WHERE 1=1
AND ( wp_term_relationships.term_taxonomy_id IN (5,6,7,8,9,10,11,12,13,15,16,17,18,19,20,21,22,23,25,26,28,29,31,32,33,35,38,95,101,102,193) )
AND wp_posts.post_type IN ('ruta', 'nav_menu_item')
AND (wp_posts.post_status = 'publish' OR wp_posts.post_author = 45
AND wp_posts.post_status = 'private')
GROUP BY wp_posts.ID
ORDER BY
total DESC,
wp_terms.name
तीसरा , मैंने फंक्शन को क्वेरी को तीन फ़िल्टर के साथ जोड़ दिया है। तीन फ़िल्टर के साथ फ़ाइल: posts_fields, posts_join और posts_orderby
Functions.php में कोड:
function xc_query_fields( $fields ) {
$fields = "wp_posts.ID, wp_posts.post_title, wp_terms.name, tt1.parent AS pare,
(
SELECT COUNT(*)
FROM wp_posts
INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
INNER JOIN wp_term_taxonomy AS tt1 ON ( tt1.term_taxonomy_id = wp_term_relationships.term_taxonomy_id )
INNER JOIN wp_term_taxonomy AS tt2 ON ( tt2.term_taxonomy_id = tt1.term_taxonomy_id )
WHERE 1=1
AND tt1.parent = pare
)
AS Total";
return $fields;
}
function xc_query_joins( $join ) {
$join .= "INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
INNER JOIN wp_term_taxonomy AS tt1 ON ( tt1.term_taxonomy_id = wp_term_relationships.term_taxonomy_id )
INNER JOIN wp_terms ON ( tt1.term_id = wp_terms.term_id )";
return $join;
}
function xc_query_orderby( $join ) {
$join = "total DESC, wp_terms.name ";
return $join;
}
अंत में मैंने कुछ शर्तों के अनुसार pre_get_post हुक से फ़िल्टर चालू किया
function filtra_queries( $query )
{
if ( is_archive() && $query->is_main_query() && !is_admin() ) {
$rutes = array('viajes-privados', 'asia', 'africa', 'oceania', 'america', 'oriente-proximo');
if ( in_array( $query->get('category_name'), $rutes ) )
{
add_filter( 'posts_fields', 'xc_query_fields' );
add_filter( 'posts_join', 'xc_query_joins' );
add_filter( 'posts_orderby', 'xc_query_orderby' );
}// end if in_array
}// end if is_archive
}
add_filter('pre_get_posts', 'filtra_queries');
आशा है कि यह किसी की मदद कर सकता है