梦淡如非 发表于 2024-10-28 15:06:06

WordPress首页调用typecho方法!

本帖最后由 梦淡如非 于 2024-10-28 15:07 编辑

https://s.rmimg.com/2024-10-28/1730096138-265840-image.png
前段时间花了那么多的时间折腾了《WordPress首页调用memos方法!》后,怎么又来折腾Wordpress首页调用typecho呢!原因有这样的两点,首先memos的作者对memos的更新真的是太随意了,每次版本的升级,你会想不到他会把什么功能给删掉、或是更想不到把数据库的结构给改了、还有就是随意改变API的接口。也正因为他的随意,一部分人还保持在低版本来使用,另外一部分人就是直接弃用了,所以我想着说不定哪一天也会弃用memos。另外的一个原因就是除了老张博客之外,我还有一个老张随笔,一直保持每日一更新,字数都是在二百字,就像朋友圈一样,最初是用typecho程序,后来改用memos,目前那个typecho上面还放着一千两百多篇随笔。我想与其这样牵强的用着memos,不如退回来用typecho算了。有了上面的想法后,就想着把我的wordpress和typecho来个“整合”,在wordpress调用typecho的首篇文章。有了上一次的折腾,这次算是轻车熟路了,前前后后的折腾有两个小时。通过这次的折腾,让我对AI又有了新的认识,上次我认为是“豆包最聪明”,结果经过这次的“折腾”发现把相同的问题多次的提问同一个AI,每次他给出的答案也是不一样的。单单就响应速度来说,官方的GPT最为快,所以这次代码就是借助官方GPT来完成的。话不多说,直接上代码吧!忘了一个重要的事: typecho本身没有提供API接口服务,这里我找到一款插件,Restful,安装后直接启用就行,因为我是直接调用文章的,其他的API接口就被我给关了!1.把下面的代码插入到主题文件的index.php合适位置。<?php
$data = fetch_typecho_data();
if ($data):
?>
<div class="latest-update" style="background-color: #f8f8f8;">
<div class="latest-update-header">
<h2>最新动态</h2>
<span class="latest-update-time"><?php echo esc_html($data['time_content']); ?></span>
</div>
<div class="latest-update-divider"></div>
<div class="latest-update-content"><?php echo esc_html($data['content']); ?></div>
<div class="latest-update-images">
<?php foreach ($data['image_content'] as $img_url): ?>
<a href="<?php echo esc_url($img_url); ?>" data-lightbox="latest-update-gallery">
<img src="<?php echo esc_url($img_url); ?>" alt="Image">
</a>
<?php endforeach; ?>
</div>
<div class="latest-update-footer">
<span class="latest-update-tag"><?php echo esc_html($data['tag_content']); ?></span>
<a class="latest-update-link" href="<?php echo esc_url($data['link_content']); ?>" target="_blank">查看全文</a>
</div>
</div>
<?php endif; ?>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lightbox2/2.11.4/js/lightbox-plus-jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/lightbox2/2.11.4/css/lightbox.min.css">
2.把CSS样式代码放置到主题CSS定义设置里,当然也可以直接放到style.css中。



/* 首页调用typecho样式 */
.latest-update {
    width: calc(100% - 40px); /* 设置宽度为100%减去40px,确保有左右边距 */
    background-color: #f8f8f8 ; /* 强制设置背景颜色为浅灰色 */
    border: 1px solid #ddd; /* 添加1像素的灰色边框 */
    border-radius: 10px; /* 圆角边框,半径为10px */
    padding: 20px 20px 10px 20px; /* 内边距,上下10px,左右20px */
    margin: 20px 0; /* 外边距,上下20px,左右0 */
    text-align: left; /* 文本左对齐 */
    margin-top: -10px; /* 减少与顶部的距离为0 */
    margin-bottom: 30px; /* 增加与文章列表的距离为40px */
    margin-right: 20px; /* 设置右边距为20px */
}

.latest-update-header {
    display: flex; /* 使用弹性盒模型布局 */
    justify-content: space-between; /* 头部元素左右分散排列 */
    align-items: center; /* 垂直居中对齐 */
    margin-bottom: 10px; /* 头部与下方内容的外边距为10px */
}

.latest-update h2 {
    font-size: 15px; /* 标题字体大小为15px */
    margin: 0; /* 去除默认外边距 */
    padding-left: 0px; /* 左边填充为0 */
}

