如何在WordPress中加载Ajax

我熟悉使用jQuery以常规方式使用ajax。
我已经玩了一段时间,但不明白Wordpress需要什么来让它工作……
我在这里有一些教程或文章。
这是在functions.php中 (在子主题中):

// code to load jquery - working fine // code to load javascript file - working fine // ENABLE AJAX : function add_ajax() { wp_localize_script( 'function', 'ajax_script', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) ); } $dirName = get_stylesheet_directory(); // use this to get child theme dir require_once ($dirName."/ajax.php"); add_action("wp_ajax_nopriv_function1", "function1"); // function in ajax.php add_action('template_redirect', 'add_ajax'); 

jQuery本身正在加载并正常工作。

我尝试了一些基本的ajax,如下所示:

 jQuery(document).ready(function($){ $('a.link').click(function(){ $.ajax({ url: ajax_script.ajaxurl, data: ({action : 'function1'}), success: function(data){ $('#result').html(data); } }); return false; }); }); 

除此之外,我不知道如何测试它是否甚至正确加载开始……

任何帮助在这里将不胜感激。

编辑:
在firebug这个错误:

 ReferenceError: ajax_script is not defined url: ajax_script.ajaxurl, 

根据您的要求,我已经为您解答了这个问题。

正如Hieu Nguyen在他的回答中建议的那样,你可以使用ajaxurl javascript变量来引用admin-ajax.php文件。 但是,此变量未在前端声明。 通过将以下内容放在主题的header.php中,可以很容易地在前端声明这一点。

  

如Wordpress AJAX文档中所述,您有两个不同的钩子 – wp_ajax_(action)和wp_ajax_nopriv_(action)。 这些之间的区别是:

  • wp_ajax_(action):如果从管理面板内部进行ajax调用,则会触发此操作。
  • wp_ajax_nopriv_(action):如果ajax调用来自网站的前端,则会触发此操作。

上面链接的文档中描述了其他所有内容。 快乐的编码!

PS这是一个应该有用的例子。 (我没有测试过)

前端

  

后端

  

更新即使这是一个古老的答案,它似乎不断得到人们的赞许 – 这太棒了! 我认为这可能对某些人有用。

WordPress有一个函数wp_localize_script 。 此函数将数据数组作为第三个参数,用于翻译,如下所示:

 var translation = { success: "Success!", failure: "Failure!", error: "Error!", ... }; 

因此,这只是将对象加载到HTML头标记中。 这可以通过以下方式使用:

后端

 wp_localize_script( 'FrontEndAjax', 'ajax', array( 'url' => admin_url( 'admin-ajax.php' ) ) ); 

这种方法的优点是它可以在主题和插件中使用,因为您没有将ajax URL变量硬编码到主题中。

在前端,现在可以通过ajax.url访问URL,而不是前面示例中的简单ajaxurl

首先,您应该彻底阅读此页面http://codex.wordpress.org/AJAX_in_Plugins

其次, ajax_script因此您应该更改为: url: ajaxurl 。 我在上面的代码中没有看到你的function1() ,但你可能已经在其他文件中定义了它。

最后,学习如何使用Firebug调试ajax调用,网络和控制台选项卡将成为你的朋友。 在PHP方面, print_r()var_dump()将成为你的朋友。

就个人而言,我更喜欢在wordpress中执行ajax,就像我在任何其他网站上执行ajax一样。 我创建了一个处理器php文件来处理我的所有ajax请求并只使用该URL。 所以这是因为htaccess在wordpress中不太可能,所以我做了以下几点。

1.在我的hpaccess文件中,我的wp-content文件夹中我将其添加到已经存在的内容下面

  Order Allow,Deny Allow from all  

在这种情况下,我的处理器文件名为forms.php – 你可以将它放在你的wp-content / themes / themeName文件夹中,以及所有其他文件,例如header.php footer.php等……它只是存在于你的主题中根。

2.)在我的ajax代码中,我可以像这样使用我的url

 $.ajax({ url:'/wp-content/themes/themeName/forms.php', data:({ someVar: someValue }), type: 'POST' }); 

很明显,你可以添加你喜欢的任何你之前,成功或错误类型的东西…但是,这是(我相信)更简单的方法,因为你避免在8个不同的地方告诉wordpress的所有愚蠢是什么将要发生的事情,这也让你避免做其他事情,你看到人们在他们把js代码放在页面级别的地方,所以他们可以深入到我喜欢保持我的js文件分开的PHP。

使用wp_localize_script并在那里传递url:

 wp_localize_script( some_handle, 'admin_url', array('ajax_url' => admin_url( 'admin-ajax.php' ) ) ); 

然后在js内,你可以调用它

 admin_url.ajax_url 

我认为既然已经加载了js文件,我就不需要在单独的add_ajax函数中再次加载/排队了。
但这必须是必要的,或者我这样做了,它现在正在发挥作用。

希望能帮到别人。

以下是问题的更正代码:

 // code to load jquery - working fine // code to load javascript file - working fine // ENABLE AJAX : function add_ajax() { wp_enqueue_script( 'function', 'http://host/blog/wp-content/themes/theme/js.js', array( 'jquery' ), '1.0', 1 ); wp_localize_script( 'function', 'ajax_script', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) ); } $dirName = get_stylesheet_directory(); // use this to get child theme dir require_once ($dirName."/ajax.php"); add_action("wp_ajax_nopriv_function1", "function1"); // function in ajax.php add_action('template_redirect', 'add_ajax');