การผสมประเภทโพสต์ปกติและกำหนดเอง (กับ meta_query) ในหน้าแรก


9

ไม่แน่ใจว่าจะทำสิ่งนี้ได้อย่างไร ฉันพยายามผสมโพสต์มาตรฐานและโพสต์ที่กำหนดเองในหน้าแรกของเว็บไซต์ แต่ฉันต้องการแสดงโพสต์ที่กำหนดเองหากตั้งค่าเมตา การแสดงโพสต์นั้นใช้งานได้ดี'post_type' => array('game', 'post')แต่เมื่อฉันเพิ่มใน meta_query โพสต์ปกติจะไม่แสดงอีกต่อไป (ซึ่งสมเหตุสมผลแล้วเนื่องจากไม่เป็นไปตามเงื่อนไขของ meta_query)

ดังนั้นฉันจะ จำกัด meta_query เฉพาะประเภทโพสต์ที่กำหนดเองเพื่อให้โพสต์ปกติจะยังคงรวมอยู่ได้อย่างไร


1
เป็นคำถามที่ดี ... +1 WP_Queryฉันคิดว่าคุณจะไม่สามารถที่จะทำอย่างนั้นกับการเริ่มต้น คุณจะต้องใช้pre_get_postsแก้ไขแบบสอบถามหรือคำสั่ง SQL ที่กำหนดเอง อย่างไรก็ตามโปรดแสดงรหัสปัจจุบันของคุณ
ไกเซอร์

คำตอบ:


4

มีวิธีที่แตกต่างในการทำเคล็ดลับ 2 เข้ามาในใจของฉัน:

  1. ใช้$wpdbแบบสอบถามที่กำหนดเองทั้งหมด
  2. ใช้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 ในปลั๊กอินที่ใช้ซ้ำได้โดยใช้คลาส ที่มีจำหน่ายเป็นสาระสำคัญ


1
ทำงานอย่างสมบูรณ์แบบและขอบคุณสำหรับความคิดเห็นแบบอินไลน์ ฉันเพียงแค่คัดลอกรหัสลงในปลั๊กอิน utils.php ของฉันใส่ค่าที่เหมาะสมลงในแบบสอบถาม meta args ที่คุณให้ต้นขั้วสำหรับรีเฟรชหน้าแรกและมีโพสต์และโพสต์เกมของฉันในเกียรติของพวกเขา ขอบคุณอีกครั้ง.
lrm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.