这几天大雨,发现外墙的下水管道堵住了,雨水从漏斗里涌出来顺着墙面下泄,今天趁着雨停我试图自己动手疏通一下,找了根空心的蚊帐杆(薄钢管)往下试探,大概在漏斗两米多的位置找到了堵塞点,堵的严严实实一滴水都不能漏,实际情况显然比我想象的严重,堵塞物异常坚硬,无法攻不破。这些堵塞物类似山洞里的钟乳石,来源一方面应该是水泥冲刷出的钙化物,另一个重要来源应该是我之前养花搞过的几袋火山石,经雨水冲刷流失进入下水管道,时间长了沉积下来变成了坚硬的石头。

我想过购买盐酸来腐蚀,考虑到会有一些副作用,不安全也不一定能成功,最后放弃。下午在网上搜索疏通下水管的视频,看到有使用电钻驱动类似弹簧的带钻头的软管一类的装置以此达到破碎疏通的作用,这类软管淘宝上有卖,价格是按米计算的,不贵,我手里是有一个电钻的,后来考虑要不要买个软管自己动手,再三考虑又放弃了,觉得不一定能成功。

晚饭前我拨打了下水道疏通小广告上的电话,对方问了情况非常肯定地说能通,我问价格开价200,我表示价格贵要考虑下,对方显然是不想错过这单,说先过来看好弄就收个百来十块钱,不好弄就200,现在就来。他很快就到了,带了一台220V的电机,还有一卷细细的软管,试了一下,无济于事,说不好弄得上粗的软管,要收200块,我感觉这是他的惯用操作,很快他搬过来一盘粗软管,这软管比网上卖的那种要粗很多,装到那台电机上,它开始疯狂下钻,下水管道被它打的哒哒响,大约半分钟吧,果然通了,一瞬间心里的忧虑被化解了,我想我大概感受到结石患者的一部分痛苦了。

大概就是这样,倘若我选择买那个软管自己动手,有可能花上一些时间也能搞通,前提是得多花时间。另一方面这类服务由于不常见也不常用得到,所以价格一点都不透明,好一些的办法是多找几家对比,或者一开始就谈好价,就这个钱你看要不要干,不干我再找别人,以免他坐地起价。

最近带家人去扬州,本想领家人们尝尝地道的扬州炒饭,结果发现之前常去的那家扬州炒饭不在了,打听得知早在疫情刚结束就关闭了。这家店原本开在广陵区政府边上,斜对着石塔寺的那棵大银杏树。老板是扬州本地人,由于老板信佛,佛教文化是戒酒戒肉的,他家的饭食里是没有荤菜的,因此,扬州当地的朋友说他家的扬州炒饭严格来说不是正宗的。对酒也不例外,他家不卖酒,并且不允许客人在店内饮酒,店里会提供那种介绍素食做法的食谱小册子供食客免费取阅,你要是喜欢也可以带走。即便如此,在我心中他仍是一家有特色的扬州炒饭,可惜啊。

意思就是利用 iOS 的快捷指令发日志,不用装 WordPress APP,并且还能实现一些有意思的功能。原理是利用 iOS 的快捷指令调用 WordPress 的 REST API 日志接口。

只需要动手做两个一次性的配置即可

第一步,创建用于验证的应用程序密码

  1. 登录 WordPress 后台,在【用户】-【个人资料】页面找到【应用程序密码】,在【新的应用程序密码名称】下方的文本框里随便输入一个标记名称,点下方的【添加新的应用程序密码】按钮,此时,WordPress 会为刚输入的名称创建一个密码,这个密码是接下来用来验证 REST-API 接口的;
  2. 把刚刚创建的密码记下来,去掉空格,在密码前面加上当前登录的 WordPress 用户名以冒号隔开,比如我登录 WordPress 后台的用户名是root,刚刚创建的应用程序密码是gttc Pvt4 OTD1 8HiE Q3x0 w9pv,处理后就是root:gttcPvt4OTD18HiEQ3x0w9pv
  3. 将上一步得到的这串文本进行 Base64 编码,搜一下【base64在线编码】转一下。拿到转换后的文本串,在最前面加上Basic中间加个空格(得到类似这样的文本串Basic cm9vdDpndHRjUHZ0NE9URDE4SGlFUTN4MHc5cHY=),至此,第一步的准备工作已经完成。

