問題描述

我喜歡 admin-ajax.php 。但是我討厭必須本地化才能將前端指令碼指向它,我希望有一個等效的 easy-to-find 檔案用於主題。 (它也只是打擾我看到前端請求透過”/wp-admin/” 。沒有實際的原因,只是看起來醜陋的 IMO 。)

所以我簡單地將 admin-ajax.php 複製到”/ajax.php” 的根目錄,調整包含路徑並刪除了 WP_ADMIN 常量定義。似乎像 gangbusters 一樣工作 (我現在可以直接將所有我的前端 AJAX 請求引導到/ajax.php!我仍然可以在我的外掛中使用正常的 wp_ajax 鉤子!) 。

但這是安全嗎?什麼可能會出錯?由於這不是核心,我認為有一個很好的理由為什麼不這樣做。但是,透過程式碼檢視,我看不到任何即時的問題。

你很聰明 – 告訴我這種方法是否瘋狂。或者如果有一個更簡單的方法,我忽略。

最佳解決方案

你可以使用一個 RewriteRule 到你的.htaccess 以上的常規永久連結重寫規則:

RewriteRule ^ajax$ /wp-admin/admin-ajax.php [L]

現在將您的 AJAX 請求傳送到 example.com/ajax,並且在升級後不會錯過該檔案的核心更改。

次佳解決方案

第一:標準化。如果您打算使用社群外掛,那麼他們可能不會關心檔案根目錄中的/ajax.php 檔案。所以他們不會使用它。

如果你要自己滾動一切,這不是一個問題。

二:核心更新怎麼辦?你會監視和更改你的 ajax 檔案嗎?

第三:儘管 admin-ajax.php 駐留在 wp-admin 中,但它沒有載入任何管理區域的東西 (例如列表表等) 。也不會檢查使用者身份或暴露對 non-logged 敏感的內容。就像一個 front-end 檔案,換句話說。完全不用擔心。

第四:與第一個問題相關,一些外掛將在盲目載入 ajax 相關功能之前進行檢查。下面是一個例子。您修改的 ajax.php 可能不會導致載入。

<?php
if (is_admin() && defined('DOING_AJAX') && DOING_AJAX) {
    //  load ajax stuff
}

最後:你所抱怨的是,使用本地化獲取 Ajax URL 是件好事。為什麼?因為您的 JS 檔案不知道任何伺服器端的東西。你會努力一個 URL,如果/當網站移動會破壞?似乎是一個壞的選擇。

如果你真的不想本地化使用 Ajax 的每個指令碼,那麼很簡單的掛鉤到 wp_head,並且吐出管理員 ajax 的 URL 。問題解決了 (順便說一下,這正是管理區域的做法) 。

<?php
add_action('wp_head', 'wpse83650_lazy_ajax', 0, 0);
function wpse83650_lazy_ajax()
{
    ?>
    <script type="text/javascript">
    /* <![CDATA[ */
    var ajax_url = "<?php echo esc_js(admin_url('admin-ajax.php')); ?>";
    /* ]]> */
    </script>
    <?php
}

第三種解決方案

與 WordPress 中的許多事情一樣,有幾乎無數的方式來皮膚的 cat 。雖然所有接受的方法都有效,但我發現它們比使用 wp_localize_script 在前端包含 ajax 功能更少”neat” 。

看一下這個:

add_action( 'wp_enqueue_scripts', 'se83650_js' );
function se83650_js()
{
    wp_enqueue_script( 'se83650-js', plugin_dir_url( __FILE__ ) . 'js/se83650.js',  'jquery', '1.0.0', true );
    // First param is the name of the script you are attaching it to - in this case
    // it is the name of the custom script we added.  Second param is the name of
    // the javscript Object that will be attached with your information.
    // Third param is an array of attributes, in this case, ajaxurl
    wp_localize_script( 'se83650-js', 'se83650Ajax',
        array(
            // You can put any variables here you want for your script
            // such as plugin-specific variables or nonces, etc.
            'ajaxurl'    => admin_url( 'admin-ajax.php' )
        )
    );
}

然後在 se83650.js 檔案中,您將使用 se83650Ajax.ajaxurl 引用變數。

這種技術的優點是,如果最終使用許多嘗試和複製此功能的外掛,它們不包括或覆蓋相同的變數。 ajaxurl 是非常通用的包含,這讓你更加包容,它與其他開發人員更好。

參考文獻

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