文章正文前后添加同一分类目录下文章提示功能(二)只显示与它相邻的前3篇和后3篇文章
本文是《技术相关(共39篇)》目录的第 11 篇。阅读本文前,建议先阅读本文前3篇文章:
本文是以下文章的衍生版本:
刚开始建站的时候,考虑到文章稀少,没有什么可读性,为了提高网站粘度,在文章前后插入了同类分类目录下的所有文章。随着文章越来越多,如果不加以节制,比如我写到这个分类目录下的第21篇文章,则需要在文章开始之前显示20篇文章的标题,反而这种功能成为阻碍浏览便利的绊脚石,但我还不想丢弃这个增粘功能,想在当前文章开始之前和结束之后只显示与它相邻的前3篇和后3篇文章,就只能将原来的代码升级下。
一、显示效果:
当前文章内容开始前显示:
当前文章内容结束后显示:
二、修改代码:将以下代码替换或新增到PIX主题目录下functions.php或func.php中。
[reply]
// 调用该文章所在分类目录的其他文章
function get_category_posts_list( $location = 'before' ) {
$end = 0; // 初始化$end变量
if( is_singular('post') ) {
$post_id = get_the_ID();
$categories = get_the_category( $post_id );
if( $categories && !is_wp_error($categories) ) {
foreach ( $categories as $category ) {
$category_id = $category->term_id;
$category_name = $category->name;
$category_desc = $category->description;
$args = array(
'post_type' => 'post',
'posts_per_page' => -1,
'nopaging' => true,
'ignore_sticky_posts' => true,
'order' => 'ASC',
'category__in' => array( $category_id ),
);
$the_query = new WP_Query( $args );
$count = $current = false;
$posts_array = array(); // 初始化$posts_array变量
if ( $the_query->have_posts() ) {
ob_start();
$i = 1;
while ( $the_query->have_posts() ) {
$the_query->the_post();
$posts_array[] = get_the_ID(); // 将文章ID添加到$posts_array数组中
$count = $the_query->found_posts;
if( $post_id == get_the_ID() ) {
$current = $i;
}
$i++;
}
if ($location == 'before') {
$start = max( 0, $current - 4 ); // 计算开始位置
$end = min( $count, $current + 2 ); // 计算结束位置
if ($current > 1) {
echo '<div class="category-posts category-before">';
echo '<p class="before">本文是《<a target="_blank" title="'.$category_desc.'" href="'.esc_url( get_category_link($category_id) ).'" rel="external nofollow" rel="external nofollow" >'.$category_name.'(共'.$count.'篇)</a>》目录的第 '.$current.' 篇。阅读本文前,建议先阅读本文前3篇文章:</p>';
echo '<ul class="category-posts-ul">';
for ( $i = $start; $i < $current - 1; $i++ ) {
if ($i >= 0) {
setup_postdata($the_query->post);
echo '<li><span>'.($i + 1). '.</span><a href="'.esc_url( get_permalink($posts_array[$i]) ).'" rel="external nofollow" >' . get_the_title($posts_array[$i]) . '</a></li>';
}
}
echo '</ul>';
echo '<p><a href="'.esc_url( get_category_link($category_id) ).'">阅读本目录下更多其它文章</a></p>';
echo '</div>';
}
}
if ($location == 'after') {
if ($current < $count) {
echo '<div class="category-posts category-after">';
echo '<p class="after">您已阅读完《<a target="_blank" title="'.$category_desc.'" href="'.esc_url( get_category_link($category_id) ).'" rel="external nofollow" rel="external nofollow" >'.$category_name.'(共'.$count.'篇)</a>》目录的第 '.$current.' 篇。请继续阅读本文后3篇文章:</p>';
echo '<ul class="category-posts-ul">';
for ( $i = $current; $i < $count && $i < $current + 3; $i++ ) {
echo '<li><span>'.($i + 1).'.</span><a href="'.esc_url( get_permalink($posts_array[$i]) ).'" rel="external nofollow" >' . get_the_title($posts_array[$i]) . '</a></li>';
}
echo '</ul>';
echo '<p><a href="'.esc_url( get_category_link($category_id) ).'">阅读本目录下更多其它文章</a></p>';
echo '</div>';
}
}
}
wp_reset_postdata();
return ob_get_clean();
}
}
}
}
// 文章中添加该文章所属分类目录的其他文章列表
function display_category_posts( $content ) {
if( is_singular('post') ) {
$before = get_category_posts_list( 'before' );
$after = get_category_posts_list( 'after' );
$content = $before . "\n" . $content . "\n" . $after;
}
return $content;
}
add_filter('the_content', 'display_category_posts' );
[/reply]
大功告成!
三、修改的逻辑解释:
智能判断当前文章是当前分类目录的第几篇文章:
如果当前文章是当前目录第1篇,文章前面不显示,文章后面显示当前目录的第2-4篇文章标题;
如果当前文章是当前目录第2篇,文章前面显示当前目录的第1篇文章标题,文章后面显示当前目录的第3-5篇文章标题;
如果当前文章是当前目录第3篇,文章前面显示当前目录的第1-2篇文章标题,文章后面显示当前目录的第4-6篇文章标题;
如果当前文章是当前目录第4篇,文章前面显示当前目录的第1-3篇文章标题,文章后面显示当前目录的第5-7篇文章标题;
如果当前文章是当前目录最后1篇,文章前面显示它相邻前面的3篇文章标题,文章后面不显示;
如果当前文章是当前目录倒数第2篇,文章前面显示它相邻前面的3篇文章标题,文章后面显示最后1篇文章标题;
如果当前文章是当前目录倒数第3篇,文章前面显示它相邻前面的3篇文章标题,文章后面显示最后1-2篇文章标题;
如果当前文章是当前目录倒数第4篇,文章前面显示它相邻前面的3篇文章标题,文章后面显示最后1-3篇文章标题;
如果当前文章是当前目录倒数第5篇,文章前面显示它相邻前面的3篇文章标题,文章后面显示最后2-4篇文章标题;
如果当前文章是当前目录中间的文章,文章前面显示它相邻前面的3篇文章标题,文章后面显示它相邻后面的3篇文章标题。
您已阅读完《技术相关(共39篇)》目录的第 11 篇。请继续阅读本文后3篇文章:
空空如也!