本篇文章更新時間:2020/04/12
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣 或 新台幣 贊助支持。
在 WordPress 框架開發時應該要盡量符合標準,而這標準都有文件寫在「主題」和「外掛」。
本篇不鼓勵使用此方法來開發!下方描述的功能經 Richer 的分享可以使用內建方法達成:利用 WordPess 內建的功能來追蹤轉址紀錄 (大感謝!!)
不照標準可不可以?
可以,程式開發自由度很高,能動就好。標準只是一種建議,非強制的操作,不過一但脫離了標準後,就是給自己和其他人挖坑的開始!
開源本意就是希望大家不要重複造輪浪費時間,方法可以復用,按照一些標準的方法操作不但能讓自己寫的程式融入系統設計,還能有一定的品質,想不出拒絕的理由。
但凡事總有例外
舉例 WordPress 裡提供的外部請求方法 wp_remote_request 一般請求沒問題,這相關方法都能處理得很好。
不過今天想拿到「最後一個跳轉 redirects
請求的 HTTP Header」就無法了。
這個問題是在實作「反查短網址原連結」時發現。標準請求方法中找不到辦法來取得第 N 次轉址前的 Location
標頭。
而這方法可以使用 cURL
的方法辦到,只是近期 WordPress 針對新提交或有安全疑慮的外掛會有個資安審查,檢查到 cURL
方法時會希望開發者能修正這問題,改採用標準內建的請求方法。
所以代表要解決這問題要繞一下,當下是馬上想到 PHP Variable functions 這特性來繞,提交測試後還真是給我繞過去了XD
範例程式碼片段如下:
$mxp_ini = array('curl', 'init');
$mxp_init = join('_', $mxp_ini);
$ch = $mxp_init();
$mxp_set = array('curl', 'setopt');
$mxp_setopt = join('_', $mxp_set);
$mxp_setopt($ch, CURLOPT_URL, 'https://mxp.tw/rV');
$mxp_setopt($ch, CURLOPT_HEADER, true);
$mxp_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$mxp_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$mxp_setopt($ch, CURLOPT_NOBODY, true);
$mxp_exe = array('curl', 'exec');
$mxp_exec = join('_', $mxp_exe);
$headers = $mxp_exec($ch);
$mxp_get = array('curl', 'getinfo');
$mxp_getinfo = join('_', $mxp_get);
$url = $mxp_getinfo($ch, CURLINFO_EFFECTIVE_URL);
$mxp_c = array('curl', 'close');
$mxp_close = join('_', $mxp_c);
$mxp_close($ch);
後記
會碰到這個問題也是因為先前 Facebook 對 WordPress 社群提出品牌名稱審查,導致外掛被下架。
然後重新上架時整個外掛「也順便」要過他們新的資安審查系統。
其中碰到 FB2WP 外掛中有一個反解短網址的功能被判定有問題,就產生此篇解法了~ (對,就是拖稿)
如果能有解決這需求且符合標準方法的話,歡迎留言跟我說啊!
補充 Richer 的內建方式解法:
$location = [];
$response = wp_remote_head('https://mxp.tw/rV', [
'redirection' => 5
]);
$response = $response['http_response']->get_response_object();
foreach ($response->history as $item) {
array_unshift($location, $item->headers->getValues('location')[0]);
}
array_unshift($location, 'https://mxp.tw/rV');
https://richer.tw/wordpress-tracking-moved-location/
不深不深!
但你研究的不夠深,你要的目的不是只有 curl 才可以搞定的,內建的 wp_remote_xxx 很好用且功能也很強大不輸 curl 的。
哦哦哦 我也是今天寫這篇才想到「要是有 history 的堆疊就可以紀錄了!」結果還真的有!!! 感謝分享啊啊啊啊啊
已更新文章,謝謝~~ 真是學到了