Lọc next_post_link () và trước_post_link () bằng meta_key?


8

Tôi có một trang với hai phần, mỗi phần sử dụng một phần khác nhau WP_Query()để kéo vào events, đó là một loại bài tùy chỉnh. Mỗi WP_Query()truy vấn a meta_keycho ngày sự kiện để Phần 1 chỉ hiển thị sắp tới eventsvà Phần 2 hiển thị quá khứ events.

eventsPhần 1 sắp tới sẽ hiển thị tất cả thông tin liên quan trên trang của tôi, vì vậy việc nhấp vào chúng là không thể.

Quá khứ eventstrong Phần 2 chỉ hiển thị eventtiêu đề và có thể nhấp. Khi người dùng nhấp vào quá khứ, eventhọ liên kết với một single-event.phpmẫu tùy chỉnh cho quá khứ event.

Tôi muốn hiển thị điều hướng Trước / Tiếp theo trong single-event.phpmẫu, nhưng điều hướng chỉ nên trỏ đến quá khứ events.

Tôi đã thử sử dụng next_post_link()previous_post_link()những thứ này cũng sẽ liên kết đến sắp tới events, điều mà tôi không muốn. Tôi có thể có thể thiết lập một cái mới WP_Query()trên tôi single-event.phpvà lặp qua nó để lấy ID Prev / Next tiếp theo, nhưng việc lặp lại truy vấn có vẻ như là một bước quyết liệt.

Tôi thực sự sẽ đánh giá cao một số cái nhìn sâu sắc về cách lọc ra sắp tới eventstừ các liên kết bài viết Trước / Tiếp theo của tôi. Tôi đã thấy câu hỏi này nhưng tôi không muốn sử dụng một plugin.


1
câu trả lời cho điều này được gợi ý trong câu trả lời khác cho câu hỏi bạn đã liên kết - bạn sẽ cần lọc các mệnh đề nối / where / sort trong get_adjacent_posthàm.
Milo

Vâng, nó được gợi ý. Tôi thực sự thích xem một ví dụ làm việc nếu có thể.
cfx

1
Tôi không có thời gian để mã hóa một cái gì đó vào lúc này, nhưng một điểm khởi đầu tốt sẽ là thực hiện một truy vấn thông qua WP_Query, sau đó kiểm tra $your_query_object->request, điều này sẽ tiết lộ một chút tốt về SQL mà bạn sẽ cần phải loại bỏ nó.
Milo

Cảm ơn gợi ý @Milo, nghĩ rằng tôi đã tìm ra nó! Xem bên dưới!
cfx

Câu trả lời:


6

Tôi đã quản lý để làm việc này không sử dụng gì ngoài các bộ lọc WordPress, nhờ gợi ý của @ Milo.

Chỉ cần lưu ý rằng những điều này khá cụ thể đối với trường hợp của tôi nhưng bạn không nên gặp vấn đề khi sửa đổi chúng cho mục đích sử dụng của riêng bạn. Tôi đang sử dụng Trường tùy chỉnh nâng cao với trường Bộ chọn ngày được gọi datevà Liên kết trước / Tiếp theo chỉ trỏ đến các sự kiện với datecác trường được đặt thành bất kỳ ngày nào trước ngày hôm nay.

Tôi đã tạo 5 bộ lọc:

  • 1 để sửa đổi JOIN(để thêm wp_postmeta)
  • 1 để sửa đổi WHEREcho liên kết Trước
  • 1 để sửa đổi WHEREcho liên kết tiếp theo
  • 1 để sửa đổi SORTcho liên kết Trước
  • 1 để sửa đổi SORTcho liên kết tiếp theo

Đây là những gì tôi nghĩ ra, nó dường như đang hoạt động nhưng nếu có ai phát hiện ra bất kỳ vấn đề nào thì tôi rất thích phản hồi:

function get_adjacent_past_events_join($join) {
  if(is_singular('event')) {
    global $wpdb;
    $new_join = $join."INNER JOIN $wpdb->postmeta AS m ON p.ID = m.post_id ";
    return $new_join;
  }
  return $join;
}
add_filter('get_previous_post_join', 'get_adjacent_past_events_join');
add_filter('get_next_post_join', 'get_adjacent_past_events_join');

