ভাল, আমি কাস্টম / শ্রেণিবৃত্তি দ্বারা কাস্টম পোস্ট ধরণের বাছাইয়ের আমার অভিজ্ঞতাটি প্রকাশ করতে চাই।
ওয়েব
- ওয়ার্ডপ্রেসে চলছে একটি ট্র্যাভেল এজেন্সি ওয়েব সাইট
- কাস্টম পোস্টের ধরণের প্রধান বিষয়বস্তু যা 'রুটা' নামে পরিচিত
- এই কাঠামোর সাথে শ্রমশক্তি ভ্রমণ-প্রকার> মহাদেশ> দেশ
কেস
সংরক্ষণাগার বিভাগের তালিকা পৃষ্ঠাগুলিতে, ক্লায়েন্টটি পোস্টগুলি বাছাই করতে চেয়েছিল
- মহাদেশটি, প্রতিটিটিতে কয়েকটি সংখ্যক রুট অনুসারে অর্ডার করা হয়েছে।
- দেশ, বর্ণানুক্রমিক অর্ডার।
পদক্ষেপ
প্রথমত , আমি অশোধিত আর্কাইভ পৃষ্ঠা কোয়েরি থেকে অনুরোধটি পেয়েছি যা এরকম হয়েছিল:
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
দ্বিতীয়ত , আমি আমার প্রয়োজনীয়তা অনুসারে ডাটাবেসের বিরুদ্ধে সিকোয়েল প্রোতে বেকার কোড সম্পাদনা করেছি। আমি এটি নিয়ে বেরিয়ে এসেছি (হ্যাঁ, সম্ভবত এটি উন্নতি করা যেতে পারে: মাইএসকিউএল সম্পর্কিত আমার জ্ঞানটি অসামান্য):
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
তৃতীয় , আমি জিজ্ঞাসাটি ফাংশন.পিএইচপি ফাইলটিতে তিনটি ফিল্টার সহ পোস্ট করেছি: পোস্ট_ফিল্ডস, পোস্ট_জাইন এবং পোস্টসর্ডারবাই
ফাংশন.এফপি কোড:
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');
আশা করি এটি কারও সাহায্য করতে পারে