問題描述

我試圖在 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 核心中移動檔案。

我的第一個刺就是新增自定義重寫規則。但是,這有兩個問題。

  1. 端點始終具有尾部斜槓。成為 http://mysite.com/my-api.php/
  2. 我的重寫規則才被部分應用。它不會重定向到 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' );

最好的祝福,

第三種解決方案

有什麼理由不這樣做嗎?

 http://mysite.com/?my-api=1

然後只需將你的外掛掛接到’init’ 並檢查該變數。如果它存在,做你的外掛需要做的和死 ()

第四種方案

我可能不會完全理解你的問題,但是一個簡單的短碼可以解決你的問題嗎?

腳步:

  1. 讓客戶建立一個頁面,即 http://mysite.com/my-api
  2. 讓客戶端在該頁面中新增一個短碼,即 [my-api-shortcode]

新頁面充當 API 終端,您的短程式碼將請求傳送到 http://mysite.com/wp-content/plugins/my-plugin/my-api.php 中的外掛程式碼

(當然這意味著 my-api.php 會定義短碼)

您可以透過外掛自動執行步驟 1 和 2 。

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。