function get_prev_past_events_where($where) {
  if(is_singular('event')) {
    global $wpdb, $post;
    $id = $post->ID;
    $current_event_date = get_field('date', $id);
    $today = date('Ymd');
    $new_where = "WHERE p.post_type = 'event' AND p.post_status = 'publish' AND (m.meta_key = 'date' AND (m.meta_key = 'date' AND CAST(m.meta_value AS CHAR) < '$today')) AND (m.meta_key = 'date' AND (m.meta_key = 'date' AND CAST(m.meta_value AS CHAR) < '$current_event_date'))";
    return $new_where;
  }
  return $where;
}
add_filter('get_previous_post_where', 'get_prev_past_events_where');

function get_next_past_events_where($where) {
  if(is_singular('event')) {
    global $wpdb, $post;
    $id = $post->ID;
    $current_event_date = get_field('date', $id);
    $today = date('Ymd');
    $new_where = "WHERE p.post_type = 'event' AND p.post_status = 'publish' AND (m.meta_key = 'date' AND (m.meta_key = 'date' AND CAST(m.meta_value AS CHAR) < '$today')) AND (m.meta_key = 'date' AND (m.meta_key = 'date' AND CAST(m.meta_value AS CHAR) > '$current_event_date'))";
    return $new_where;
  }
  return $where;
}
add_filter('get_next_post_where', 'get_next_past_events_where');

function get_prev_past_events_sort($sort) {
  if(is_singular('event')) {
    global $wpdb;
    $new_sort = " GROUP BY p.ID ORDER BY m.meta_value+0 DESC";
    return $new_sort;
  }
  return $sort;
}
add_filter('get_previous_post_sort', 'get_prev_past_events_sort');

function get_next_past_events_sort($sort) {
  if(is_singular('event')) {
    global $wpdb;
    $new_sort = " GROUP BY p.ID ORDER BY m.meta_value+0 ASC";
    return $new_sort;
  }
  return $sort;
}
add_filter('get_next_post_sort', 'get_next_past_events_sort');

3

tôi đã có một vấn đề khá giống nhau, cần thiết để sắp xếp và loại trừ một số bài đăng khỏi điều hướng trước / tiếp theo. vấn đề với giải pháp của @ cfx là: nó không có khả năng cho ajax: is_singular()hàm trả về sai, nếu bạn tải nội dung qua wp-ajax. vì vậy nó hoạt động khi tải trang, nhưng không, khi nội dung được thay đổi bởi ajax. global $post;đã giúp tôi ra khỏi đây.

đây là giải pháp của tôi:

/**
  * WP: join postmeta to our sql query, so we can filter for custom fields
  *
  * @param $join
  * @return string
  */
function jnz_adjacent_work_join( $join ) {
  global $post;
  if ( get_post_type( $post ) == 'work' ) {
    global $wpdb;
    return $join . "INNER JOIN $wpdb->postmeta AS m ON p.ID = m.post_id ";
  }
  return $join;
}
add_filter('get_previous_post_join', 'jnz_adjacent_work_join');
add_filter('get_next_post_join', 'jnz_adjacent_work_join');



/**
 * WP: Change order of post for prev / next navigation
  * exclude posts with custom field "not_clickable" set to true
  *
  * @param $where
  * @param $operator
  * @return string|void
  */
 function jnz_adjacent_work_where( $where, $operator ) {
   global $post;
   if ( get_post_type( $post ) == 'work' ) :
     global $wpdb;
     $where = $wpdb->prepare("WHERE p.post_title {$operator} '%s' AND p.post_type = 'work' AND p.post_status = 'publish' AND (m.meta_key = 'not_clickable' AND (m.meta_key = 'not_clickable' AND m.meta_value != 1))", $post->post_title );
   endif;

   return $where;
 }

 $gt = '<';
 $lt = '>';
 add_filter( 'get_next_post_where', function( $where ) use ( $lt ) {
   return jnz_adjacent_work_where( $where, $lt );
 });
 add_filter( 'get_previous_post_where', function( $where ) use ( $gt ) {
   return jnz_adjacent_work_where( $where, $gt );
 });

trong trường hợp này, truy vấn trường costum là: loại trừ tất cả các bài đăng, có cf not_clickableđược đặt thành true.

một vấn đề khác tôi gặp phải: tôi đã tạo một số nội dung và sau đó triển khai trường tùy chỉnh đó .. vì vậy truy vấn cũng loại trừ các bài đăng thậm chí không có trường đó được đính kèm với bài đăng, bất kể là đúng hay sai. Chỉ cần ghi nhớ điều đó, khi sử dụng loại lọc này. đảm bảo rằng mỗi bài đăng đều có giá trị hoặc xem xét điều này trong cú pháp sql của bạn ..

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.