Ana sayfada normal ve özel yayın türlerini (meta_query ile) karıştırma


9

Bunu nasıl başaracağınızdan emin değilim. Bir site ana sayfasında standart mesajları ve özel mesajları karıştırmaya çalışıyorum ama sadece bir meta değeri ayarlanmışsa özel yayınları görüntülemek istiyorum. Mesajları görüntülemek iyi çalışıyor 'post_type' => array('game', 'post')ama meta_query'ye eklediğimde normal mesajlar artık görüntülenmiyor (meta_query koşulunu karşılamadıkları için mantıklı).

Öyleyse meta_query'yi yalnızca özel gönderi türüyle nasıl sınırlandırabilirim, böylece normal gönderi yine de dahil edilir?


1
Güzel soru ... +1. Bence bunu varsayılan olarak yapamayacaksın WP_Query. pre_get_postsSorgunuzu değiştirmek için veya özel bir SQL ifadesi kullanmanız gerekir . Her neyse, lütfen mevcut kodunuzu gösterin.
kaiser

Yanıtlar:


4

Hile yapmanın farklı bir yolu var, 2 aklıma geliyor:

  1. tam bir özel $wpdbsorgu kullan
  2. ek sql oluşturmak için WP_Querykullanarak filtrelerle kullanınWP_Meta_Query

Dava # 2 için örnek kod göndereceğim

/**
 * 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'];
  }
}

Daha fazla açıklama için satır içi yorumlara bakın.

Ayrıca , meta sorgu argümanlarınızı nasıl ayarlayacağınızla ilgili eksiksiz dokümanlar için Codex'taki WP_Meta_Query adresine bakın .


Düzenle

Bir sınıf kullanarak, yeniden kullanılabilir bir eklenti kodu refactored. Gist olarak mevcut .


1
Mükemmel çalıştı ve satır içi yorumlar için teşekkür ederim. Ben sadece benim utils.php eklenti kodu kopyaladı için taslakları sağladığınız meta sorgu argümanları içine uygun değerleri koymak, ana sayfayı yeniledi ve tam zaferlerini benim mesajlar ve oyun mesajları vardı. Tekrar teşekkürler.
lrm
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.