不用插件给wordpress文章生成二维码

调用二维码的API接口可以直接给文章生成二维码,不需要安装插件,很方便。

1、Google API接口

<img src="https://chart.googleapis.com/chart?cht=qr&chs=200x200&choe=UTF-8&chld=L|1&chl=<?php the_permalink(); ?>" width="200" height="200" alt="<?php the_title(); ?>" />

2、qrserver API接口

<img src="http://api.qrserver.com/v1/create-qr-code/?size=200x200&data=<?php the_permalink(); ?>" alt="<?php the_title(); ?>"/>

国内的话,Google API被屏蔽,qrserver速度很慢。

另外,wordpress的二维码插件,有的也是调用Google和qrserver的接口,有的是生成二维码图片存储在本地服务器,可以参考这篇文章:https://blog.brain1981.com/1362.html

常用的免费开源SVG icon图标库

收集整理了一些常用的免费的svg icon图标库,可以直接在自己网站上引用。

1、Font Awesome

网站:https://fontawesome.com/

应该是引用最多的图标库了吧,有免费的,也有收费的。

2、Google Material Icons

网站:http://google.github.io/material-design-icons/

Google官方出品。

3、iconfont

网站:https://www.iconfont.cn/collections/index

阿里出品。

4、flaticon

网站:https://www.flaticon.com/uicons

5、feather icons

地址:https://github.com/feathericons/feather

6、iconoir

地址:https://github.com/lucaburgio/iconoir

7、ionicons

网站:https://ionic.io/ionicons

注意ionicons的用法跟上面6个有点不同。

mysql数据库多线程LAST_INSERT_ID()

msql多线程的时候用LAST_INSERT_ID()比max(id)高效且不会被其他线程(connection)打断。

INSERT INTO wp_posts (post_title,post_content,post_author,post_name,post_date,post_excerpt,to_ping,pinged,post_content_filtered) VALUES ('[标签:标题]','[标签:内容]','1','[标签:slug]','[系统时间转化:yyyy-MM-dd HH:mm:ss]','','','','')
INSERT INTO wp_term_relationships (object_id,term_taxonomy_id) VALUES (LAST_INSERT_ID(),1)

但是LAST_INSERT_ID函数有几点必须注意,直接复制过来的:

  • If the most recent INSERT or UPDATE statement set more than one AUTO_INCREMENT value, the LAST_INSERT_ID function returns only the first AUTO_INCREMENT value.
  • The LAST_INSERT_ID function returns the last AUTO_INCREMENT value on a client-by-client basis, so it will only return the last AUTO_INCREMENT value for your client. The value can not be affected by other clients.
  • Executing the LAST_INSERT_ID function does not affect the value that LAST_INSERT_ID returns.

个人总结的几个注意事项:

1、如果一次insert插入多条value值,LAST_INSERT_ID()获取的是第一条value记录的自增ID;

2、如果是多条insert,插入同一个table表,LAST_INSERT_ID()获取的是最后一条insert记录的自增ID;

3、如果insert的表发生了变化,LAST_INSERT_ID()获取的自增ID也会变化,它返回的是最后一条insert记录的自增ID。

继续阅读

查看Linux服务器硬盘是固态硬盘(SSD)还是机械硬盘(HDD)

方法一,cat /sys/block/{fs_name}/queue/rotational

Linux 可以自动判定硬盘是否是 SSD,从 2.6.29 的内核版本之后,可以通过如下命令查看硬盘是不是 ssd:

cat /sys/block/{fs_name}/queue/rotational

其中,{fs_name} 是你的硬盘设备名称,例如 vda、vdb、sda 等等。

若上述命令返回 1 表示机械硬盘(hard disk),若返回 0,则表示固态硬盘(ssd)。

需要注意的是,如果设备是例如 RAID 这样的逻辑设备,上述命令可能不可用。

示例如下:

