如何在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');