天气与日历

找回密码
立即注册
搜索
热搜: 博客 优化
发新帖

1636

积分

17

好友

8

主题
发表于 4 天前 | 查看: 48| 回复: 0 IP:甘肃兰州
在本文中,我们将通过 GoToSocial 的 RSS 输出,在 WordPress 博客中创建一个类似朋友圈的“说说”页面,支持:
  • 图文显示
  • 图片点击放大(Lightbox)
  • 分页“加载更多”功能
不需要代码能力,只需复制粘贴修改几个地方即可完成。

一、准备工作
一般格式是:https://你的gts实例/@你的用户名/feed.rss

二、创建页面模板文件 page-gotosocial.php
  1. <?php
  2. /* Template Name: GotoSocial Timeline */
  3. get_header();

  4. echo '
  5. <link href="https://cdn.jsdelivr.net/npm/lightbox2@2/dist/css/lightbox.min.css" rel="stylesheet">
  6. <script src="https://cdn.jsdelivr.net/npm/lightbox2@2/dist/js/lightbox.min.js"></script>
  7. <style>
  8. #gts-container {
  9. max-width: 640px;
  10. margin: 30px auto;
  11. padding: 0 16px;
  12. }
  13. /* 样式略,可根据需要自定义 */
  14. .gts-post {
  15. display: flex;
  16. align-items: flex-start;
  17. padding: 16px 0;
  18. border-bottom: 1px solid rgba(0,0,0,0.05);
  19. }
  20. .gts-avatar {
  21. width: 48px; height: 48px;
  22. border-radius: 50%;
  23. overflow: hidden;
  24. margin-right: 12px;
  25. }
  26. .gts-avatar img {
  27. width: 100%; height: 100%; object-fit: cover;
  28. }
  29. .gts-body { flex: 1; font-size: 15px; line-height: 1.6; }
  30. .gts-name { font-weight: 600; font-size: 14px; margin-bottom: 4px; }
  31. .gts-content { margin-bottom: 8px; }
  32. .gts-images {
  33. display: grid;
  34. grid-template-columns: repeat(auto-fill, minmax(90px, 1fr));
  35. gap: 6px;
  36. margin-bottom: 8px;
  37. }
  38. .gts-images a img {
  39. width: 100%; height: 90px;
  40. object-fit: cover;
  41. border-radius: 6px;
  42. transition: transform 0.2s ease;
  43. }
  44. .gts-images a:hover img {
  45. transform: scale(1.03);
  46. }
  47. .gts-date { font-size: 12px; color: #999; }
  48. #load-more {
  49. display: block;
  50. margin: 24px auto 40px;
  51. padding: 8px 16px;
  52. border: 1px solid #ccc;
  53. border-radius: 8px;
  54. background-color: transparent;
  55. cursor: pointer;
  56. }
  57. </style>
  58. ';

  59. class GoToSocialRss {
  60. private $feed_url = 'https://duanbo.cc/@duanxiansen/feed.rss'; // ← 修改为你自己的RSS地址

  61. public function get_timeline($page = 1, $per_page = 5) {
  62. $rss = fetch_feed($this->feed_url);
  63. if (is_wp_error($rss)) {
  64. return ['success' => false, 'error' => '无法加载 RSS。'];
  65. }
  66. $items = $rss->get_items();
  67. $offset = ($page - 1) * $per_page;
  68. $paged_items = array_slice($items, $offset, $per_page);
  69. $has_more = ($offset + $per_page) < count($items);
  70. return ['success' => true, 'data' => ['items' => $paged_items, 'has_more' => $has_more]];
  71. }

  72. public function render_item($item) {
  73. $content = $item->get_content();
  74. $date = $item->get_date('Y-m-d H:i');
  75. $images = '';
  76. foreach ($item->get_enclosures() as $enclosure) {
  77. $url = esc_url($enclosure->get_link());
  78. $type = $enclosure->get_type();
  79. if (strpos($type, 'image/') === 0) {
  80. $images .= "<a href='{$url}' data-lightbox='gts'><img src='{$url}' alt='image' /></a>";
  81. }
  82. }
  83. $avatar_url = 'https://duanxiansen.com/avatar.jpg'; // ← 修改为你自己的头像地址
  84. $nickname = '段先森'; // ← 修改为你的昵称
  85. return "<div class='gts-post'>
  86. <div class='gts-avatar'><img src='{$avatar_url}' alt='avatar'></div>
  87. <div class='gts-body'>
  88. <div class='gts-name'>{$nickname}</div>
  89. <div class='gts-content'>{$content}</div>
  90. <div class='gts-images'>{$images}</div>
  91. <div class='gts-date'>{$date}</div>
  92. </div>
  93. </div>";
  94. }
  95. }

  96. $page = 1;
  97. $gts = new GoToSocialRss();
  98. $result = $gts->get_timeline($page);
  99. ?>

  100. <div id="gts-container">
  101. <?php
  102. if ($result['success']) {
  103. foreach ($result['data']['items'] as $item) {
  104. echo $gts->render_item($item);
  105. }
  106. if ($result['data']['has_more']) {
  107. echo '<button id="load-more" data-page="1">加载更多</button>';
  108. }
  109. } else {
  110. echo '<div class="error">加载失败:' . esc_html($result['error']) . '</div>';
  111. }
  112. ?>
  113. </div>

  114. <script>
  115. document.addEventListener('DOMContentLoaded', function () {
  116. const btn = document.getElementById('load-more');
  117. if (btn) {
  118. btn.addEventListener('click', function () {
  119. const page = parseInt(this.dataset.page) + 1;
  120. const formData = new FormData();
  121. formData.append('action', 'load_more_gts');
  122. formData.append('page', page);

  123. fetch('<?php echo admin_url('admin-ajax.php'); ?>', {
  124. method: 'POST',
  125. credentials: 'same-origin',
  126. body: formData
  127. }).then(res => res.text()).then(html => {
  128. const wrapper = document.createElement('div');
  129. wrapper.innerHTML = html;
  130. this.insertAdjacentElement('beforebegin', wrapper);
  131. this.dataset.page = page;
  132. if (html.includes('data-end="1"')) {
  133. this.remove();
  134. }
  135. }).catch(err => {
  136. console.error('AJAX 加载失败:', err);
  137. });
  138. });
  139. }
  140. });
  141. </script>

  142. <?php get_footer(); ?>
