Trộn các loại bài đăng thông thường và tùy chỉnh (với meta_query) trên trang chủ


9

Không chắc chắn làm thế nào để đạt được điều này. Tôi đang cố gắng trộn các bài đăng tiêu chuẩn và bài đăng tùy chỉnh trên trang chủ của trang web nhưng tôi chỉ muốn hiển thị các bài đăng tùy chỉnh nếu giá trị meta được đặt. Hiển thị các bài đăng hoạt động tốt 'post_type' => array('game', 'post')nhưng khi tôi thêm vào meta_query, các bài đăng thông thường sẽ không còn hiển thị nữa (điều này có nghĩa là chúng không đáp ứng điều kiện meta_query).

Vậy làm cách nào để giới hạn meta_query chỉ ở loại bài đăng tùy chỉnh để bài đăng thông thường vẫn được đưa vào?


1
Câu hỏi hay ... +1. Tôi nghĩ rằng bạn sẽ không thể làm điều đó với một mặc định WP_Query. Bạn sẽ cần sử dụng pre_get_poststhay đổi truy vấn của mình hoặc câu lệnh SQL tùy chỉnh. Dù sao, xin vui lòng hiển thị mã hiện tại của bạn.
kaiser

Câu trả lời:


4

Có nhiều cách khác nhau để thực hiện mánh khóe, 2 xuất hiện trong tâm trí tôi:

  1. sử dụng một $wpdbtruy vấn tùy chỉnh hoàn chỉnh
  2. sử dụng WP_Queryvới các bộ lọc, sử dụng WP_Meta_Queryđể xây dựng sql bổ sung

Tôi sẽ đăng ở đây mã mẫu cho trường hợp # 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'];
  }
}

Xem bình luận nội tuyến để giải thích thêm.

Đồng thời xem WP_Meta_Query trên Codex để biết các tài liệu đầy đủ về cách đặt đối số truy vấn meta của bạn.


Biên tập

Tôi tái cấu trúc mã trong một plugin có thể sử dụng lại, sử dụng một lớp. Có sẵn như ý chính .


1
Làm việc hoàn hảo và cảm ơn bạn cho ý kiến ​​nội tuyến. Tôi chỉ cần sao chép mã vào plugin utils.php của mình để đặt các giá trị phù hợp vào truy vấn meta mà bạn cung cấp cho các sơ khai, làm mới trang chủ và có bài đăng và bài đăng trò chơi của tôi trong vinh quang đầy đủ của họ. Cảm ơn một lần nữa.
LRM
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.