友链的朋友圈 RSS的聚合页 (WordPress->PIX主题篇&本地解析终极版)

本文是RSS聚合页的终结篇,前前后后出了4版(WordPress三版Typecho一版),以后只会更新,不再另外发布。

RSS的聚合页之前已经出了3个,已经有了本地解析版,为什么还要出一个本地解析终极版呢?是因为我发现我的友链网站整体更新不频繁,除了个别网站。使用本地解析版列出前50篇文章,可能第50篇就是几个月之前的了,所以干脆直接显示各个友链网站的最新几篇文章算了。

所以,如果你的友链网站内容更新很频繁,推荐使用这篇本地解析版:

友链的朋友圈 RSS的聚合页 (WordPress->PIX主题篇&本地解析版) 友链的朋友圈 RSS的聚合页 (WordPress->PIX主题篇&本地解析版) 本文适用于友链网站内容频繁更新的情况 友链的朋友圈 RSS的聚合页 (WordPress->PIX主题篇&在线解析版)请参考如下文章: [pix_post ids=561] 之所以又出了一个本... 时间:2024/1/9 分类:技术相关

如果你的友链网站内容更新不频繁,我个人觉得还是本文的代码更友好一些。

一、代码逻辑:

取后台feed地址填写的友链网站,读取本地xml文件,各自显示最新的5篇文章,缓存时间即缓存更新逻辑不变,见本地解析版文章描述。然后逐一比较各个网站第一篇文章发布日期时间,最新更新的友链网站排在前面,第一篇文章发布日期时间相同则比较第二篇,以此类推。

二:效果演示:

文章标题和网站名称变黑色表示已经点击过。

友链的朋友圈 RSS的聚合页 (WordPress->PIX主题篇&本地解析终极版)-似水流年

三、代码如下:

<?php
/*
Template Name: 似水流年-RSS 朋友圈
*/

date_default_timezone_set('Asia/Shanghai');
get_header();

// 引入 SimplePie 类
require_once(ABSPATH. WPINC. '/class-simplepie.php');

// 主内容区域
echo '<div id="primary" class="content-area">';
echo '<main id="main" class="site-main" role="main">';
echo '<p style="color: red; font-size: 14px; margin-top: 10px; margin-bottom: 20px; text-align: center; display: flex; align-items: center; justify-content: center;">以下友情链接网站最新内容每 8 小时获取更新一次</p>';

// 获取并缓存友情链接的最新文章数据
function get_cached_friend_link_rss_data() {
    $cache_key = 'friend_link_rss_data';
    // 尝试从对象缓存中获取数据
    $cached_data = wp_cache_get($cache_key);
    if ($cached_data) {
        return $cached_data;
    }
    $all_articles = array();
    $links = get_bookmarks(array(
        'orderby' => 'name',
        'category' => 0,
        'order' => 'ASC',
        'hide_invisible' => 1,
        'categorize' => 0,
        'title_li' => '',
        'echo' => 0
    ));

    foreach ($links as $link) {
        if ($link->link_rss &&!empty($link->link_rss)) {
            $domain = parse_url($link->link_url, PHP_URL_HOST);
            if (!$domain) {
                continue;
            }

            $feed_url = $link->link_rss;
            $cache_file = get_stylesheet_directory(). '/rsscache/'. $domain. '.xml';

            // 如果缓存文件不存在或超过 8 小时,且 RSS 内容有更新,才更新缓存
            if (!file_exists($cache_file) || time() - filemtime($cache_file) > 8 * HOUR_IN_SECONDS) {
                $rss_content = get_rss_content($feed_url);
                if ($rss_content) {
                    $existing_content = file_exists($cache_file)? file_get_contents($cache_file) : false;
                    if ($existing_content!== $rss_content) {
                        file_put_contents($cache_file, $rss_content);
                    }
                }
            }

            $rss_items = get_rss_items($cache_file);
            foreach ($rss_items as $item) {
                $item_data = array(
                    'link_name' => $link->link_name,
                    'link_logo' => $link->link_image,
                    'link_url' => $link->link_url,
                    'item_title' => $item->get_title(),
                    'item_link' => $item->get_permalink(),
                    'item_date' => $item->get_date('Y-m-d H:i:s'),
                    'item_author' => $item->get_author()->get_name(),
                    'item_excerpt' => $item->get_description(),
                    'item_content' => $item->get_content()
                );
                $all_articles[$link->link_name][] = $item_data;
            }
        }
    }

    // 将数据存入对象缓存
    wp_cache_set($cache_key, $all_articles, null, 8 * HOUR_IN_SECONDS);
    return $all_articles;
}