.latest-update-time {
    font-size: 14px; /* 时间字体大小为14px */
    color: #666; /* 时间文本颜色为中灰色 */
    margin-right: 0px; /* 右边距为0 */
}

.latest-update-divider {
    border-bottom: 1px solid #333; /* 添加底部边框,颜色为深灰色 */
    margin: 10px 0; /* 上下外边距为10px */
}

.latest-update-content {
    text-align: left; /* 内容文本左对齐 */
    line-height: 1.5; /* 行高设置为1.5倍 */
    margin: 10px 0; /* 上下外边距为10px */
}

.latest-update-images {
    text-align: left; /* 图片区域文本左对齐 */
    margin: 10px 0; /* 上下外边距为10px */
}

.latest-update-images img {
    width: 100px; /* 图片宽度为80px */
    height: 75px; /* 图片高度为80px */
    object-fit: cover; /* 图片覆盖方式,保持比例并裁剪 */
    border-radius: 8px; /* 图片圆角,半径为8px */
    box-shadow: 0 4px 10px rgba(0, 0, 0, 1); /* 添加阴影效果 */
    margin: 3px; /* 图片外边距为5px */
    transition: transform 0.3s, opacity 0.3s; /* 添加平滑过渡效果 */
}

.latest-update-images img:hover {
    transform: scale(1.1); /* 鼠标悬停时放大10% */
    opacity: 0.9; /* 鼠标悬停时透明度降低到0.9 */
}

.latest-update-footer {
    display: flex; /* 使用弹性盒模型布局 */
    justify-content: space-between; /* 底部元素左右分散排列 */
    align-items: center; /* 垂直居中对齐 */
    margin-top: 10px; /* 底部与上方内容的外边距为10px */
    padding-top: 10px; /* 上内边距为10px */
    border-top: 1px solid #ddd; /* 添加顶部边框,颜色为浅灰色 */
}

.latest-update-tag {
    background-color: #e0e0e0; /* 标签背景颜色为淡灰色 */
    border-radius: 5px; /* 标签圆角,半径为5px */
    padding: 5px 10px; /* 内边距,上下5px,左右10px */
    font-size: 14px; /* 标签字体大小为14px */
}

.latest-update-link {
    text-decoration: none; /* 去除链接的下划线 */
    color: #0073aa; /* 设置链接颜色为蓝色 */
    font-size: 14px; /* 链接字体大小为14px */
}
/* 首面调用typecho结束 */

3.把下面代码插入到主题functions.php文件中。

//-------首页调用typehco代码-----开始
function fetch_typecho_data() {
    $api_url = "https://suibi.zhangbo.net/api/posts?pageSize=1";
    $response = wp_remote_get($api_url);
    if (is_wp_error($response)) {
      return;
    }
    $body = wp_remote_retrieve_body($response);
    $data = json_decode($body, true);

    if ($data['status'] !== 'success' || empty($data['data']['dataSet'])) {
      return;
    }

    $post = $data['data']['dataSet'];
   
    // 1. 链接内容
    $link_content = "https://suibi.zhangbo.net/archives/" . $post['cid'] . ".html";
   
    // 2. 标签内容
    $tag_content = "#" . $post['categories']['name'];
   
    // 3. 时间内容
    $created_time = (int)$post['created'];
    $current_time = time();
    $time_diff = $current_time - $created_time;
   
    if ($time_diff < 3600) {
      $time_content = floor($time_diff / 60) . "分钟前";
    } elseif ($time_diff < 86400) {
      $time_content = floor($time_diff / 3600) . "小时前";
    } elseif ($time_diff < 2592000) {
      $time_content = floor($time_diff / 86400) . "天前";
    } else {
      $time_content = date("Y年m月d日", $created_time);
    }
   
    // 4. 摘要内容
    $digest = strip_tags($post['digest'], "");
    $content = mb_strlen($digest, 'UTF-8') <= 200 ? $digest : mb_substr($digest, 0, 200, 'UTF-8') . "......";
   
    // 5. 图片内容
    preg_match_all('/<img.*?src=["\'](.*?)["\'].*?>/i', $post['digest'], $matches);
    $image_content = $matches;

    return [
      'link_content' => $link_content,
      'tag_content' => $tag_content,
      'time_content' => $time_content,
      'content' => $content,
      'image_content' => $image_content
    ];
}
页: [1]
查看完整版本: WordPress首页调用typecho方法!