将admin-ajax.php添加到前端。好主意还是坏主意?

时间:2013-01-29 作者:MathSmath

我喜欢管理ajax。php。但我讨厌必须本地化才能将前端脚本指向它,我希望有一个等效的、易于查找的主题文件。(看到前端请求通过“/wp-admin/”,我也很烦恼。没有实际原因,只是看起来很难看。)

所以我只是复制了管理ajax。php中的根目录“/ajax.php”,调整了包含路径并删除了WP\\u ADMIN常量定义。看起来就像gangbusters(我现在可以将所有前端AJAX请求直接发送到/AJAX.php!并且我仍然可以在插件中使用普通的wp\\uAjax挂钩!)。

但这安全吗?可能出现什么问题?由于这并没有内置到core中,我想有一个很好的理由来解释为什么不这样做。但仔细查看代码,我看不到任何直接的问题。

你很聪明--告诉我这种方法是否疯狂。或者如果我忽略了一个更简单的方法。

3 个回复
最合适的回答,由SO网友:fuxia 整理而成

您可以只使用重写规则。htaccess高于常规permalink重写规则:

RewriteRule ^ajax$ /wp-admin/admin-ajax.php [L]
现在将AJAX请求发送到example.com/ajax, 升级后,决不要错过对该文件的核心更改。

SO网友:chrisguitarguy

First: 标准化。如果你计划使用社区插件,很可能他们不会关心你的/ajax.php 文档根目录中的文件。所以他们不会使用它。

如果你想自己完成所有的事情,这不是问题。

Second: 如果核心更新了怎么办?您会监视并更改ajax文件吗?

Third: 即使admin-ajax.php 居住在wp-admin, 它不加载任何管理区域的内容(例如列表等)。它也不会检查身份验证或公开任何对未登录用户敏感的内容。换句话说,它就像一个前端文件。没什么好担心的。

Fourth: 与第一个问题相关,一些插件会在盲目加载ajax相关功能之前进行检查。下面是一个示例。修改后的ajax。php可能不会导致加载。

<?php
if (is_admin() && defined(\'DOING_AJAX\') && DOING_AJAX) {
    //  load ajax stuff
}
Finally: 您所抱怨的是,使用本地化来获取Ajax URL是一件好事。为什么?因为您的JS文件不知道服务器端的任何内容。你要硬插入一个URL,如果/当网站移动时,该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
}

SO网友:bybloggers

就像WordPress中的许多东西一样,有无数种方法可以剥猫的皮。虽然所有公认的方法都有效,但我发现它们不如使用wp_localize_script 在前端包括ajax功能。

查看以下内容:

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 包含起来非常通用,这会让您更加内敛,并且与其他开发人员的合作也会更好。

结束