// 获取最新的友情链接文章
function get_latest_friend_link_articles() {
    $latest_articles = get_cached_friend_link_rss_data();
    $all_articles = array();
    foreach ($latest_articles as $link_name => $articles) {
        foreach ($articles as $article) {
            $all_articles[] = $article;
        }
    }

    usort($all_articles, function ($a, $b) {
        $date1 = date('Y-m-d', strtotime($a['item_date']));
        $date2 = date('Y-m-d', strtotime($b['item_date']));
        if ($date1 === $date2) {
            return strcmp($a['link_name'], $b['link_name']);
        } else {
            return strtotime($b['item_date']) - strtotime($a['item_date']);
        }
    });

    $sorted_articles = array();
    foreach ($all_articles as $article) {
        $sorted_articles[$article['link_name']][] = $article;
    }

    foreach ($sorted_articles as $link_name => $articles) {
        usort($articles, function ($a, $b) {
            return strtotime($b['item_date']) - strtotime($a['item_date']);
        });
        $sorted_articles[$link_name] = array_slice($articles, 0, 5);
    }

    return $sorted_articles;
}

// 获取并保存最新的 RSS 内容
function get_rss_content($feed_url) {
    $response = wp_safe_remote_get($feed_url, array('sslverify' => true));
    if (!is_wp_error($response) && wp_remote_retrieve_response_code($response) === 200) {
        return wp_remote_retrieve_body($response);
    } else {
        $response = wp_safe_remote_get($feed_url, array('sslverify' => false));
        if (!is_wp_error($response) && wp_remote_retrieve_response_code($response) === 200) {
            return wp_remote_retrieve_body($response);
        } else {
            return '无法从提供 RSS 的 URL 获取 RSS 内容。';
        }
    }
}

// 使用 SimplePie 获取 RSS 项
function get_rss_items($cache_file) {
    $rss = new SimplePie();
    $rss->set_feed_url($cache_file);
    $rss->init();
    $rss->handle_content_type();
    $rss->set_output_encoding('UTF-8');
    return $rss->get_items();
}

// 获取并显示友情链接的最新文章
$latest_articles = get_latest_friend_link_articles();
foreach ($latest_articles as $link_name => $articles) {
   ?>
    <div class="friend-link-container" style="border: 1px dashed #000; padding: 10px; margin-bottom: 10px; display: flex; align-items: center;">
        <!-- 左侧显示友情链接的网站 Logo 和名称 -->
        <div class="friend-link-info" style="width: 20%; text-align: center;">
            <img src="<?php echo esc_url($articles[0]['link_logo']);?>" alt="<?php echo esc_attr($link_name);?> Logo" style="border-radius: 50%; width: 60px; height: 60px;">
            <a href="<?php echo esc_url($articles[0]['link_url']);?>" target="_blank"><p style="margin: 0; padding: 0;"><?php echo esc_html($link_name);?></p></a>
        </div>
        <!-- 右侧显示最新更新的前五篇文章 -->
        <div class="friend-link-articles" style="width: 80%; padding-left: 10px;">
            <?php foreach ($articles as $article) :?>
                <p style="margin: 0; padding: 0;">
                    <a href="<?php echo esc_url($article['item_link']);?>" target="_blank"><?php echo esc_html($article['item_title']);?></a>(<?php echo esc_html(date('Y-m-d', strtotime($article['item_date'])));?>)
                </p>
            <?php endforeach;?>
        </div>
    </div>
    <?php
}