[[email protected] ~]$ cat /sys/block/vdb/queue/rotational
1
[[email protected] ~]$ grep ^ /sys/block/*/queue/rotational
/sys/block/vda/queue/rotational:1
/sys/block/vdb/queue/rotational:1

方法二,利用 lsblk 命令

使用 lsblk 命令进行判断,该命令属于 util-linux(一个 Linux 标准软件包)的一部分,参数 -d 表示显示设备名称,参数 -o 表示仅显示特定的列。

[[email protected] ~]$ lsblk -d -o name,rota
NAME ROTA
vda     1
vdb     1

其中 ROTA 表示 rotational device,1 代表是机械硬盘,0 则就是 ssd 了。

方法三,使用 fdisk 命令

使用 fdisk 命令,后面加 -l 选项表示查看磁盘详细信息,如果输出的详细信息中包含机械硬盘中有的 heads(磁头)、track(磁道)、cylinders(柱面)等概念,那表示是该磁盘是 HDD,否则很有可能是 SSD。

下面分别列出了 HDD 和 SSD 的示例:

Disk /dev/sda: 120.0 GB, 120034123776 bytes
255 heads, 63 sectors/track, 14593 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00074f7d
Disk /dev/nvme0n1: 238.5 GiB, 256060514304 bytes, 500118192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos

方法四,使用第三方工具 smartctl

smartctl 是管理和监控存储硬件工具 smartmontools 的两个程序工具之一,另一个是 smartd 程序工具,可以通过如下命令查看磁盘信息:

smartctl -a /dev/{fs_name}

示例如下:

[[email protected] ~]$ smartctl -a /dev/disk1s1

如果看到如下一行信息,表示是固态硬盘(SSD)。

......
Rotation Rate:    Solid State Device
......
继续阅读

wordpress开启多站点网络

1、打开wp-config.php配置文件,将以下代码插入到 /* That’s all, stop editing! Happy publishing. */ 前一行:

define('WP_ALLOW_MULTISITE', true);

2、刷新wordpress后台,在 工具 – 网络配置 中,配置多站点网络。

3、按照提示,将代码复制到wp-config.php文件中保存。

4、伪静态规则。如果选择了用二级目录作为多站点,用的宝塔面板,选择伪静态规则wp2,或者复制以下代码:

rewrite ^.*/files/(.*)$ /wp-includes/ms-files.php?file=$1 last;
if (!-e $request_filename){
	rewrite ^.+?(/wp-.*) $1 last;
	rewrite ^.+?(/.*\.php)$ $1 last;
	rewrite ^ /index.php last;
}

如果是选择二级域名为多站点,宝塔伪静态规则选择wordpress即可。

5、如果登录后台控制台,出现重定向太多的错误,无法登录,找到:

** 
@package WordPress
*/

在下方添加如下代码:

$_SERVER['HTTPS'] = 'on';
define('FORCE_SSL_LOGIN', true);
define('FORCE_SSL_ADMIN', true);

6、给网站添加hreflang多语言标签:

移除wordpress版本及相关服务代码,提高安全

前面有关于移除wordpress rss feed防采集:

移除wordpress版本及相关服务代码,可以提高安全,汇总!

文章来自于我爱水煮鱼的博客,原文链接在最后。

版本号

​WordPress 会在页面头部显示你的 WordPress 版本号:

<meta name="generator" content="WordPress 3.5.1" />

作为博主的你,当然知道自己所使用的 WordPress 版本了,但是使用的 WordPress 版本直接暴露在外面,反而是一个安全隐患,万一你的 WordPress 一时没有升级,而这个版本刚好有安全问题,然后又给坏人知道了,那就造成安全问题,所以最好不要暴露在页面:

remove_action('wp_head', 'wp_generator');

RSD

Really Simple Discovery(RSD)是XML格式的一种发布约定,用于使 WordPress 可以被客户端软件发现,这是一种将客户端软件所需的信息减少到三个众所周知的元素的方法:用户名,密码和主页URL,其他关键设置都在 RSD 文件中定义。它会在页面头部输出代码如下:

<link rel="EditURI" type="application/rsd+xml" title="RSD" href="http://example.com/xmlrpc.php?rsd" />

