首页
微语
统计
友链
留言
memos
圈子
图床
推荐
相册
网站监控
VPS监控
Search
1
实现typecho微信时光机功能的图文教程
50,117 阅读
2
为Typecho添加webp解析
43,971 阅读
3
Memos备忘录,记录瞬间想法
29,510 阅读
4
emlog数据成功迁移到typecho
28,714 阅读
5
Jasmine - 简约、美观的博客主题
28,472 阅读
手机达人
免费资源
电脑网络
娱乐休闲
网站建设
威言威语
Typecho
Emlog
WordPress
服务器
主题
插件
排行榜    
登录
/
注册
Search
标签搜索
wordpress
发布
插件
免费
教程
typecho
EMlog
PHP
代码
CSS
华为
图片
安装
代码修改
评论
手机
诺基亚
微信
文章
智能
Chen'mo
累计撰写
1,272
篇文章
累计收到
382
条评论
首页
栏目
手机达人
免费资源
电脑网络
娱乐休闲
网站建设
威言威语
Typecho
Emlog
WordPress
服务器
主题
插件
页面
微语
统计
友链
留言
memos
推荐
相册
网站监控
VPS监控
搜索到
4
篇与
的结果
2021-03-06
Typecho博客支持emoji表情设置
[Typecho博客支持emoji表情设置]介绍大家在typecho博客写文章时,很多人都喜欢使用emoji表情(比如??这些图标)但是typecho的数据库类型默认不支持emoji编码,因为Emoji是一种在Unicode位于u1F601-u1F64F区段的字符。这个显然超过了目前常用的UTF-8字符集的编码范围u0000-uFFFF。在MySQL中,UTF-8只支持最多3个字节,而emoji是4个字节。所以如果你不修改数据库的话,typecho是无法支持Emoji表情的。当然好消息是utf8mb4其实是完全兼容utf-8,修改后,不会影响现有数据及后期的数据。要注意的是utf8mb4编码在PHP5.5以后才支持,所以请确保你的PHP版本在5.5以上,typecho程序推荐PHP5.6版本。下面开始带大家一步步的设置。数据库编码修改进入PhpMyadmin,选择对应的数据库,选择操作------排序规则------选择utf8mb4_unicode_ci并执行。utf8mb4_unicode_ci数据库表编码修改[#]选择SQL-复制下面sql语句代码-点击右下角执行。注意数据库一定要和网站的数据库对应。alter table typecho_comments convert to character set utf8mb4 collate utf8mb4_unicode_ci; alter table typecho_contents convert to character set utf8mb4 collate utf8mb4_unicode_ci; alter table typecho_fields convert to character set utf8mb4 collate utf8mb4_unicode_ci; alter table typecho_metas convert to character set utf8mb4 collate utf8mb4_unicode_ci; alter table typecho_options convert to character set utf8mb4 collate utf8mb4_unicode_ci; alter table typecho_relationships convert to character set utf8mb4 collate utf8mb4_unicode_ci; alter table typecho_users convert to character set utf8mb4 collate utf8mb4_unicode_ci;`执行sql语句如果有别的表,比如友情链接插件,它就会创建一个 links 表,这里的话也是建议一起改了。另外,如果安装时改过前缀,也只需对以上语句做相应修改。配置网站最后在网站根目录config.inc.php配置文件中找到以下代码:'host' => localhost, 'user' => 'youruser', 'password' => 'yourpassword', 'charset' => 'utf8mb4', //将utf8修改为utf8mb4`
2021年03月06日
3,649 阅读
0 评论
0 点赞
2021-02-22
Typecho 主题点赞功能实现
有人问到点赞功能,这里抽取代码分享一下,因为去掉了部分敏感信息,可能需要调试一下。我的设计思路是使用自定义字段来存储点赞次数。和市面上的方案不一样,不过大同小异。增加接口首先要修改functions.php的themeInit函数,加入点赞接口function themeInit($archive) { if ($archive->is('single')) { if ($archive->request->isPost()) { if ($archive->request->is('themeAction=promo')) { promo($archive); } } } } 接着要加入点赞核心函数,下面的函数可以扩展/** * Post Action AJAX接口 * * @param Widget_Archive $widget * @return void * @date 2020-05-04 */ function promo($widget) { $user = $widget->widget('Widget_User'); $db = Typecho_Db::get(); $fields = unserialize($widget->fields); $allowOperates = array('get', 'set', 'inc', 'dec'); // 这里可以扩展操作,建议屏蔽get/set $allowFields = array('likes'); // 这里可以扩展修改字段 // 获取操作 $operate = $widget->request->get('operate'); $field = $widget->request->get('field'); $value = $widget->request->filter('int')->get('value'); $value = $value === null ? 100 : $value; // 100 起步 $result = array('cid' => $widget->cid); if ($operate === "get") { $result['operate'] = 'get'; if (array_key_exists($field, $fields)) { $result[$field] = $fields[$field]; } else { $result[$field] = -1; } $widget->response->throwJson(array('status' => 1, 'msg' => _t('已获取参数'), 'result' => json_encode($result))); } elseif ($operate === "set") { $result['operate'] = 'set'; if ($value > 0) { $widget->setField($field, 'str', $value, $widget->cid); } else { $db->query($db->delete('table.fields') ->where('cid = ? AND name = ?', $widget->cid, $field)); } $widget->response->throwJson(array('status' => 1, 'msg' => _t('已完成操作'), 'result' => json_encode($result))); } elseif ($operate === "inc") { $result['operate'] = 'inc'; $value = intval($fields[$field]) + 1; $widget->setField($field, 'str', $value, $widget->cid); $result[$field] = $value; $widget->response->throwJson(array('status' => 1, 'msg' => _t('已完成操作'), 'result' => json_encode($result))); } elseif ($operate === "dec") { $result['operate'] = 'dec'; $value = intval($fields[$field]) - 1; $result[$field] = $value; if ($value > 0) { $widget->setField($field, 'str', $value, $widget->cid); } else { $db->query($db->delete('table.fields') ->where('cid = ? AND name = ?', $widget->cid, $field)); } $widget->response->throwJson(array('status' => 1, 'msg' => _t('已完成操作'), 'result' => json_encode($result))); } } Post 请求参数说明operate:操作 field: 操作字段 value:操作值,inc/dec 操作用不到 前端方面这里我给出我的参考 js 代码,实际建议自己写一下,使用 jq 也不复杂。function likesCallback(count) { $("#likesPostCount").value(count); } $("#likesPost").click(function () { posturl = $(location).attr("href").split("?")[0] + "?themeAction=promo"; $.ajax({ url: posturl, type: "POST", data: { operate: "inc", field: "likes" }, dataType: "json", success: function (result) { if (1 == result.status) { result = JSON.parse(result.result) likes = undefined === result.likes ? -1 : result.likes; likesCallback(result.likes); } else { // 提醒错误消息 alert( undefined === result.msg ? '点赞失败' : result.msg ); } }, error: function (xhr, ajaxOptions, thrownError) { alert('点赞失败' + ajaxOptions); }, }); }); 输出因为使用自定义字段存储,所以输出和普通自定义字段一样<?php echo $this->fields->likes; ?>
2021年02月22日
6,222 阅读
0 评论
7 点赞
2021-02-22
Typecho 免插件统计浏览次数,输出热门文章
由于需要Join,不推荐数据量大的博客使用自定义字段存储浏览次数前提好几年前我在打造SimpX主题的时候撸了下面的浏览次数统计代码。/* * 获取浏览次数(改进版) */ function getViewsStr($widget, $format = "{views} 次浏览") { $fields = unserialize($widget->fields); if (array_key_exists('views', $fields)) $views = (!empty($fields['views'])) ? intval($fields['views']) : 0; else $views = 0; //增加浏览次数 if ($widget->is('single')) { $vieweds = Typecho_Cookie::get('contents_viewed'); if (empty($vieweds)) $vieweds = array(); else $vieweds = explode(',', $vieweds); if (!in_array($widget->cid, $vieweds)) { $views = $views + 1; $widget->setField('views', 'str', strval($views), $widget->cid); $vieweds[] = $widget->cid; $vieweds = implode(',', $vieweds); Typecho_Cookie::set("contents_viewed",$vieweds); } } return str_replace("{views}", $views, $format); } 需求这次在整poRebuild主题的时候发现原来的调用方式不太合适我这次的输出需求,改造成在themeInit函数里自动增加浏览次数,无论页面是否展示都能自动统计。当然了,还是利用自定义字段,不动数据库结构。同时我新弄的主题还需要热门文章输出的功能,一并把代码撸了。代码浏览次数查询先给出查询浏览次数的代码,为了方便拓展(比如输出点赞次数),自定义字段都是可变参数,同时支持控制直接输出或者返回。function views($widget, $format0 = "%d", $format1 = "%d", $formats = "%d", $return = false, $field = 'views') { $fields = unserialize($widget->fields); if (array_key_exists($field, $fields)) { $fieldValue = (!empty($fields[$field])) ? intval($fields[$field]) : 0; } else { $fieldValue = 0; } if ($fieldValue == 0) { $fieldValue = sprintf($format0, $fieldValue); } else if ($fieldValue == 1) { $fieldValue = sprintf($format1, $fieldValue); } else { $fieldValue = sprintf($formats, $fieldValue); } if ($return) { return $fieldValue; } else { echo $fieldValue; } } 在展示的地方调用<?php views($this); ?> 浏览次数统计/** * 增加浏览次数 * 使用方法: 在<code>themeInit</code>函数中添加代码 * <pre>if($archive->is('single') || $archive->is('page')){ viewsCounter($archive);}</pre> * * @param Widget_Archive $widget * @return boolean */ function viewsCounter($widget, $field = 'views') { if (!$widget instanceof Widget_Archive) { return false; } $fieldValue = views($widget, "%d", "%d", "%d", true, $field); $fieldRecords = Typecho_Cookie::get('__typecho_' . $field); if (empty($fieldRecords)) { $fieldRecords = array(); } else { $fieldRecords = explode(',', $fieldRecords); } if (!in_array($widget->cid, $fieldRecords)) { $fieldValue = $fieldValue + 1; $widget->setField($field, 'str', strval($fieldValue), $widget->cid); $fieldRecords[] = $widget->cid; $fieldRecords = implode(',', $fieldRecords); Typecho_Cookie::set('__typecho_' . $field, $fieldRecords); return true; } return false; } 调用方式,需要在主题themeInit函数中调用funciton themeInit() { if($archive->is('single') || $archive->is('page')){ viewsCounter($archive);} } 输出热门文章/** * 获取热门文章 * * @access public * @param int $pageSize 限制热门文章输出数量 * @param int $fieldName 排序关键自定义字段 * @since 1.0 * @return Widget_Archive */ function hotspots($pageSize = -1, $fieldName = "views") { //2020.04.22默认遵循默认 pageSize $pageSize = $pageSize === -1 ? Helper::options()->postsListSize : $pageSize; $db = Typecho_Db::get(); // 2020.04.19 修复排列顺序不正常 1 10 100 2 20 3 4 5 $tableFields = $db->getPrefix() . 'fields'; $tableContents = $db->getPrefix() . 'contents'; // 2020.04.27 修复 Pdo_MySQL 不能用 $castType = ($db->getAdapterName() === "MySQL" || $db->getAdapterName() === "Pdo_Mysql") ? "UNSIGNED" : "INT"; $sql = "SELECT *,CAST(${tableFields}.str_value as ${castType}) order1 FROM ${tableFields},${tableContents} WHERE ${tableFields}.cid = ${tableContents}.cid AND ${tableFields}.name = '${fieldName}' AND ${tableContents}.type = 'post' AND ${tableContents}.status = 'publish' AND ${tableContents}.created < " . time() . " ORDER BY order1 DESC LIMIT $pageSize"; $result = $db->fetchAll($sql); // 2020.08.11 修复没有浏览记录时空白 if (count($result) < $pageSize) { $select = $db->select()->from('table.contents')->where('table.contents.status = ? AND table.contents.created < ? AND table.contents.type = ?', 'publish', time(), 'post'); foreach ($result as $row) { $select = $select->where('table.contents.cid <> ?', $row['cid']); } $select->order('table.contents.created', Typecho_Db::SORT_DESC)->limit($pageSize - count($result)); $_result = $db->fetchAll($select); foreach ($_result as $row) { $result[] = $row; } } // 2020.04.27 修复作者页报错 $archive = Typecho_Widget::widget('Widget_Archive@hotposts-' . $pageSize, 'type=index'); // 2020.07.04 临时修复没有views字段引起的死循环 if (count($result)) { $archive->row = []; $archive->stack = []; $archive->length = 0; foreach ($result as $hotpost) { $archive->push($hotpost); } $archive->setTotal(count($result)); } return $archive; } 直接调用和主题调用文章列表是一样的<?php $widget = hotspots(); ?> <?php while($widget->next()): ?> <?php $widget->title(); ?> <?php endwhile;?> 最后当然,别忘了你的主题或者插件新增了 views 字段,删掉ALTER TABLE `typecho_contents` DROP `views`;
2021年02月22日
3,777 阅读
0 评论
3 点赞
2019-09-08
WordPress免插件实现代码高亮显示
Prismjs就可以让我们的wordpress不用装插件就完成代码高亮的功能,Prismjs是一个专门做代码高亮的开源项目,他的代码特点是精约、轻盈、快捷、高效、快速,而且支持127种程序语言的代码高亮。最主要的是Prismjs只需一个JS文件和一个CSS文件。使用Prismjs来完成代码高亮的时分,只需下载该文件放到网站,然后将这两个文件引进到页面上就可以了。下面介绍WordPress实现代码高亮的办法1、首先下载prism压缩包上传至主题根目录(底部下载);2、然后复制以下代码添加到主题function.php文件下方即可。//Wordpress免插件实现代码高亮 //Prism.js开始 function add_prism() { wp_register_style( 'prismCSS', get_stylesheet_directory_uri() . '/prism/prism.css' //自定义路径 ); wp_register_script( 'prismJS', get_stylesheet_directory_uri() . '/prism/prism.js' //自定义路径 ); wp_enqueue_style('prismCSS'); wp_enqueue_script('prismJS'); } add_action('wp_enqueue_scripts', 'add_prism'); //Prism.js结束 //编辑器添加快捷键 function appthemes_add_quicktags() { ?> <script type="text/javascript"> QTags.addButton( 'codeHighlight', '代码高亮', '\n【pre class="line-numbers"】【code class="language-markup"】\n HTML代码\n【/code】【/pre】\n' ); QTags.addButton( 'php', 'php', '\n【pre class="line-numbers"】【code class="language-php"】\n PHP代码\n【/code】【/pre】\n' ); QTags.addButton( 'python', 'Python', '\n【pre class="line-numbers"】【code class="language-python"】\n Python代码\n【/code】【/pre】\n' );//修改此段【】为<> </script> <?php } add_action('admin_print_footer_scripts', 'appthemes_add_quicktags' ); //添加快捷键结束 //Pre标签内的HTML不转义 add_filter( 'the_content', 'pre_content_filter', 0 ); function pre_content_filter( $content ) { return preg_replace_callback( '|【pre.*】【code.*】(.*)【/code】【/pre】|isU' , 'convert_pre_entities', $content ); }//修改此段【】为<> function convert_pre_entities( $matches ) { return str_replace( $matches[1], htmlentities( $matches[1] ), $matches[0] ); }prism代码高亮.zip
2019年09月08日
11,186 阅读
0 评论
0 点赞