问题描述

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