简单说 XML-RPC 客户端发现机制需要用到,一般建议在使用 XML-RPC 客户端时候开启即可,其他时候建议关闭,省的被人使用 XML-RPC 客户端来尝试登录。

remove_action('wp_head', 'rsd_link');

wlwmanifest

wlwmanifest 是用来说明支持 Windows Live Writer ,它会在页面头部输出代码如下:

<link rel="wlwmanifest" type="application/wlwmanifest+xml" href="http://example.com/wp-includes/wlwmanifest.xml" />

如果你没有使用 Windows Live Writer 来写文章,那就移除它吧:

remove_action('wp_head', 'wlwmanifest_link');

这个原本的意图是如果你的文章的固定链接很长,告诉用户可以通过 http://example.com/?p=13150 这个的短链接的方式快速访问。它会在文章详情页的页面头部输出代码如下:

<link rel='shortlink' href='http://example.com/?p=13150' />

但是这个可能暴露文章的 ID,而你不想让人知道的话,那就最好移除它:

remove_action('wp_head', 'wp_shortlink_wp_head', 10, 0);

REST

它会在文章详情页的页面头部输出代码如下:

<link rel="https://api.w.org/" href="https://blog.wpjam.com/wp-json/" />

这个代码是用来告诉 APP 开发者,当前站点的 REST API 的地址,这个口头告诉一下就行了,没有必要在代码中输出:

remove_action('wp_head', 'rest_output_link_wp_head', 10);

汇总

汇总一次,将上面所有代码都复制到主题的 functions.php 就能一次性移除了:

remove_action('wp_head', 'wp_generator');
remove_action('wp_head', 'rsd_link');
remove_action('wp_head', 'wlwmanifest_link');
remove_action('wp_head', 'wp_shortlink_wp_head', 10, 0);
remove_action('wp_head', 'rest_output_link_wp_head', 10);
继续阅读

多语言网站的hreflang标签

在网页头部head中添加以下代码:

<link rel="alternate" hreflang="zh-CN" href="https://www168itw.com/seo/hreflang/" />

需要注意的是,不同语言的页面,一定要双向互相指向对方,否则hreflang不起作用,Google会忽略掉。

所以你需要在网页的header中列出所有的语言版本及链接。

还可以指定网页的默认语言版本:

<link rel="alternate" href="https://example.com/" hreflang="x-default" />

关于简体中文和繁体中文,也可以用zh-Hanszh-Hant

结合上文wordpress输出文章别名的方法,可以给wordpress站点设置多语言。

Google关于hreflang多语言的详细用法:

https://developers.google.com/search/docs/advanced/crawling/localized-versions

https://www.w3schools.com/tags/ref_language_codes.asp

wordpress输出文章别名post_name

<?php global $post; $post_slug = $post->post_name; ?>

输出:

<?php echo $post_slug; ?>

或者直接用:

<?php global $post; $post_slug=$post->post_name; echo $post_slug; ?>

另外一种方法是:

<?php $post_slug = get_post_field( 'post_name', get_post() ); ?>

进一步,如果要输出自定义字段的值,可以用:

<?php echo get_post_meta(get_the_ID(), 'key1', true); ?>

延伸:

wordpress常用函数:https://codex.wordpress.org/Function_Reference

wordpress全局变量:https://codex.wordpress.org/Global_Variables

C#常用的正则表达式

基本符号

^ 表示匹配字符串的开始位置 (例外 用在中括号中[ ] 时,可以理解为取反,表示不匹配括号中字符串)
$ 表示匹配字符串的结束位置

*表示匹配 零次到多次

+表示匹配 一次到多次 (至少有一次)
? 表示匹配零次或一次
. 表示匹配单个字符
| 表示为或者,两项中取一项
( ) 小括号表示匹配括号中全部字符
[ ] 中括号表示匹配括号中一个字符 范围描述 如[0-9 a-z A-Z]
{ } 大括号用于限定匹配次数 如 {n}表示匹配n个字符 {n,}表示至少匹配n个字符 {n,m}表示至少n,最多m
\ 转义字符 如上基本符号匹配都需要转义字符 如 * 表示匹配*号
\w 表示英文字母和数字 \W 非字母和数字
\d 表示数字 \D 非数字

