May31

WordPress 文章导航 previous_post_link/next_post_link 中 excluded_terms 的妙用

wplogo-1

WordPress 制作主题时,通过在文章模板 single.php 中添加 previous_post_link/next_post_link,可以实现相邻文章之间的跳转。

默认代码非常简单:

<?php previous_post_link(); ?> 
<?php next_post_link(); ?> 
//WordPress Codex链接:
//http://codex.wordpress.org/Function_Reference/previous_post_link
//http://codex.wordpress.org/Function_Reference/next_post_link

如果是普通博客,除对一些特殊的分类,如公告、通知以外,其他文章都可以让他们进行文章切换,则只需要把不希望列入的分类ID写入,比如“13”。

<?php next_post_link( '%link', '%title', TRUE, '13' ); ?>
//以下示例只以next_post_link为例,你可以将'%link'修改为'下一个:%link'。

这对一个拥有简单分类并且功能需求简单的网站来说文章沟通非常有效。

但是有时候可能要复杂一下,比如一个食品网站有水果、蔬菜、水产等分类,而水果又有瓜类、柑橘类、浆果类、核果类等分类,瓜类又有:西瓜、香瓜、哈密瓜。

我们的用户只想知道瓜类水果有哪些型号,这时候点击相邻文章导航,如果发布产品时没有勾选水果父目录,将只能在瓜类下文章的切换。如果想实现整个水果分类下文章的切换则默认代码无法实现了。

类似的需求可能有很多组合,举两个例子:

一、让各种水果子分类在整个水果大类里面跳转。

1.在function.php加入下面代码:

function lx_get_parent_terms( $post_id = 0 ) {

    $post_id = ( $post_id ? $post_id : get_the_ID() );
    $terms = get_the_terms( $post_id, 'category' );
    $terms_with_children = array();

    if( $terms ){
       foreach( $terms as $t ) {
            if( $t->parent && !in_array(  $t->parent, $terms_with_children ) ){
                $terms_with_children[] = $t->parent;
            }
        }
    }
    return $terms_with_children ;
}

在single.php这样写:

if (is_single() ) { 
$all_term_ids = get_terms( 'category', array( 'fields' => 'ids' ) );
$post_terms = get_the_terms( get_the_ID(), 'category' );
$post_terms = wp_list_pluck( $post_terms, 'term_id' );
$parent_post_terms = wpse101633_get_parent_terms();
$child_terms = array_diff( $post_terms, $parent_post_terms );

$parent_post_terms_x=$parent_post_terms[0];
$termchildren = get_term_children( $parent_post_terms_x, 'category' );
//$termchildren = wp_list_pluck( $termchildren, 'term_id' );

//Exclude terms not associated with post, or that have a child who do.
$exclude_these = array_diff( $all_term_ids, $post_terms, $termchildren); 
}?>

<nav class="nav2 clearfix">
<ul>
<li class="prev"><?php previous_post_link( '%link', '%title', false, $exclude_these ); ?></li>
<li class="next"><?php next_post_link( '%link', '%title', false, $exclude_these ); ?></li>
</ul>
</nav>


二、

<?php
$exclude_ancestors = array();
$cat = get_the_category();
// check if the first post category is a child category
if($cat[0]->parent > 0) {
	$exclude_ancestors = get_ancestors( $cat[0]->term_id, 'category' );
}
?>
<?php next_post_link('%link', 'Next post in category', TRUE, $exclude_ancestors); ?>


			

Comments are closed.