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