小归客 - 建站教程 https://ovogk.com/category/%E5%BB%BA%E7%AB%99%E6%95%99%E7%A8%8B/ Typecho三栏主题GK#新作品 https://ovogk.com/archives/234/ 2025-08-09T00:29:00+08:00 介绍略略略,不想写,看GK主题演示截图更新日志2025.8.8更新如下新增:毛的没用新增:联系方式(快手,QQ跳转没成功)新增:文章阅读量新增:搜索栏新增:白天/夜间模式新增:音乐歌单播放器框架:三栏主题 Typecho插件-游戏、影视、友链、博客订阅 https://ovogk.com/archives/225/ 2025-07-31T01:00:00+08:00 播客解说 前言这里是4个完全独立Typecho插件,分别是博客订阅插件BlogSubscribe、友情链接插件LinkShow、游戏记录插件GameRecord、影视记录插件MovieRecord,每个插件都拥有不一样的效果,具体看功能区,插件可能与你的其他插件不共存,但你放心,我的这4个是共存,理论上是想放那里放那里。1.博客订阅插件BlogSubscribe通过在插件后台输入订阅地址,通过短代码调用在你需要放的位置使用[小归客blog_subscribe]2.友情链接插件LinkShow在文章或者页面内填写logo、名称、地址、介绍使用。[小归客linkshow] [小归客link logo="图片地址" name="网站名称" nickname="网站昵称" url="链接地址" intro="网站介绍"] [小归客link logo="图片地址2" name="网站名称2" nickname="网站昵称2" url="链接地址2" intro="网站介绍2"] [小归客/linkshow] 其中,nickname="网站昵称2"可以删除使用非必用3.游戏记录插件GameRecord在文章或者页面填写logo、角色名、时间使用。[小归客game logo="图标地址" name="游戏名称" nickname="游戏昵称" time="游戏时间"]4.影视记录插件MovieRecord在文章或者页面填写封面、名称、链接使用。[小归客movie img="https://img1.baidu.com/it/u=3042287271,1241422176&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=701" name="仙逆" url="https://example.com/movie1"]注:复制粘性使用时去掉“小归客”,其实,完全不用复制,因为插件内写了使用说明了。嘻嘻嘻嘻……下载地址①.Typecho博客订阅插件BlogSubscribe.tar.gz②.Typecho插件友链LinkShow.tar.gz③.Typecho游戏记录插件.tar.gz④.Typecho影视插件MovieRecord.tar.gz插件运行在php7.4、Typecho1.2.1版本上没有问题。部分主题可能不兼容。如果你同时使用了Typecho短代码插件MyShortcodes可能是不兼容的。百度网盘(防失效)永久下载地址博客订阅链接:https://pan.baidu.com/s/103xTg4SeR-x6gtqkEk5YLg?pwd=7715 友情链接链接:https://pan.baidu.com/s/11Q7cV9jsl9oLHsmh5aUYpA?pwd=q316 游戏记录链接:https://pan.baidu.com/s/13mXaGDMn06FsWc4dbnR0Ng?pwd=46io 影视记录链接:https://pan.baidu.com/s/1pw0yFegZNAl6EFZbuO9rCA?pwd=4r68  写了一款typecho短代码插件 https://ovogk.com/archives/222/ 2025-07-30T19:27:00+08:00 写的一款typecho插件,里面有10个短代码,理论上是上传安装既用。经过测试“typecho默认主题、joe主题”是没有bug,正常使用的,具体看下面:插件下载:Typecho短代码插件MyShortcodes.tar.gz非常不错的插件。演示[timeline][timeline-item title="2023年" date="1月"]项目启动,完成需求分析[/timeline-item][timeline-item title="2023年" date="6月"]开发阶段,完成核心功能[/timeline-item][timeline-item title="2023年" date="12月"]项目上线,开始运营[/timeline-item][/timeline][process][process-step title="需求分析" icon="fa fa-search"]收集并分析用户需求[/process-step][process-step title="设计阶段" icon="fa fa-pencil"]完成UI和UX设计[/process-step][process-step title="开发阶段" icon="fa fa-code"]实现功能开发[/process-step][process-step title="测试上线" icon="fa fa-rocket">进行测试并正式上线[/process-step][/process][tooltip text="这是一个提示" position="top"]悬停我[/tooltip][accordion][accordion-item title="常见问题1"]这是第一个问题的答案内容[/accordion-item][accordion-item title="常见问题2"]这是第二个问题的答案内容[/accordion-item][accordion-item title="常见问题3">这是第三个问题的答案内容[/accordion-item][/accordion][progress percent="75" color="blue">项目完成度[/progress][icon name="fa fa-home" size="2x" color="red"]首页图标[/icon][spoiler title="点击查看答案"]这是隐藏的答案内容,需要点击才能查看。[/spoiler][tabs][tab title="选项1"]这里是第一个选项卡的内容。[/tab][tab title="选项2"]这里是第二个选项卡的内容,可以放任何东西。[/tab][tab title="选项3"]这里是第三个选项卡的内容。[/tab][tab title="选项4"]这里是第四个选项卡的内容。[/tab][/tabs][alert type="success"]恭喜你,操作成功![/alert][alert type="warning"]这是一个警告信息,请注意。[/alert][button url="https://www.example.com" color="green" size="large" blank="true"]点击访问示例网站[/button][column width="1/2"]这是第一栏的内容。[/column][column width="1/2"]这是第二栏的内容。[/column]好像绝大多数主题都是适配的。。复制代码下载上面的文件>安装后,复制下方短代码到你编辑中保存就可以了。<!-- 时间线示例 --> [timeline@] [timeline-item title="2023年" date="1月"]项目启动,完成需求分析[/timeline-item] [timeline-item title="2023年" date="6月"]开发阶段,完成核心功能[/timeline-item] [timeline-item title="2023年" date="12月"]项目上线,开始运营[/timeline-item] [/timeline@] <!-- 流程图示例 --> [process@] [process-step title="需求分析" icon="fa fa-search"]收集并分析用户需求[/process-step] [process-step title="设计阶段" icon="fa fa-pencil"]完成UI和UX设计[/process-step] [process-step title="开发阶段" icon="fa fa-code"]实现功能开发[/process-step] [process-step title="测试上线" icon="fa fa-rocket">进行测试并正式上线[/process-step] [/process@] <!-- 提示框示例 --> [@tooltip text="这是一个提示" position="top"]悬停我[/tooltip@] <!-- 手风琴示例 --> [@accordion] [accordion-item title="常见问题1"]这是第一个问题的答案内容[/accordion-item] [accordion-item title="常见问题2"]这是第二个问题的答案内容[/accordion-item] [accordion-item title="常见问题3">这是第三个问题的答案内容[/accordion-item] [/accordion@] <!-- 进度条示例 --> [@progress percent="75" color="blue">项目完成度[/progress@] <!-- 图标示例 --> [@icon name="fa fa-home" size="2x" color="red"]首页图标[/icon@] <!-- 剧透内容示例 --> [@spoiler title="点击查看答案"] 这是隐藏的答案内容,需要点击才能查看。 [/spoiler@] [tabs@] [tab title="选项卡1"]这里是第一个选项卡的内容。[/tab] [tab title="选项卡2"]这里是第二个选项卡的内容,可以放任何东西。[/tab] [tab title="选项卡3"]这里是第三个选项卡的内容。[/tab] [tab title="选项卡4"]这里是第四个选项卡的内容。[/tab] [/tabs@] [@alert type="success"]恭喜你,操作成功![/alert] [@alert type="warning"]这是一个警告信息,请注意。[/alert@] [@button url="https://www.example.com" color="green" size="large" blank="true"]点击访问示例网站[/button@] [@column width="1/2"] 这是第一栏的内容。 [/column@] [column width="1/2"] 这是第二栏的内容。 [/column@] <!-- 注意:分栏后最好加一个 <div class="clearfix"></div> 来清除浮动,以防布局错乱 --> <div class="clearfix"></div>复制粘贴时,去掉@字符。 CSS filter 属性的奇妙之旅 https://ovogk.com/archives/221/ 2025-07-30T10:42:00+08:00 CSS 的filter属性就是你的 “魔法棒”,只需几行代码,就能为网页元素赋予各种惊艳的视觉效果,轻松提升页面质感。认识filter属性filter属性是 CSS 中用于对元素应用图形效果(如模糊、阴影、颜色调整等)的属性。它就像一个 “视觉特效师”,能让普通的图片、文字、按钮瞬间变得与众不同。filter属性的值是一个或多个滤镜函数的组合,每个滤镜函数都对应一种特定的效果。filter属性的基本语法如下:.element {   filter: filter-function(); }例如,我们要为一个图片添加模糊效果,可以这样写:img {   filter: blur(3px); }这里的blur()就是一个滤镜函数,3px表示模糊的程度,数值越大,模糊效果越明显。常用滤镜函数2.1 模糊效果:blur()blur()函数用于给元素添加模糊效果,常被用于背景图片的虚化处理,营造出朦胧的美感,或是在鼠标悬停时,为元素添加动态的模糊过渡效果。img {   filter: blur(3px);   transition: filter .5s ease-in-out; } img:hover {   filter: blur(1px); }这个例子则展示了通过过渡动画,让图片在鼠标悬停时平滑地产生模糊变化,增加交互趣味性。2.2 阴影效果:drop-shadow()drop-shadow()函数可以为元素添加阴影,与box-shadow属性类似,但drop-shadow()更专注于模拟投影效果,且能更好地与滤镜链中的其他效果结合使用。/* 为卡片添加投影 */ .card {   filter: drop-shadow(0 4px 8px rgba(0, 0, 0, 0.8)); }上述代码中,0表示水平偏移量,4px表示垂直偏移量,8px是模糊半径,rgba(0, 0, 0, 0.8)则定义了阴影的颜色和透明度。通过调整这些参数,就能轻松打造出不同风格的阴影效果。2.3 亮度调整:brightness()brightness()函数用于调整元素的亮度,可以让图片或元素变得更亮或更暗,数值范围是0%(全黑)到200%(两倍亮度),默认值为100%。/* 降低图片亮度 */ .dim-image {   filter: brightness(70%); } /* 鼠标悬停时,图片变亮 */ .highlight-image {   transition: filter 0.3s ease; } .highlight-image:hover {   filter: brightness(120%); }利用brightness()函数,我们可以实现图片在不同状态下的亮度变化,例如在图片列表中,让鼠标悬停的图片变亮,突出显示重点内容。2.4 对比度调整:contrast()contrast()函数用于调整元素的对比度,数值范围同样是0%(完全没有对比度)到200%(两倍对比度),默认值为100%。提高对比度可以让元素的颜色更加鲜明,降低对比度则能营造出柔和的视觉效果。/* 增加文字对比度 */ .strong-contrast-text {   filter: contrast(400%); } /* 降低图片对比度 */ .soft-image {   filter: contrast(50%); }2.5 色彩反转:invert()invert()函数可以反转元素的颜色,将黑色变为白色,白色变为黑色,其他颜色也会相应地进行反转。它常用于创造有趣的视觉反差,或是制作具有科幻感、未来感的页面效果。img {   transition: filter 0.3s ease; } img:hover {   filter: invert(100%); }兼容性与注意事项虽然filter属性在现代浏览器中得到了广泛支持,但在一些老旧浏览器(如 IE 系列)中可能存在兼容性问题。为了确保网页在各种浏览器中都能正常显示,可以使用 CSS 特性查询(@supports)来提供回退方案:.element {   /* 不支持filter时的样式 */   background-color: #ccc; } @supports (filter: blur(0)) {   .element {     /* 支持filter时的样式 */     filter: blur(3px);     background-color: transparent;   } }转自:前端老鹰 typecho内置友链实现方法函数代码 https://ovogk.com/archives/220/ 2025-07-29T01:04:00+08:00 非常的简单,只需要两步就可以轻松实现。css样式什么的需要自行进行解决。 第一步把下面的函数代码添加到相关文件中,例如:function.php //内置友链,参数为内容,字符串形式。 function xm_yl($content){ if (strpos($content, '{link') !== false) { $content = preg_replace_callback('/{link title="(.+?)"}(.+?){\/link}/', function ($match){ $nr = str_replace(['<br>', '<p>', '</p>'], '', $match[2]); $content = '<div class="link_body"><div class="link_title">'.$match[1].'</div>'.$nr.'</div>'; return $content; }, $content); } if (strpos($content, '{linka') !== false) { $content = preg_replace('/{linka url="(.+?)"}(.+?){\/linka img="(.+?)"}/','<a href="\\1" target="_blank"><div class="link_body_list"><div class="link_body_img"><img class="lazyload" data-src="\\3" src="//520917.xyz/app/app/view/xmuix/public/img/jz.jpg"></div><div class="link_body_name">\\2</div></div></a>', $content); } return $content; }第二步在相关要实现友链的文件中添加以下代码。<!--?php echo xm_yl($this--->content);?> 第三步在内容中添加友链ubb代码即可 {link title="分类标题"} {linka url="url地址"}名称{/linka img="图片"} {/link}转自:寻梦博客 两种方式轻松自制随机图片获取API https://ovogk.com/archives/219/ 2025-07-28T17:56:00+08:00 在互联网中,我们常常需要快速获取各类图片资源。今天,就为大家带来一个超实用的教程,教你轻松搭建属于自己的随机图片获取API,从此告别四处寻觅图片API的繁琐。方法一、外链读取txt1.新建文件api.php <?php // 使用__DIR__常量获取当前脚本所在目录,并拼接文件路径 $filename = __DIR__. '/img.txt'; if (!file_exists($filename)) { die('文件不存在'); } // 打开文件并检查是否成功 $fs = fopen($filename, "r"); if (!$fs) { die('无法打开文件'); } // 从文本获取链接 $pics = []; while (!feof($fs)) { $line = trim(fgets($fs)); if ($line!== '') { array_push($pics, $line); } } fclose($fs); // 从数组随机获取链接 $pic = $pics[array_rand($pics)]; // 获取type参数 $type = isset($_GET['type'])? $_GET['type'] : ''; switch ($type) { // JSON返回 case 'json': header('Content - type:text/json'); die(json_encode(['pic' => $pic])); default: // 验证链接是否合法 if (!filter_var($pic, FILTER_VALIDATE_URL)) { die('无效的图片链接'); } die(header("Location: $pic")); }2.新建文件img.txt http://example.com/image1.jpg http://example.com/image2.jpg http://example.com/image3.jpg访问你的网址/api.php访问就可以实现了,api.php和 img.txt 理想存放目录是在同一目录下。如果将img.txt放于特定目录。此时,需在api.php中修改$filename变量指定完整路径,如:$filename = '/var/www/wwwroot/data/img.txt';方法二、读取本地目录模式 <?php $img_array = glob("images/*.{gif,jpg,png}", GLOB_BRACE); if (!empty($img_array)) { $img = array_rand($img_array); $dz = $img_array[$img]; header("Location: " . $dz); exit; // 重定向后终止脚本执行 } else { echo "没有找到符合条件的图片文件。"; } ?>图片丢到images文件夹下,访问api.php即可来源:白衣博客 Typecho主题非插件置顶功能 https://ovogk.com/archives/218/ 2025-07-28T17:34:00+08:00 添加在 index.php 的 $this->title(); 前面加上 $this->sticky();例如下面这段代码 <h2 class="title"><a href="<?php $this->permalink() ?>"><?php $this->sticky(); $this->title() ?></a></h2> //其实就是这个 <?php $this->sticky(); $this->title() ?>创建后台设置选项:在主题的 functions.php 文件中添加代码,创建一个新的后台设置选项来存储置顶文章的 cid // 在主题的 functions.php 文件中 $stickyCids = new Typecho_Widget_Helper_Form_Element_Text('stickyCids', NULL, NULL, _t('置顶文章CID'), _t('在这里填入置顶文章CID,支持多填,用英文逗号隔开')); $form->addInput($stickyCids); $stickyCids->setAttribute('class', 'j-setting-content j-setting-global');前台index.php添加 <?php $stickyCids = $this->options->stickyCids; if ($stickyCids) { // 用英文逗号分割 $sticky_cids = explode(',', $stickyCids); // 去除每个元素的空格并过滤掉空元素 $sticky_cids = array_filter(array_map('trim', $sticky_cids), 'trim'); $sticky_html = "<span style='color:red'>[置顶] </span>"; $db = Typecho_Db::get(); $pageSize = $this->options->pageSize; $select1 = $this->select()->where('type =?', 'post'); $select2 = $this->select()->where('type =? && status =? && created <?', 'post', 'publish', time()); $this->row = []; $this->stack = []; $this->length = 0; $order = ''; $stickyCidMap = []; $whereClauses = []; $whereParams = []; foreach ($sticky_cids as $i => $cid) { $whereClauses[] = 'cid =?'; $whereParams[] = $cid; $order.= " when ". $cid. " then ". $i; $select2->where('table.contents.cid!=?', $cid); $stickyCidMap[$cid] = $i; } if (!empty($whereClauses)) { $select1->where(implode(' OR ', $whereClauses),...$whereParams); } if (empty(trim($order))) { $orderBy = 'table.contents.created'; $sort = Typecho_Db::SORT_DESC; } else { $orderBy = null; $sort = "(case cid$order end)"; } if ($orderBy!== null) { $select1->order($orderBy, $sort); } if ($this->_currentPage == 1) { $stickyPosts = $db->fetchAll($select1); // 对获取到的置顶文章按照设置的顺序排序 usort($stickyPosts, function ($a, $b) use ($stickyCidMap) { return $stickyCidMap[$a['cid']] - $stickyCidMap[$b['cid']]; }); foreach ($stickyPosts as $sticky_post) { $sticky_post['sticky'] = $sticky_html; $this->push($sticky_post); } } $uid = $this->user->uid; if ($uid) { $select2->orWhere('authorId =? && status =?', $uid, 'private'); } $sticky_posts = $db->fetchAll($select2->order('table.contents.created', Typecho_Db::SORT_DESC)->page($this->_currentPage, $this->parameter->pageSize)); foreach ($sticky_posts as $sticky_post) { $this->push($sticky_post); } $this->setTotal($this->getTotal() - count($sticky_cids)); } ?>来源:https://deepsea.xin/archives/77.html Typecho主题后台设置选项框架 https://ovogk.com/archives/216/ 2025-07-22T23:49:00+08:00 Typecho-OptionsTTDF后台设置框架独立版支持文章字段,如果不需要直接删除fields.php即可下载GitHub: https://github.com/ShuShuicu/Typecho-Options快速上手在主题functions.php引入options.php即可快速调用设置选择框架进行开发functions.php:<?php if (!defined('__TYPECHO_ROOT_DIR__')) exit; // 引入设置框架 require_once 'options.php';开发示例主题后台设置项字段类型 描述Text 文本框Textarea 文本域Radio 单选框Select 下拉框Checkbox 多选框Html 自定义 HTML 标签setup.php$options = [ '基础设置' => [ 'title' => '基础设置', 'fields' => [ [ // 'Html' => '自定义HTML标签', 'type' => 'Html', 'content' => '<h3>感谢使用 TTDF 进行开发</h3>' ], [ // 'Text' => '文本框', 'type' => 'Text', 'name' => 'SubTitle', 'value' => null, 'label' => '副标题', 'description' => '这是一个文本框,用于设置网站副标题,如果为空则不显示。' ], [ // 'Textarea' => '文本域', 'type' => 'Textarea', 'name' => 'TTDF_Textarea', 'value' => null, 'label' => '文本域', 'description' => '用于输入多行文本' ] ] ], 'select-elements' => [ 'title' => '选择设置', 'fields' => [ [ // 'Radio' => '单选框', 'type' => 'Radio', 'name' => 'TTDF_Radio', 'value' => 'option1', 'label' => '单选框', 'description' => '用于选择一个选项', 'options' => [ 'option1' => '选项一', 'option2' => '选项二', 'option3' => '选项三' ] ], [ // 'Select' => '下拉框', 'type' => 'Select', 'name' => 'TTDF_Select', 'value' => 'option2', 'label' => '下拉框', 'description' => '用于从列表中选择', 'options' => [ 'option1' => '选项一', 'option2' => '选项二', 'option3' => '选项三' ] ], [ // 'Checkbox' => '多选框', 'type' => 'Checkbox', 'name' => 'TTDF_Checkbox', 'value' => ['option1', 'option3'], 'label' => '多选框', 'description' => '用于选择多个选项', 'options' => [ 'option1' => '选项一', 'option2' => '选项二', 'option3' => '选项三' ] ] ] ], 'TTDF-Options' => [ 'title' => '其他设置', 'fields' => [ [ 'type' => 'Select', 'name' => 'TTDF_RESTAPI_Switch', 'value' => 'false', 'label' => 'REST API', 'description' => 'TTDF框架内置的 REST API<br/>详细教程见 <a href="https://github.com/Typecho-Framework/Typecho-Theme-Development-Framework#rest-api" target="_blank">官方文档 REST API 部分</a>', 'options' => [ 'true' => '开启', 'false' => '关闭' ] ], ] ], 'HTML-Demo' => [ 'title' => 'HTML示例', // 定义HTML TAB栏 'html' => [ [ // 'Content' => '自定义输出HTML内容', 'content' => '<h2>欢迎使用TTDF框架</h2> <p>Typecho Theme Development Framework</p> <blockquote style="border-left: 4px solid #ccc; padding-left: 20px; margin: 20px 0;"> <p>一个 Typecho 主题开发框架,设计之初是写给自己用的。<br> <del>还算不上框架只能说让开发变得更简单些</del></p> </blockquote>' ], ] ], ]; return $options;文章字段项字段类型 描述Text 文本框Textarea 文本域Radio 单选框Select 下拉框Checkbox 多选框$fields = [ [ // Text 'type' => 'Text', 'name' => 'TTDF_Fields_Text', 'value' => null, // 默认值为 null 'label' => '文本框', 'description' => '用于输入单行文本', // 添加字段属性 'attributes' => [ 'style' => 'width: 100%;' ] ], [ // Textarea 'type' => 'Textarea', 'name' => 'TTDF_Fields_Textarea', 'value' => null, // 默认值为 null 'label' => '文本域', 'description' => '用于输入多行文本', // 添加字段属性 'attributes' => [ 'style' => 'width: 100%;height: 100px;' ] ], [ // Radio 'type' => 'Radio', 'name' => 'TTDF_Fields_Radio', 'value' => null, // 默认值为 null 'label' => '单选框', 'description' => '用于选择一个选项', 'options' => [ 'option1' => '选项一', 'option2' => '选项二', 'option3' => '选项三' ] ], [ // Select 'type' => 'Select', 'name' => 'TTDF_Fields_Select', 'value' => null, // 默认值为 null 'label' => '下拉框', 'description' => '用于从列表中选择', 'options' => [ 'option1' => '选项一', 'option2' => '选项二', 'option3' => '选项三' ] ], [ // Checkbox 'type' => 'Checkbox', 'name' => 'TTDF_Fields_Checkbox', 'value' => [], // 默认值为空数组 'label' => '多选框', 'description' => '用于选择多个选项', 'options' => [ 'option1' => '选项一', 'option2' => '选项二', 'option3' => '选项三' ] ] ]; return $fields; 电脑壁纸-动漫 https://ovogk.com/archives/204/ 2025-07-11T00:26:28+08:00 电脑壁纸-美女 https://ovogk.com/archives/203/ 2025-07-11T00:23:50+08:00