我无法从AJAX php调用访问WordPress函数

时间:2013-01-10 作者:Gavin Mannion

我见过一些类似的问题,但我找不到解决问题的方法。

<?php
add_action(\'wp_ajax_nopriv_LogHit_callback\', \'LogHit_callback\');
add_action(\'wp_ajax_LogHit_callback\', \'LogHit_callback\');
function HitCount() {
  ?>
  <script type="text/javascript" >
  jQuery(document).ready(function($) {
    var data = {
        action: \'LogHit_callback\',
        PostId:\'<?php echo get_the_ID() ?>\'
    };

    jQuery.post(\'http://www.test.com/wp-admin/admin-ajax.php\', data);
 });
 </script>
<?php

function LogHit_callback() {
  global $wpdb; // this is how you get access to the database

  $postId = $_POST[\'PostId\'];
  $hits = get_post_meta((int)$postId, \'hit-counter\', true);
  $hits = $hits + 1;
  update_post_meta((int)$postId, \'hit-counter\', (int)$hits);
  exit; // this is required to return a proper result
}
当我在页面中调用HitCount函数时,它会呈现以下内容

<script type="text/javascript" >
 jQuery(document).ready(function($) {
var data = {
    action: \'LogHit_callback\',
    PostId:\'86476\'
};
jQuery.post(\'http://www.test.com/wp-admin/admin-ajax.php\', data);
  });
</script>
指向管理ajax的直接链接。php文件在浏览器中工作,但从未调用回调函数?

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

您正在向服务器发出新请求,并且您似乎正在加载一个没有加载WordPress核心功能的页面。我需要看看你的HitCount.php 来证实这一点,但我想不出其他解释。

逐段加载WordPRess文件很棘手,而且随着核心代码的更改,很容易被破坏。您可以通过加载wp-load.php, wp-settings.php, 或wp-blog-header.php. 我相信后者是正式正确的,但它将加载您可能不需要的主题功能。我不确定这一点,因为自从AJAX API可用以来,我没有使用过任何这些技巧,这让我想到。。。

最安全的做法是使用AJAX API, 这就是我的建议,除非你真的非常了解WordPRess核心文件和加载顺序,并且需要非常快速的响应。AJAX API加载量很大,因此速度可能很慢,但就个人经验而言,我从未注意到有值得担心的延迟。

SO网友:Milo

我在您更新的代码中看到了两个问题-

在js中传递的操作是LogHit, 但是你的行动add_actionLogHit_callback: wp_ajax_nopriv_LogHit_callback. 其中一个必须改变以匹配另一个。

这个HitCount 函数-将代码添加到页面的挂钩在哪里?在该代码块中:jQuery.post(ajaxurl..., 在前端ajaxurl 不会被定义。如果这被直接注入到页面中,那么您应该通过admin_url( \'admin-ajax.php\' ). 首选方法是将其放入自己的js文件中,enqueue it, 然后使用wp_localize_script 设置ajaxurl:

wp_enqueue_script(
    \'my-ajax-request\',
    plugin_dir_url( __FILE__ ) . \'js/your_script.js\',
    array( \'jquery\' )
);

wp_localize_script(
    \'my-ajax-request\',
    \'MyAjax\',
    array( \'ajaxurl\' => admin_url( \'admin-ajax.php\' ) )
);
然后使用MyAjax.ajaxurl 在您的js中:

jQuery.post(MyAjax.ajaxurl, data, function(response) {

SO网友:WP Themes

你需要加载所有wordPress的内容,在过去,你必须include "../../../wp-load.php" 或者类似的东西。

但是,现在,最好的做法是admin-ajax.php 处理所有ajax请求。你需要了解hooks才能做到这一点,我相信你做到了:)

我建议读这篇文章http://www.garyc40.com/2010/03/5-tips-for-using-ajax-in-wordpress/#js-global 对于初学者。

结束

相关推荐

没有#!的AJAX URL,如何防止在加载或重载时落入Single.php?

我正试图通过一个支持ajax的单页公文包来正确地处理问题。我读到没有必要#! 让它可以被谷歌抓取。所以我有干净的URL更新.pushState 当我加载一个帖子时。我的问题是,如果你点击F5或直接加载一个URL,你就会陷入单一。php。您可以在此处亲自尝试:http://www.youpiemonday.com/我怎样才能避免掉进文章页面?我想从单曲中重新定向。php到主页并触发打开那里的帖子。但是发表评论,这似乎不是一个好主意。不管怎样,我现在被困住了。。。你可以看到我对StackOverflow的思考