我如何才能在_POST_NAVATION()链接中包含所有的帖子类型,而不仅仅是当前的帖子类型?

时间:2020-10-03 作者:Tantalus

我有一个网站,有几种自定义的帖子类型:博客帖子、电影评论和;书评。在我的single.php 我调用的模板the_post_navigation().

查看博客帖子时,上一篇和下一篇链接仅导航到博客类型的其他帖子,完全忽略电影和书籍。如果我的上一篇文章碰巧是一篇书评,我希望上一篇链接将用户带到该书评,而不是另一篇博客文章。

在电影或书页上也一样。我不想把上一篇和下一篇限制在那些帖子类型上。我如何才能做到这一点?

1 个回复
SO网友:Howdy_McGee

默认情况下the_post_navigation() 使用当前的帖子类型,无论它是什么。幸运的是,该函数最终调用get_adjacent_post() 有几个钩子我们可以用。以下使用get_{$adjacent}_post_where 哪里$adjacent 是“或”;“上一页”;或“或”;下一步:

/**
 * Modify the posts navigation WHERE clause
 * to include our acceptable post types
 * 
 * @param String $where - Generated WHERE SQL Clause
 * 
 * @return String
 */
function wpse375885_postnav_where( $where ) {
    
    global $wpdb, $post;
    
    // Return Early
    if( empty( $post ) ) {
        return $where;
    }
    
    $search = sprintf( "p.post_type = \'%s\'", $post->post_type );
    
    // Return Early - $where already modified
    if( false == strpos( $where, $search ) ) {
        return $where;
    }
    
    // Almost all non-builtin in post types
    $acceptable_post_types = array_merge(
        array( 
            \'post\',
            \'page\'
        ),
        get_post_types( array( 
            \'_builtin\' => false
        ) )
    );
    
    $placeholders   = array_fill( 0, count( $post_types ), \'%s\' );
    $format         = implode( \',\', $placeholders );
    
    $replace = $wpdb->prepare( 
        "p.post_type IN ($format)",
        $post_types
    );
    
    return str_replace( $search, $replace, $where );
    
}
add_filter( \'get_next_post_where\',      \'wpse375885_postnav_where\' );
add_filter( \'get_previous_post_where\',  \'wpse375885_postnav_where\' );
就我个人而言,我会取代$acceptable_post_types 使用我已知的帖子类型数组,以防止将来安装的插件被添加到列表中
您也可以更改\'_builtin\' => true 真正引入所有岗位类型。