ฉันต้องการแสดงประสบการณ์ของฉันในการจัดเรียงประเภทโพสต์ที่กำหนดเองตามหมวดหมู่ / อนุกรมวิธาน
เว็บ
- เว็บไซต์ บริษัท ตัวแทนท่องเที่ยวที่ทำงานบน WordPress
- เนื้อหาหลักในประเภทโพสต์ที่กำหนดเองที่เรียกว่า 'ruta'
- อนุกรมวิธานกับโครงสร้างนี้ประเภทของการเดินทาง> ทวีป> ประเทศ
กรณี
ในหน้ารายการหมวดหมู่ที่เก็บถาวรไคลเอนต์ต้องการให้เรียงลำดับตาม
- ทวีปเรียงตามจำนวนเส้นทางในแต่ละเส้นทาง
- ประเทศเรียงตามลำดับตัวอักษร
ขั้นตอน
ก่อนอื่นฉันรับการร้องขอจากการสืบค้นเพจเก็บถาวรที่ไม่ได้แก้ไขซึ่งเกิดขึ้นเป็นเช่นนี้:
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
ประการที่สองฉันแก้ไขโค้ด sql ใน Sequel Pro กับฐานข้อมูลเพื่อให้สอดคล้องกับความต้องการของฉัน ฉันออกมาด้วยสิ่งนี้ (ใช่อาจปรับปรุงได้: ความรู้ของฉันเกี่ยวกับ 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
ประการที่สามฉันขอแบบสอบถามเกี่ยวกับไฟล์ functions.php ที่มีสามตัวกรอง: 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');
หวังว่านี่จะช่วยใครซักคน