問題描述
我試圖在 WordPress 中建立一個自定義 API 端點,我需要將請求重定向到 WordPress 根目錄中的一個虛擬頁面到我的 plug-in 附帶的實際頁面。所以基本上,所有對一頁的請求實際上被路由到另一個頁面。
示例:http://mysite.com/my-api.php => http://mysite.com/wp-content/plugins/my-plugin/my-api.php
要點是使 API 端點的 URL 儘可能短 (類似於 http://mysite.com/xmlrpc.php,而是使用 plug-in 傳送實際的 API 端點檔案,而不需要使用者在其安裝和/或 hack 核心中移動檔案。
我的第一個刺就是新增自定義重寫規則。但是,這有兩個問題。
- 端點始終具有尾部斜槓。成為
http://mysite.com/my-api.php/ - 我的重寫規則才被部分應用。它不會重定向到
wp-content/plugins...,它將重定向到index.php&wp-content/plugins...。這導致 WordPress 顯示頁面未找到錯誤或僅預設到主頁。
想法?建議?
最佳解決方案
WordPress 中有兩種型別的重寫規則:內部規則 (儲存在資料庫中並由 WP::parse_request()解析) 和外部規則 (儲存在.htaccess 中並由 Apache 解析) 。您可以選擇任何一種方式,具體取決於您在被叫檔案中需要多少 WordPress 。
外部規則:
外部規則是最簡單的設定和跟蹤。它將在您的外掛目錄中執行 my-api.php,而無需從 WordPress 載入任何內容。
add_action( 'init', 'wpse9870_init_external' );
function wpse9870_init_external()
{
global $wp_rewrite;
$plugin_url = plugins_url( 'my-api.php', __FILE__ );
$plugin_url = substr( $plugin_url, strlen( home_url() ) + 1 );
// The pattern is prefixed with '^'
// The substitution is prefixed with the "home root", at least a '/'
// This is equivalent to appending it to `non_wp_rules`
$wp_rewrite->add_external_rule( 'my-api.php$', $plugin_url );
}
內部規則:
內部規則需要更多的工作:首先我們新增一個新增查詢 vars 的重寫規則,然後我們使這個查詢 var public,然後我們需要檢查這個查詢 var 是否存在將控制元件傳遞給我們的外掛檔案。當我們這樣做時,通常的 WordPress 初始化將會發生 (我們在正常的後期查詢之前就斷開了) 。
add_action( 'init', 'wpse9870_init_internal' );
function wpse9870_init_internal()
{
add_rewrite_rule( 'my-api.php$', 'index.php?wpse9870_api=1', 'top' );
}
add_filter( 'query_vars', 'wpse9870_query_vars' );
function wpse9870_query_vars( $query_vars )
{
$query_vars[] = 'wpse9870_api';
return $query_vars;
}
add_action( 'parse_request', 'wpse9870_parse_request' );
function wpse9870_parse_request( &$wp )
{
if ( array_key_exists( 'wpse9870_api', $wp->query_vars ) ) {
include 'my-api.php';
exit();
}
return;
}
次佳解決方案
這對我有用我從來沒有觸控過重寫 API,但總是推動自己在新的方向。以下工作在我的測試伺服器 3.0 位於 localhost 的子資料夾中。如果 WordPress 安裝在網頁中,我不會看到任何問題。
只需將該程式碼放在外掛中,並直接在 plugin 資料夾中上傳名為”taco-kittens.php” 的檔案。您將需要為您的永久連結寫一個硬衝洗。我認為他們說最好的時間是外掛啟用。
function taco_kitten_rewrite() {
$url = str_replace( trailingslashit( site_url() ), '', plugins_url( '/taco-kittens.php', __FILE__ ) );
add_rewrite_rule( 'taco-kittens.php$', $url, 'top' );
}
add_action( 'wp_loaded', 'taco_kitten_rewrite' );
最好的祝福,
第三種解決方案
有什麼理由不這樣做嗎?
然後只需將你的外掛掛接到’init’ 並檢查該變數。如果它存在,做你的外掛需要做的和死 ()
第四種方案
我可能不會完全理解你的問題,但是一個簡單的短碼可以解決你的問題嗎?
腳步:
- 讓客戶建立一個頁面,即 http://mysite.com/my-api
- 讓客戶端在該頁面中新增一個短碼,即 [my-api-shortcode]
新頁面充當 API 終端,您的短程式碼將請求傳送到 http://mysite.com/wp-content/plugins/my-plugin/my-api.php 中的外掛程式碼
(當然這意味著 my-api.php 會定義短碼)
您可以透過外掛自動執行步驟 1 和 2 。
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。