问题描述
我喜欢 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。