Mencampur jenis posting biasa dan kustom (dengan meta_query) di halaman beranda

9

Tidak yakin bagaimana mencapai ini. Saya mencoba untuk menggabungkan posting standar dan posting khusus di beranda situs tetapi saya hanya ingin menampilkan posting khusus jika nilai meta ditetapkan. Menampilkan posting berfungsi dengan baik 'post_type' => array('game', 'post')tetapi ketika saya menambahkan di meta_query posting biasa tidak lagi menampilkan (yang masuk akal karena mereka tidak memenuhi syarat meta_query).

Jadi, bagaimana saya membatasi meta_query hanya untuk jenis posting khusus sehingga posting biasa masih akan disertakan?

lrm
sumber
1
Pertanyaan bagus ... +1. Saya pikir Anda tidak akan dapat melakukannya dengan default WP_Query. Anda harus menggunakan pre_get_postsubah kueri atau pernyataan SQL khusus. Bagaimanapun, tolong tunjukkan kode Anda saat ini.
kaiser

Jawaban:

4

Ada berbagai cara untuk melakukan trik, 2 muncul dalam pikiran saya:

  1. gunakan $wpdbkueri khusus yang lengkap
  2. gunakan WP_Querydengan filter, gunakan WP_Meta_Queryuntuk membangun sql tambahan

Saya akan memposting di sini kode sampel untuk kasus # 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'];
  }
}

Lihat komentar sebaris untuk penjelasan lebih lanjut.

Lihat juga WP_Meta_Query pada Codex untuk dokumen lengkap tentang cara mengatur argumen meta query Anda.


Edit

Saya refactored kode dalam plugin yang dapat digunakan kembali, menggunakan kelas. Tersedia sebagai Gist .

gmazzap
sumber
1
Bekerja dengan sempurna dan terima kasih atas komentar sebaris. Saya hanya menyalin kode ke plugin utils.php saya memasukkan nilai-nilai yang sesuai ke dalam meta queri berpendapat bahwa Anda memberikan stub untuk, menyegarkan halaman beranda dan ada posting saya dan posting permainan dalam kemuliaan penuh mereka. Terima kasih lagi.
lrm