常用的正则表达式

匹配中文字符的正则表达式: [\u4e00-\u9fa5]

匹配双字节字符(包括汉字在内):[^\x00-\xff]

匹配空行的正则表达式:\n[\s| ]*\r

匹配HTML标记的正则表达式:/<(.)>.<\/\1>|<(.*) \/>/

匹配首尾空格的正则表达式:(^\s)|(\s$)

匹配IP地址的正则表达式:/(\d+).(\d+).(\d+).(\d+)/g //

匹配Email地址的正则表达式:\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*

匹配网址URL的正则表达式:http://(/[\w-]+.)+[\w-]+(/[\w- ./?%&=]*)?

sql语句:^(select|drop|delete|create|update|insert).*$

1、非负整数:^\d+$

2、正整数:^[0-9][1-9][0-9]$

3、非正整数:^((-\d+)|(0+))$

4、负整数:^-[0-9][1-9][0-9]$

5、整数:^-?\d+$

6、非负浮点数:^\d+(.\d+)?$

7、正浮点数:^((0-9)+.[0-9][1-9][0-9])|([0-9][1-9][0-9].[0-9]+)|([0-9][1-9][0-9]))$

8、非正浮点数:^((-\d+.\d+)?)|(0+(.0+)?))$

9、负浮点数:^(-((正浮点数正则式)))$

10、英文字符串:^[A-Za-z]+$

11、英文大写串:^[A-Z]+$

12、英文小写串:^[a-z]+$

13、英文字符数字串:^[A-Za-z0-9]+$

14、英数字加下划线串:^\w+$

15、E-mail地址:^[\w-]+(.[\w-]+)*@[\w-]+(.[\w-]+)+$

16、URL:^[a-zA-Z]+://(\w+(-\w+))(.(\w+(-\w+)))(\?\s)?$
或:^http:\/\/[A-Za-z0-9]+.[A-Za-z0-9]+[\/=\?%-&_~`@[]\’:+!]([^<>\”\”])$

17、邮政编码:^[1-9]\d{5}$

18、中文:^[\u0391-\uFFE5]+$

19、电话号码:^((\d2,3)|(\d{3}-))?(0\d2,3|0\d{2,3}-)?[1-9]\d{6,7}(-\d{1,4})?$

20、手机号码:^((\d2,3)|(\d{3}-))?13\d{9}$

21、双字节字符(包括汉字在内):^\x00-\xff

22、匹配首尾空格:(^\s)|(\s$)(像vbscript那样的trim函数)

23、匹配HTML标记:<(.)>.<\/\1>|<(.*) \/>

24、匹配空行:\n[\s| ]*\r

25、提取信息中的网络链接:(h|H)(r|R)(e|E)(f|F) *= *(‘|”)?(\w|\|\/|.)+(‘|”| *|>)?

26、提取信息中的邮件地址:\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*

27、提取信息中的图片链接:(s|S)(r|R)(c|C) *= *(‘|”)?(\w|\|\/|.)+(‘|”| *|>)?

28、提取信息中的IP地址:(\d+).(\d+).(\d+).(\d+)

29、提取信息中的中国手机号码:(86)013\d{9}

30、提取信息中的中国固定电话号码:(\d3,4|\d{3,4}-|\s)?\d{8}

31、提取信息中的中国电话号码(包括移动和固定电话):(\d3,4|\d{3,4}-|\s)?\d{7,14}

32、提取信息中的中国邮政编码:[1-9]{1}(\d+){5}

33、提取信息中的浮点数(即小数):(-?\d*).?\d+

34、提取信息中的任何数字 :(-?\d*)(.\d+)?

35、IP:(\d+).(\d+).(\d+).(\d+)

36、电话区号:/^0\d{2,3}$/

37、腾讯QQ号:^[1-9][1-9][0-9]$

38、帐号(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$

39、中文、英文、数字及下划线:^[\u4e00-\u9fa5_a-zA-Z0-9]+$