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


17

我爱admin-ajax.php。但是我讨厌不得不本地化以便将前端脚本指向它,并且我希望有一个等效的,易于找到的主题文件。(看到前端请求通过“ / wp-admin /”,这也使我感到困扰。没有实际原因,只是看起来丑陋的IMO。)

因此,我只是将admin-ajax.php复制到了“ /ajax.php”的根目录下,调整了包含路径并删除了WP_ADMIN常量定义。似乎像大爆炸一样工作(我现在可以将所有前端AJAX请求定向到/ajax.php!而且我仍然可以在插件中使用普通的wp_ajax钩子!)。

但这安全吗?可能出什么问题了?由于这不是核心功能,因此我认为有充分的理由。但是查看代码,我看不到任何直接的问题。

您很聪明-如果这种方法很疯狂,请告诉我。或者,如果有一种更简单的方法我忽略了。


在自动更新过程中,您可能会忘记并错过此文件,这可能会导致事情中断并保留安全漏洞。
亨姆(Hemm)

Answers:


19

您可以在常规的永久链接重写规则之上对.htaccess使用RewriteRule:

RewriteRule ^ajax$ /wp-admin/admin-ajax.php [L]

现在,将您的AJAX请求发送到example.com/ajax,并且升级后再也不会丢失对该文件的核心更改。


好点子!这是其中的一件事,一旦您听到它,您就会认为“那是如此简单和明显!” 谢谢。
MathSmath 2013年

我根据您的建议添加了重写规则,但添加了example.com/ajaxURL 404。您能否详细说明.htaccess我应该在哪添加。我目前在# BEGIN WordPress <IfModule mod_rewrite.c></IfModule> # END WordPress
约翰

这可行。我错过了结尾的斜线。我将永久链接设置为/%postname%/
约翰·

7

第一:标准化。如果您打算使用社区插件,那么它们很可能不会在意/ajax.php文档根目录中的文件。因此他们不会使用它。

如果您要自己滚动所有内容,这不是问题。

第二:如果核心更新了怎么办?您将监视并更改您的ajax文件吗?

第三:尽管admin-ajax.php驻留在中wp-admin,但它不会加载任何管理区内容(例如列表表等)。它也不会检查身份验证或公开任何对未登录用户敏感的内容。换句话说,它就像一个前端文件。完全不用担心。

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

<?php
if (is_admin() && defined('DOING_AJAX') && DOING_AJAX) {
    //  load ajax stuff
}

最后:您抱怨的事情是,使用本地化获取Ajax URL是一件好事。为什么?因为您的JS文件不知道任何服务器端内容。如果网站移动,您将很难使用其中的URL?似乎是一个错误的选择。

如果您真的不想本地化所有使用Ajax的脚本,则可以wp_head很早就插入钩子并吐出admin 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
}

谢谢,克里斯!所有有效点。您帮助我意识到的最大事情是,尽管我并不认为这是“核心hack”(因为我是在添加,而不是修改文件),但实际上这是因为它依赖于核心中的其他功能,可能会发生变化。与其他任何插件(也可能在核心功能更改后也会消失)没有太大差异,但在哲学上绝对不同。感谢您的想法!
MathSmath 2013年

回复:“ 第三:...没什么可担心的。 ”,当尝试锁定wp-admin目录时如何处理,例如使用.htaccess规则限制到已知安全的IP范围呢?我猜想对ajax-admin.php文件需要做出某种例外?(我之所以说“假定”,是因为我对.htaccess规则比较笨拙,并且真的不知道这是否可行吗?)。
2013年

是的,应该可以允许一个文件。
chrisguitarguy

@chrisguitarguy,这是一个绝妙的答案,谢谢。我正在尝试在前端加载admin-ajax,因为我正在反向将siteurl代理到我的暂存/主url。请查看以下内容:链接是否可以使用3rd party插件?我的方法不正确吗?
paranza

5

就像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非常通用,可以让您获得更多的控制权,并且可以和其他开发人员一起玩。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.