第二步,配置快捷指令的接口地址和验证信息

  1. 点后方链接安装本人分享的快捷指令:https://www.icloud.com/shortcuts/2779823e2c724396ad4dd9dfbf43e24e
  2. 点快捷指令右上角的三个点,进入编辑状态,往下滑找到里面有个url键的【词典】块,将url后面的 url 地址改成你自己的,就是你的域名加上/?rest_route=/wp/v2/posts,比如我的就是
    https://域名.com/?rest_route=/wp/v2/posts
  3. 词典下面那个块是【网络】,展开,【头部】下面有个Authorization的键,后面的值用第一步准备好的那串 Base64 文本串替换掉,点右上角的【完成】,大功告成。

接下来,就可以点刚刚的快捷指令按提示发日志了,但是慢着,看下下面的注意事项。

注意
1、这个快捷指令只能算是玩玩,不可过度依赖,受网络等不可控因素影响,若发布失败将无法保留草稿记录;
2、用这个快捷指令发日志,需要开定位服务,这个快捷指令会利用定位通过 iOS 的天气服务获取天气、GPS、所在城市等信息,记录在日志的自定义字段里;
3、REST API 日志发布接口对自定义字段的处理策略是先注册再使用,只有已注册的自字段是才会被写入到日志的字段值字段里的,下方的代码,正是用来注册上方快捷指令里的那些自定义字段的,放到主题文件的 function.php 即可。

/**
 * Register meta keys for posts
 * rest api posts 接口只能在 meta 中使用这里注册的自定义字段
 */
function register_brave_post_meta() {
	// 这些是需要注册的自定义字段
	$brave_post_meta = array('geo_latitude', 'geo_longitude', 'geo_city', 'geo_public', 'wx_weather', 'wx_temp', 'post_device_name', 'post_device_ver');
	$arg = array(
					'single'       => true,
					'type'         => 'string',
					'default'      => '',
					'show_in_rest' => true,
				);
	array_walk($brave_post_meta, function ($val, $key, $arg) {register_meta('post', $val, $arg);}, $arg);
}

add_action('init', 'register_brave_post_meta');

在 rest api 出现之前,想暴露一个接口需要先使用 wp_ajax_nopriv_wp_ajax_ 这两个钩子定义接口,再通过 admin-ajax.php 调用之(调用形式固定为 http://127.0.0.1/wp-admin/admin-ajax.php?action=),有了 rest api 就不用受此限制了,可玩性也大大提高了。

使用 rest api 只需要定义自己的路由和处理函数,就可以通过自定义链接来访问自己的接口了。

注册路由

在主题文件的 function.php 文件中加入下方的钩子,以分别定义 test 和 test2 两个路由

register_rest_route(
		'/v1', // 命名空间, 注意: wp 这两个字符为系统保留使用, 不建议在这里使用
		'/test', // 路由基础路径
		array(
			'methods'  => 'GET,POST', // HTTP METHOD, 支持逗号分割的字符串, 或字符串数组, 如: 'GET,POST' 或 array('POST', 'PUT');
            'callback' => 'func_demo1', // 处理路由请求的最终处理函数
			'permission_callback' => '__return_true', // 这是一个回调函数, 若对外公开需要返回 true; 否则, 返回 false. 可以通过此回调函数来判断处理用户权限. for security
		),
	);
	register_rest_route(
		'/v1',
		'/test2',
		array(
			'methods'  => 'POST',
            'callback' => 'func_demo2',
			'permission_callback' => '__return_true',
		),
	);

add_action('rest_api_init', 'register_brave_router');

添加处理函数

只有路由还不行,还要有对应的路由处理函数,下面在主题文件的 function.php 文件中分别添加 test 和 test2 的路由处理函数。

// test 的处理函数
function func_demo1 () {
	return array('key' => 'hello');
}

// test2 的处理函数
function func_demo2 ($request) {
	$data = wp_unslash($request->get_json_params()); // 取出来接口传入的参数
	return $data; // 返回接口传入的参数
}

访问自定义的接口

有两种方式访问刚刚添加的接口,一种是默认形式链接,一种是固定连接,分别如下

http://127.0.0.1/?rest_route=/v1/test
http://127.0.0.1/wp-json/v1/test

如果使用后者将得到下图这样的响应结果:

自定义前缀

如果不想要 wp-json 这样的前缀,wp 也提供了自定义的钩子,下方的钩子(同样,需要添加到主题文件的 function.php 文件中)将把 wp-json 改为 api。
注意:更改这里的前缀需要到【设置】-【固定链接】, 点一下保存【更改按钮】, 以刷新路由重定向规则使之生效

function rename_brave_rest_url_prefix() {
	return 'api';
}

add_filter('rest_url_prefix', 'rename_brave_rest_url_prefix');

不小心咬破了口腔,最近几天用了这药我终于理解影视剧里那些任凭敌人严刑拷打拒不屈服,往往敌人抓上一小撮盐往伤口上一撒便失节丧气的人了。
药瓶