// 侧边栏
get_sidebar();

echo '</main><!-- #main -->';
echo '</div><!-- #primary -->';

get_footer();
?>

大功告成!

Comments | 18 条评论
  • 依晨

    Safari 17 Safari 17 Mac OS X 10.15 Mac OS X 10.15 1中国–广东–东莞 移动 ip address 223.74.*.*

    看不到代码怎么办?😅

    • 似水流年

      IBrowse r IBrowse r Android 12 Android 12 1中国–河南–漯河 电信 ip address 222.89.*.*

      评论后刷新一下。

      • 依晨

        Google Chrome 130 Google Chrome 130 Mac OS X 10.15 Mac OS X 10.15 1中国–广东–东莞 移动 ip address 223.74.*.*

        刷新也看不到。。。

        • 似水流年

          IBrowse r IBrowse r Android 12 Android 12 1中国–河南–濮阳 移动 ip address 39.144.*.*

          我把回复可见删除了,可以了。

          • 依晨

            Google Chrome 130 Google Chrome 130 Mac OS X 10.15 Mac OS X 10.15 1中国–广东–东莞 移动 ip address 223.74.*.*

            谢谢,辛苦啦!🌹

            • 似水流年

              IBrowse r IBrowse r Android 12 Android 12 1中国–河南–漯河 电信 ip address 222.89.*.*

              不客气😄

  • 依晨

    Google Chrome 130 Google Chrome 130 Mac OS X 10.15 Mac OS X 10.15 1中国–广东–东莞 移动 ip address 223.74.*.*

    看不到,再膜拜一下😀

  • 依晨

    Google Chrome 130 Google Chrome 130 Mac OS X 10.15 Mac OS X 10.15 1中国–广东–东莞 移动 ip address 223.74.*.*

    膜拜一下大神。。。

  • 公子扶苏

    Microsoft Edge 109 Microsoft Edge 109 Windows 7 Windows 7 1中国–江苏–苏州 电信 ip address 222.92.*.*

    再来看一眼这个代码😄

  • 扶苏

    Microsoft Edge 131 Microsoft Edge 131 Windows 10 Windows 10 1美国 ip address 2604:9cc0:13:10f1:*:*

    评论后无法看到代码了。。。再试一次😅

    • 似水流年

      IBrowse r IBrowse r Android 12 Android 12 1中国 中国联通 ip address 2408:8220:5f13:dc90:*:*

      评论之后浏览器刷新下,但不要清除cookies或进入无痕模式。

  • 扶苏

    Microsoft Edge 131 Microsoft Edge 131 Windows 10 Windows 10 1美国 ip address 2604:9cc0:13:10f1:*:*

    再研究下

    • 扶苏

      Microsoft Edge 131 Microsoft Edge 131 Windows 10 Windows 10 1美国 ip address 2604:9cc0:13:10f1:*:*

      有可能是根目录

  • 公子扶苏

    Microsoft Edge 109 Microsoft Edge 109 Windows 7 Windows 7 1中国–江苏–苏州 电信 ip address 222.92.*.*

    我在主题目录下,没找到 page 这个目录啊。。。

    • 似水流年

      Google Chrome 93 Google Chrome 93 GNU/Linux GNU/Linux 1中国 中国联通 ip address 2408:8220:5f13:dc90:*:*

      就是你的页面目录,后台新建页面的那个目录。

  • 公子扶苏

    Microsoft Edge 109 Microsoft Edge 109 Windows 7 Windows 7 1中国–江苏–苏州–吴中区 电信 ip address 58.210.*.*

    膜拜下大佬

  • obaby

    Google Chrome 118 Google Chrome 118 Mac OS X 10.15 Mac OS X 10.15 1中国–山东–济南 联通 ip address 112.224.*.*

    这个聚合效果不错

    • 似水流年

      IBrowse r IBrowse r Android 10 Android 10 1中国–河南–漯河 联通 ip address 115.48.*.*

      没办法了,只能先用这个了。😆

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

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