从(特定)类别获取上一篇/下一篇帖子

时间:2019-05-08 作者:Advanced SEO

我有两个类别的帖子,例如,第一个帖子在“产品”和“鞋子”类别,第二个帖子在“产品”和“衬衫”类别,第三个帖子在“产品”和“运动服”类别。。。因此,帖子有一个共同的类别(本例中为“产品”),还有一个更具体的类别。

我试图通过以下方式获得上一篇/下一篇帖子:

$next_post = get_next_post( true );
$previous_post = get_previous_post( true );
但是,例如,在第二篇文章中,我将第一篇和第三篇文章作为前一篇/下一篇文章,因为它们有一个共同的类别“产品”。我想在关于衬衫的帖子上,我有其他帖子,只有衬衫类的。我试图通过ID排除类别“product”,如下所示:

$next_post = get_next_post( true, \'5\', category  ); // 5 is ID of "product" category
$previous_post = get_previous_post( true, \'5\', category ); // 5 is ID of "product" category
但我没有以前/以后的帖子,因为“衬衫”类别中的帖子也属于“产品”类别,上面的功能是将帖子从该类别中排除。

Is there any way to do opposite, just to include posts which have one specific category?

1 个回复
SO网友:nmr

什么时候in_same_term 中的参数get_next_post() / get_previous_post() 函数设置为TRUE时,将从分配给当前职位的任何类别中选择职位。

正如您所写,您不能使用exclude 本例中的参数。

使用get_{$adjacent}_post_where 过滤器,您可以跳过product 在类别列表中,您正在查找帖子。首先获取分配给当前帖子的类别ID,然后从列表中删除不需要的ID,最后替换查询字符串中“where”语句的相关部分。

add_filter( \'get_next_post_where\', \'se337397_adjacent_from_category\', 15, 5 );
add_filter( \'get_previous_post_where\', \'se337397_adjacent_from_category\', 15, 5 );

function se337397_adjacent_from_category( $where, $in_same_term, $excluded_terms, $taxonomy, $post )
{
    if ( $in_same_term == FALSE || \'post\' != $post->post_type )
        return $where;

    //
    // category IDs to ignore when choosing an adjacent post
    $to_ignore = [ 5 ]; 
    //
    // or get ID by slug (term=\'product\', taxonomy=\'category\'):
    //    $term = get_term_by(\'slug\', \'{your_term_slug}\', \'{your_taxonomy}\');
    //    if ( $term === false )
    //        return $where;
    //    $to_ignore = [ $term->term_id ];

    // get terms assigned to current post
    $term_array = wp_get_object_terms( $post->ID, $taxonomy, array( \'fields\' => \'ids\' ) );
    //
    // Remove any exclusions and ignored from the term array to include.
    $term_array = array_diff( $term_array, (array)$excluded_terms, $to_ignore );

    $term_array = array_map( \'intval\', $term_array );
    if ( ! $term_array || is_wp_error( $term_array ) )
        $term_array = [ 0 ];
    //
    // replace a part of the query string that limits results to given terms (categories)
    $sql__in_terms = \' AND tt.term_id IN (\' . implode( \',\', $term_array ) . \')\';
    $in_begin = strpos( $where, \'AND tt.term_id IN\' );
    $in_end = strpos( $where, \')\', $in_begin );

    $new_where = substr( $where, 0, $in_begin );
    $new_where .= $sql__in_terms;
    $new_where .= substr( $where, $in_end + 1 );

    return $new_where;
}