通过meta_key过滤next_post_link()和previous_post_link()吗?


8

我有一个包含两个部分的页面,每个部分使用不同的WP_Query()in来拉入events,这是自定义帖子类型。每个WP_Query()查询都meta_key为事件日期查询a ,以便第1部分仅显示即将发生的事件,events而第2部分显示过去的消息events

events第1节中即将显示的所有相关信息都在我的页面上,因此无法单击它们。

events第2节中的过去仅显示event标题,并且可以单击。用户单击过去时,event他们会链接到过去的自定义single-event.php模板event

我想在single-event.php模板中显示上一个/下一个导航,但是导航应该只指向过去events

我尝试使用next_post_link()previous_post_link()但是这些也将链接到即将发布的内容events,这是我不希望的。我可能可以WP_Query()在其上设置一个新的single-event.php并循环遍历以获得上一个/下一个ID,但是重复查询似乎是一个艰巨的步骤。

对于events从我的上一个/下一个帖子链接中过滤掉即将到来的方法的一些见解,我将非常感谢。我已经看到了这个问题,但我不想使用插件。


1
您链接的问题的另一个答案中对此问题的答案提供了提示-您需要过滤get_adjacent_post函数中的join / where / sort子句。
米洛2014年

是的,提示。如果可能的话,我非常希望看到一个可行的示例。
cfx

1
我目前没有时间编写代码,但是一个好的出发点是通过进行查询WP_Query,然后检查$your_query_object->request,这将揭示您需要将其提取的大量SQL。
米洛2014年

感谢@Milo的提示,以为我知道了!见下文!
cfx

Answers:


6

@@@@@@@@@@@@@@@@@@@@@@@@@的

请注意,这些是我的情况非常特定的,但是修改它们以供您自己使用应该没有问题。我正在将“高级自定义字段”与日期选择器字段一起使用date,“上一个/下一个”链接仅指向date字段设置为今天前一天的事件。

我创建了5个过滤器:

  • 1修改JOIN(添加wp_postmeta
  • 1 WHERE为上一个链接进行修改
  • 1修改WHERE下一个链接
  • 1 SORT为上一个链接进行修改
  • 1修改SORT下一个链接

这是我想出的,它似乎正在工作,但是如果有人发现任何问题,我希望提供反馈:

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

我有一个非常类似的问题,需要对上一个/下一个导航中的帖子进行排序和排除。@cfx解决方案的问题是:无法使用ajax:is_singular()如果通过wp-ajax加载内容,则该函数返回false。因此它可以在页面加载时工作,但在ajax更改内容时却没有。global $post;在帮助我。

这是我的解决方案:

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

在这种情况下,costum字段查询为:排除cf not_clickable设置为的所有帖子true

我遇到的另一个问题:我创建了一些内容,然后再实现了该自定义字段。.因此,查询还排除了甚至没有将该字段附加到帖子的帖子,无论是对还是错。使用这种类型的过滤时,请记住这一点。确保每个帖子都有一个值,或者在您的sql语法中考虑这个值。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.