复制代码
三、在后台新建页面并应用模板
  • 进入 WordPress 后台 → 页面 → 新建页面
  • 命名为:说说 或 Timeline
  • 页面右侧模板选择:GotoSocial Timeline
  • 发布



四、添加 AJAX 处理函数
将以下内容添加到你主题的 functions.php 文件末尾:

  1. add_action('wp_ajax_load_more_gts', 'load_more_gts_ajax');
  2. add_action('wp_ajax_nopriv_load_more_gts', 'load_more_gts_ajax');

  3. function load_more_gts_ajax() {
  4. require_once ABSPATH . WPINC . '/feed.php';

  5. class GoToSocialRss {
  6. private $feed_url = 'https://duanbo.cc/@duanxiansen/feed.rss'; // 修改为你的

  7. public function get_timeline($page = 1, $per_page = 5) {
  8. $rss = fetch_feed($this->feed_url);
  9. if (is_wp_error($rss)) {
  10. return ['success' => false, 'error' => '无法加载 RSS。'];
  11. }
  12. $items = $rss->get_items();
  13. $offset = ($page - 1) * $per_page;
  14. $paged_items = array_slice($items, $offset, $per_page);
  15. $has_more = ($offset + $per_page) < count($items);
  16. return ['success' => true, 'data' => ['items' => $paged_items, 'has_more' => $has_more]];
  17. }

  18. public function render_item($item) {
  19. $content = $item->get_content();
  20. $date = $item->get_date('Y-m-d H:i');
  21. $images = '';
  22. foreach ($item->get_enclosures() as $enclosure) {
  23. $url = esc_url($enclosure->get_link());
  24. $type = $enclosure->get_type();
  25. if (strpos($type, 'image/') === 0) {
  26. $images .= "<a href='{$url}' data-lightbox='gts'><img src='{$url}' alt='image' /></a>";
  27. }
  28. }
  29. $avatar_url = 'https://duanxiansen.com/avatar.jpg'; // ← 修改为你头像
  30. $nickname = '段先森'; // ← 修改为你昵称
  31. return "<div class='gts-post'>
  32. <div class='gts-avatar'><img src='{$avatar_url}' alt='avatar'></div>
  33. <div class='gts-body'>
  34. <div class='gts-name'>{$nickname}</div>
  35. <div class='gts-content'>{$content}</div>
  36. <div class='gts-images'>{$images}</div>
  37. <div class='gts-date'>{$date}</div>
  38. </div>
  39. </div>";
  40. }
  41. }

  42. $page = isset($_POST['page']) ? intval($_POST['page']) : 1;
  43. $gts = new GoToSocialRss();
  44. $result = $gts->get_timeline($page);

  45. if ($result['success']) {
  46. foreach ($result['data']['items'] as $item) {
  47. echo $gts->render_item($item);
  48. }
  49. if (!$result['data']['has_more']) {
  50. echo '<div data-end="1" style="display:none;"></div>';
  51. }
  52. } else {
  53. echo '<div class="error">加载失败:' . esc_html($result['error']) . '</div>';
  54. }

  55. wp_die(); // 重要!
  56. }
复制代码



六、其他说明
  • 如果你使用了缓存插件,请清除页面缓存以看到最新效果。
  • 建议在 GoToSocial 中开启 feed.rss 支持或确认地址是否正确。
  • 本方式不依赖 API Token,更适合静态展示。




七、欢迎交流
你可以在评论区留言,也欢迎 fork 改造这个模板样式。如果你希望集成评论、Emoji、Markdown 等高级功能,可以考虑使用 GoToSocial 的 API + Token,但实现更复杂。

嘿,这是我的博客:https://www.duanxiansen.com/
您需要登录后才可以回帖 登录 | 立即注册

QQ|Archiver|手机版|小黑屋|博客圈子

GMT+8, 2025-6-19 05:00 , Processed in 2.899237 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表