微信公衆號自動回覆圖文消息

寫在前面
訂閱號收到過一些查詢消息,好比vue、react,無奈一直沒有心情去搞關鍵字搜索,就丟一邊去了php

修復博客首頁樣式問題時恰巧看到了以前的博文:微信公衆平臺圖文消息自動生成,裏面有提到WordPress插件,就順勢給訂閱號添上了自動回覆功能css

喏~長這樣子:vue

微信公衆號自動回覆圖文消息

P.S.樣式問題是說在firefox下,容器的white-space: no-wrap會致使float-right子元素換行,猜想是firefox不合規範,具體見Demoreact

P.S.另外,firefox57確實比以前版本快多了,之前總感受在內存裏被Chrome先打了一頓同樣git

一.插件選擇
以前的博文裏提到了2款插件:github

WordPress插件wechat_subscribersajax

特點:自動回覆最新文章、隨機文章、搜索結果等,永久免費redux

地址:https://github.com/Soopro/wechat_subscribers服務器

WordPress插件Wechat-Manager微信

特點:關鍵詞自動回覆最新文章、一週/月/年內最多評論文章、文章搜索結果

地址:https://github.com/9IPHP/Wechat-Manager

時隔1年多又跑去看,發現好像都還在維護,試用以後選擇了wechat_subscribers,主要優點:

commit看起來更專業,更用心,例如rename method.,rename class.,clean comment.

有長長的changelog,感受靠譜

token驗證經過(Wechat-Manager的token始終沒法經過驗證…因此,其實是沒得選)

缺點:

文檔太差,readme沒有詳細的安裝步驟,且格式極亂

還好接微信公衆平臺只要求一個token,摸索着用上了,效果比較滿意

二.安裝步驟

1.下載插件源碼
https://github.com/ayqy/wechat_subscribers

用默認的develop分支便可,下載並解壓

P.S.WordPress 4.3.13下親測可用,其它版本應該也沒問題,由於插件沒什麼依賴,僅用到了不多幾個WordPress API(如get_posts、get_results)

2.安裝並啓用
安裝:把解壓獲得的文件夾丟到ftp的wordpress/wp-content/plugins目錄下,就算安裝完了

啓用:進入WordPress後臺,從左側菜單進入插件,找到「微信訂閱號管理」,啓用

而後須要經過token接入微信公衆平臺

3.配置token

操做步驟:

在後臺左側菜單找到「微信訂閱號管理」,進入「插件設置」

填寫token,保存更改,會獲得一個URL

進入微信公衆平臺後臺,左側「開發/基本配置 -> 服務器配置/修改配置」填寫「URL」和「Token」(用上一步獲得的URL和本身填的Token),隨機生成EncodingAESKey,選擇「明文模式」,提交

(提交成功後會返回上一頁)啓用服務器配置,面板狀態會變成「服務器配置(已啓用)」

到這裏token就配置好了(雙方已經按照既定「協議」創建了信任關係)

4.添加自動回覆規則
到試玩階段了,進入WordPress後臺,左側「微信訂閱號管理/自定義回覆 -> 添加新回覆」

插件提供了3種觸發機制(消息匹配機制):

普通:關鍵字模糊匹配

默認:default case,其它的規則都不匹配時就走這個

訂閱:新增關注時觸發

好比添一條測試規則:

回覆標題   test
關鍵字     測試,test,t
觸發       普通
發佈       勾選
類型       純文本
內容       hoho

保存並退出,微信進入訂閱號發送「測試或test或t」,會當即收到回覆「hoho」

回覆的消息格式支持:

純文本

圖文消息:相似於微信公衆平臺的圖文消息,給配圖和文章連接

最近消息:最新的幾篇文章

隨機消息:隨機選取幾篇文章

搜索關鍵字:站內搜索結果

最有用的應該是搜索關鍵字,能把用戶想要的博文列表丟過去,固然基礎功能也不錯

三.優化搜索結果
試玩發現回覆結果與查詢關鍵字的相關度不大,好比:

關鍵字 redux
結果
    MobX
    react-redux源碼解讀
    dva

插件默認走WordPress原生API get_posts,按發佈日期排序,因此獲得的結果不太科學,MobX和dva僅僅在內容提到了一點redux而已,也給算進來了

沒錯,咱們須要提升搜索結果的相關度,最直接的想法就是加權重,再按權重綜合排序,好比:

匹配項    權重
標題      3
分類      1
tag       1
內容      0.5
評論      0.3

都匹配的文章列表計算權重,再降序排列,就是我想要的結果,對應PHP代碼以下:

// from interface.php/getSearchPosts
// ID, post_content, post_excerpt, post_title
// extra: post_type, post_modified
$posts = $wpdb->get_results($wpdb -> prepare("select ID,post_content,post_excerpt,post_title,post_type,post_modified from db_wp_posts where post_status = 'publish' order by ((CASE WHEN post_title LIKE '%{$keyword}%' THEN 2 ELSE 0 END) + (CASE WHEN post_content LIKE '%{$keyword}%' THEN 1 ELSE 0 END)) DESC, post_modified DESC, ID ASC limit $re_count"));

從db_wp_posts表中已發佈的文章中找出標題和內容與關鍵字匹配的,並加權(標題權重2,內容權重1),再降序排列,取前$re_count個查詢結果

注意,這裏用到了SQL中的簡單case函數,很靈活的小技巧

四.源碼
Github地址:https://github.com/ayqy/wechat_subscribers

結構

wechat_subscribers/
  css/
  img/
  js/
  language/   # 多語言支持,WordPress插件慣用的pm,po文件
  __wechatsucks__.php   # 黑科技,token驗證不經過時能夠試試
  _edit.php   # 和下面3個都是後臺頁面及配置表單
  _general.php
  _history.php
  _settings.php
  ajax_request_handle.php   # 配置表單須要的博文列表,現查
  class-wpwsl-general.php   # 註冊新增規則頁
  class-wpwsl-history.php   # 消息記錄頁
  class-wpwsl-history-table.php # 註冊消息記錄頁
  class-wpwsl-list-table.php    # 博文表格交互,排序/分頁
  class-wpwsl-settings.php  # 註冊到左側菜單
  content.php   # 插件首頁,都是廢話
  index.php     # 沒用
  interface.php # **核心部分** 站內搜索,收發消息
  posttype_wpwsl_template.php   # 後臺配置數據格式
  wpwsl_core.php # 插件入口,註冊

todo
fork過來是想作幾件事:

重寫readme(原版太變態了,看了不想用) 100%

搜索結果按相關度排序(默認按日期排序) 100%

擴展功能 0%

關鍵字支持類型常量(好比number)

支持命令(好比留言,topN)

趣味性功能(好比語音查詢)

參考資料
WordPress get_posts by title like

HOW TO IMPROVE INTERNAL SEARCH IN WORDPRESS:WordPress搜索插件

微信公衆平臺技術文檔

相關文章
相關標籤/搜索