我见过一些类似的问题,但我找不到解决问题的方法。
<?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文件在浏览器中工作,但从未调用回调函数?
最合适的回答,由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_action
是LogHit_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) {