問題描述
我喜歡 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。