我有一个非常类似的问题,需要对上一个/下一个导航中的帖子进行排序和排除。@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语法中考虑这个值。
get_adjacent_post
函数中的join / where / sort子句。