[WordPress] 標準外部請求辦不到時使用 cURL 的 Hack 方式

在 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 社群提出品牌名稱審查,導致外掛被下架。

[WordPress] FB2WP 外掛「被」關閉了!

然後重新上架時整個外掛「也順便」要過他們新的資安審查系統。

其中碰到 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');


Share:

作者: Chun

資訊愛好人士。主張「人人都該為了偷懶而進步」。期許自己成為斜槓到變進度條 100% 的年輕人。[//////////____30%_________]

參與討論

3 則留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *