มีวิธีที่แตกต่างในการทำเคล็ดลับ 2 เข้ามาในใจของฉัน:
- ใช้
$wpdb
แบบสอบถามที่กำหนดเองทั้งหมด
- ใช้
WP_Query
กับตัวกรองใช้WP_Meta_Query
เพื่อสร้าง sql เพิ่มเติม
ฉันจะโพสต์โค้ดตัวอย่างที่นี่สำหรับกรณี # 2
/**
* Run on pre_get_posts and if on home page (look at url)
* add posts_where, posts_join and pre_get_posts hooks
*/
function home_page_game_sql( $query ) {
// exit if is not main query and home index
if ( ! ( $query->is_main_query() && ! is_admin() && is_home() ) ) return;
add_filter( 'posts_where', 'home_page_game_filter' );
add_filter( 'posts_join', 'home_page_game_filter' );
}
add_action('pre_get_posts', 'home_page_game_sql');
/**
* Set the SQL filtering posts_join and posts_where
* use WP_Meta_Query to generate the additional where clause
*/
function home_page_game_filter( $sql = '' ) {
// remove filters
remove_filter( current_filter(), __FUNCTION__);
static $sql_game_filters;
if ( is_null($sql_game_filters) ) {
// SET YOUR META QUERY ARGS HERE
$args = array(
array(
'key' => 'my_custom_key',
'value' => 'value_your_are_looking_for',
'compare' => '='
)
);
$meta_query = new WP_Meta_Query( $args );
$sql_game_filters = $meta_query->get_sql('post', $GLOBALS['wpdb']->posts, 'ID');
}
// SET YOUR CPT NAME HERE
$cpt = 'game';
global $wpdb;
if ( current_filter() === 'posts_where' && isset($sql_game_filters['where']) ) {
$where = "AND ($wpdb->posts.post_status = 'publish') ";
$where .= "AND ( $wpdb->posts.post_type = 'post' OR ( ";
$where .= $wpdb->prepare( "$wpdb->posts.post_type = %s", $cpt);
$where .= $sql_game_filters['where'] . ' ) )';
$where .= " GROUP BY $wpdb->posts.ID ";
return $where;
}
if ( current_filter() === 'posts_join' && isset($sql_game_filters['join']) ) {
return $sql .= $sql_game_filters['join'];
}
}
ดูความคิดเห็นแบบอินไลน์สำหรับคำอธิบายเพิ่มเติม
ดูWP_Meta_Query บน Codexเพื่อดูเอกสารฉบับสมบูรณ์เกี่ยวกับวิธีตั้งค่าการสืบค้นเมตาของคุณ
แก้ไข
ฉัน refactored code ในปลั๊กอินที่ใช้ซ้ำได้โดยใช้คลาส ที่มีจำหน่ายเป็นสาระสำคัญ
WP_Query
ฉันคิดว่าคุณจะไม่สามารถที่จะทำอย่างนั้นกับการเริ่มต้น คุณจะต้องใช้pre_get_posts
แก้ไขแบบสอบถามหรือคำสั่ง SQL ที่กำหนดเอง อย่างไรก็ตามโปรดแสดงรหัสปัจจุบันของคุณ