文章正文前后添加同一分类目录下文章提示功能(二)只显示与它相邻的前3篇和后3篇文章

本文是以下文章的衍生版本:

文章正文前后添加同一分类目录下文章提示功能 文章正文前后添加同一分类目录下文章提示功能 本功能有了衍生进化版 [pix_post ids=394] 本功能已经适配了PIX主题,并且做了适当美化,包括添加了四角为圆的虚框,以及虚框内相对舒适的背景颜色。理论上适应于任何WP主题,但可能需要做... 时间:2023/10/29 分类:技术相关

刚开始建站的时候,考虑到文章稀少,没有什么可读性,为了提高网站粘度,在文章前后插入了同类分类目录下的所有文章。随着文章越来越多,如果不加以节制,比如我写到这个分类目录下的第21篇文章,则需要在文章开始之前显示20篇文章的标题,反而这种功能成为阻碍浏览便利的绊脚石,但我还不想丢弃这个增粘功能,想在当前文章开始之前和结束之后只显示与它相邻的前3篇和后3篇文章,就只能将原来的代码升级下。

一、显示效果:

当前文章内容开始前显示:

文章正文前后添加同一分类目录下文章提示功能(二)只显示与它相邻的前3篇和后3篇文章-似水流年

当前文章内容结束后显示:

文章正文前后添加同一分类目录下文章提示功能(二)只显示与它相邻的前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篇文章标题。

消息盒子
# 您需要首次评论以获取消息 #
# 您需要首次评论以获取消息 #

只显示最新10条未读和已读信息