|
发表于 4 天前
|
查看: 48 |
回复: 0 IP:甘肃兰州
在本文中,我们将通过 GoToSocial 的 RSS 输出,在 WordPress 博客中创建一个类似朋友圈的“说说”页面,支持: - 图文显示
- 图片点击放大(Lightbox)
- 分页“加载更多”功能
不需要代码能力,只需复制粘贴修改几个地方即可完成。
一、准备工作 一般格式是:https://你的gts实例/@你的用户名/feed.rss
二、创建页面模板文件 page-gotosocial.php - <?php
- /* Template Name: GotoSocial Timeline */
- get_header();
- echo '
- <link href="https://cdn.jsdelivr.net/npm/lightbox2@2/dist/css/lightbox.min.css" rel="stylesheet">
- <script src="https://cdn.jsdelivr.net/npm/lightbox2@2/dist/js/lightbox.min.js"></script>
- <style>
- #gts-container {
- max-width: 640px;
- margin: 30px auto;
- padding: 0 16px;
- }
- /* 样式略,可根据需要自定义 */
- .gts-post {
- display: flex;
- align-items: flex-start;
- padding: 16px 0;
- border-bottom: 1px solid rgba(0,0,0,0.05);
- }
- .gts-avatar {
- width: 48px; height: 48px;
- border-radius: 50%;
- overflow: hidden;
- margin-right: 12px;
- }
- .gts-avatar img {
- width: 100%; height: 100%; object-fit: cover;
- }
- .gts-body { flex: 1; font-size: 15px; line-height: 1.6; }
- .gts-name { font-weight: 600; font-size: 14px; margin-bottom: 4px; }
- .gts-content { margin-bottom: 8px; }
- .gts-images {
- display: grid;
- grid-template-columns: repeat(auto-fill, minmax(90px, 1fr));
- gap: 6px;
- margin-bottom: 8px;
- }
- .gts-images a img {
- width: 100%; height: 90px;
- object-fit: cover;
- border-radius: 6px;
- transition: transform 0.2s ease;
- }
- .gts-images a:hover img {
- transform: scale(1.03);
- }
- .gts-date { font-size: 12px; color: #999; }
- #load-more {
- display: block;
- margin: 24px auto 40px;
- padding: 8px 16px;
- border: 1px solid #ccc;
- border-radius: 8px;
- background-color: transparent;
- cursor: pointer;
- }
- </style>
- ';
- class GoToSocialRss {
- private $feed_url = 'https://duanbo.cc/@duanxiansen/feed.rss'; // ← 修改为你自己的RSS地址
- public function get_timeline($page = 1, $per_page = 5) {
- $rss = fetch_feed($this->feed_url);
- if (is_wp_error($rss)) {
- return ['success' => false, 'error' => '无法加载 RSS。'];
- }
- $items = $rss->get_items();
- $offset = ($page - 1) * $per_page;
- $paged_items = array_slice($items, $offset, $per_page);
- $has_more = ($offset + $per_page) < count($items);
- return ['success' => true, 'data' => ['items' => $paged_items, 'has_more' => $has_more]];
- }
- public function render_item($item) {
- $content = $item->get_content();
- $date = $item->get_date('Y-m-d H:i');
- $images = '';
- foreach ($item->get_enclosures() as $enclosure) {
- $url = esc_url($enclosure->get_link());
- $type = $enclosure->get_type();
- if (strpos($type, 'image/') === 0) {
- $images .= "<a href='{$url}' data-lightbox='gts'><img src='{$url}' alt='image' /></a>";
- }
- }
- $avatar_url = 'https://duanxiansen.com/avatar.jpg'; // ← 修改为你自己的头像地址
- $nickname = '段先森'; // ← 修改为你的昵称
- return "<div class='gts-post'>
- <div class='gts-avatar'><img src='{$avatar_url}' alt='avatar'></div>
- <div class='gts-body'>
- <div class='gts-name'>{$nickname}</div>
- <div class='gts-content'>{$content}</div>
- <div class='gts-images'>{$images}</div>
- <div class='gts-date'>{$date}</div>
- </div>
- </div>";
- }
- }
- $page = 1;
- $gts = new GoToSocialRss();
- $result = $gts->get_timeline($page);
- ?>
- <div id="gts-container">
- <?php
- if ($result['success']) {
- foreach ($result['data']['items'] as $item) {
- echo $gts->render_item($item);
- }
- if ($result['data']['has_more']) {
- echo '<button id="load-more" data-page="1">加载更多</button>';
- }
- } else {
- echo '<div class="error">加载失败:' . esc_html($result['error']) . '</div>';
- }
- ?>
- </div>
- <script>
- document.addEventListener('DOMContentLoaded', function () {
- const btn = document.getElementById('load-more');
- if (btn) {
- btn.addEventListener('click', function () {
- const page = parseInt(this.dataset.page) + 1;
- const formData = new FormData();
- formData.append('action', 'load_more_gts');
- formData.append('page', page);
- fetch('<?php echo admin_url('admin-ajax.php'); ?>', {
- method: 'POST',
- credentials: 'same-origin',
- body: formData
- }).then(res => res.text()).then(html => {
- const wrapper = document.createElement('div');
- wrapper.innerHTML = html;
- this.insertAdjacentElement('beforebegin', wrapper);
- this.dataset.page = page;
- if (html.includes('data-end="1"')) {
- this.remove();
- }
- }).catch(err => {
- console.error('AJAX 加载失败:', err);
- });
- });
- }
- });
- </script>
- <?php get_footer(); ?>
复制代码三、在后台新建页面并应用模板 - 进入 WordPress 后台 → 页面 → 新建页面
- 命名为:说说 或 Timeline
- 页面右侧模板选择:GotoSocial Timeline
- 发布
四、添加 AJAX 处理函数
将以下内容添加到你主题的 functions.php 文件末尾:
- add_action('wp_ajax_load_more_gts', 'load_more_gts_ajax');
- add_action('wp_ajax_nopriv_load_more_gts', 'load_more_gts_ajax');
- function load_more_gts_ajax() {
- require_once ABSPATH . WPINC . '/feed.php';
- class GoToSocialRss {
- private $feed_url = 'https://duanbo.cc/@duanxiansen/feed.rss'; // 修改为你的
- public function get_timeline($page = 1, $per_page = 5) {
- $rss = fetch_feed($this->feed_url);
- if (is_wp_error($rss)) {
- return ['success' => false, 'error' => '无法加载 RSS。'];
- }
- $items = $rss->get_items();
- $offset = ($page - 1) * $per_page;
- $paged_items = array_slice($items, $offset, $per_page);
- $has_more = ($offset + $per_page) < count($items);
- return ['success' => true, 'data' => ['items' => $paged_items, 'has_more' => $has_more]];
- }
- public function render_item($item) {
- $content = $item->get_content();
- $date = $item->get_date('Y-m-d H:i');
- $images = '';
- foreach ($item->get_enclosures() as $enclosure) {
- $url = esc_url($enclosure->get_link());
- $type = $enclosure->get_type();
- if (strpos($type, 'image/') === 0) {
- $images .= "<a href='{$url}' data-lightbox='gts'><img src='{$url}' alt='image' /></a>";
- }
- }
- $avatar_url = 'https://duanxiansen.com/avatar.jpg'; // ← 修改为你头像
- $nickname = '段先森'; // ← 修改为你昵称
- return "<div class='gts-post'>
- <div class='gts-avatar'><img src='{$avatar_url}' alt='avatar'></div>
- <div class='gts-body'>
- <div class='gts-name'>{$nickname}</div>
- <div class='gts-content'>{$content}</div>
- <div class='gts-images'>{$images}</div>
- <div class='gts-date'>{$date}</div>
- </div>
- </div>";
- }
- }
- $page = isset($_POST['page']) ? intval($_POST['page']) : 1;
- $gts = new GoToSocialRss();
- $result = $gts->get_timeline($page);
- if ($result['success']) {
- foreach ($result['data']['items'] as $item) {
- echo $gts->render_item($item);
- }
- if (!$result['data']['has_more']) {
- echo '<div data-end="1" style="display:none;"></div>';
- }
- } else {
- echo '<div class="error">加载失败:' . esc_html($result['error']) . '</div>';
- }
- wp_die(); // 重要!
- }
复制代码
六、其他说明
- 如果你使用了缓存插件,请清除页面缓存以看到最新效果。
- 建议在 GoToSocial 中开启 feed.rss 支持或确认地址是否正确。
- 本方式不依赖 API Token,更适合静态展示。
七、欢迎交流
你可以在评论区留言,也欢迎 fork 改造这个模板样式。如果你希望集成评论、Emoji、Markdown 等高级功能,可以考虑使用 GoToSocial 的 API + Token,但实现更复杂。
|
|