WordPress AJAX 不调用 PHP 函数


Wordpress AJAX not calling PHP function

我已经尝试了很多不同的东西,但我就是无法让AJAX与Wordpress一起工作。我显然没有得到一些东西,但我不知道它是什么。自从我测试过它以来,PHP 函数工作正常,它似乎无法通过 JS。这个想法是,当有人点击 #subscribe-btndiv 它的用户元更新时,没有什么过于复杂的。任何关于为什么这不起作用的帮助都会很棒。

这是我的主题功能.php:

function add_admin_ajax() 
{
 wp_localize_script( 'add_ajax', 'functionAjax', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
 wp_enqueue_script( 'add_ajax', get_template_directory_uri().'/assets/js/onLoad.js', 'jquery', true);
}
add_action('template_redirect', 'add_admin_ajax');
add_action( 'wp_ajax_subscribe_cat', 'subscribe_cat' );    
add_action( 'wp_ajax_nopriv_subscribe_cat', 'subscribe_cat' );
function subscribe_cat()
{
global $current_user;
if(is_user_logged_in())
{
    get_currentuserinfo(); 
    $userid = $current_user->ID;
    $catsub = get_category(get_query_var('cat'));
        $cat_id = $catsub->cat_ID;
    $subs = get_user_meta($userid, 'user_subscriptions', true);
    if(empty($subs))
    {
        $subs = array();
    }
    if(!in_array($cat_id, $subs))
    {
        $subs[] = $cat_id;
        update_user_meta($userid, 'user_subscriptions', $subs); 
        //echo json_encode($subs);
    }   

}
die();
} 

然后是jQuery:

$(document).on("click", "#subscribe-btn", function (e) {
//e.preventDefault();
$('#subscribe-btn').fadeOut(300);
$.ajax({
  url: ajaxurl,
  data: {action: "subscribe_cat"},
  success: function() {
  alert("Yay!")
 },
 error: function() {
  alert("BOo!")
 }
 }); // end ajax call
});

我没有收到成功或错误消息。div 确实淡出,尽管我猜这是。这里有任何帮助吗?谢谢!

编辑:我刚刚将 add_action 中的操作标识符从订阅更改为subscribe_cat,并将 ajax url 从 functionAjax.ajaxurl 更改为简单的 ajaxurl。现在它的回应。但是,我收到了两次成功警报,我不明白,而且它似乎并没有真正触发 PHP 函数,或者至少没有正确触发,因为我没有得到当我简单地在 PHP 中调用函数时得到的结果没有 ajax。这里有什么想法吗?

您需要做的一件事是更改在WordPress主题函数.php文件中设置操作的方式。

我认为这是一个问题:wp_ajax_订阅

这:

add_action( 'wp_ajax_subscribe', 'subscribe_cat' );    
add_action( 'wp_ajax_nopriv_subscribe', 'subscribe_cat' );

应该是:

add_action( 'wp_ajax_subscribe_cat', 'subscribe_cat' );    
add_action( 'wp_ajax_nopriv_subscribe_cat', 'subscribe_cat' );

您在 javascript 中设置的操作需要与 wordpress add_action调用中第一个参数的结尾匹配。

WordPress文档

你应该使用 ajax 函数将页面信息(如 query_var)作为"数据"传递。

前端页面

<?php
$catsub = get_category(get_query_var('cat'));
$cat_id = $catsub->cat_ID;
?>

<script>
    $(document).on("click", "#subscribe-btn", function (e) {
        e.preventDefault();
        $('#subscribe-btn').fadeOut(300);
        $.ajax({
          url: ajaxurl,
          data: {
                action: "subscribe_cat",
                catid: "<?php echo $cat_id;?>"
          },
          success: function(response) {
                console.log(response);
         },
         error: function() {
            alert("BOo!")
         }
         }); // end ajax call
    });
</script>

同样在你的 ajax 函数中,你有一个条件,该条件总是计算为 false。

函数.php

add_action( 'wp_ajax_subscribe_cat', 'subscribe_cat' );    
add_action( 'wp_ajax_nopriv_subscribe_cat', 'subscribe_cat' );
function subscribe_cat(){

    //changed here!!
    $cat_id = $_POST['catid'];
    if(!$cat_id){
        echo 'cat_id is missing';   
        exit;
    } elseif(!is_user_logged_in()) {
        echo 'Not logged in!';  
        exit;
    }   
    $userid = get_current_user_id();

    $subs = get_user_meta($userid, 'user_subscriptions', true);
    if(empty($subs))
        $subs = array();
    $subs[] = $cat_id;
    update_user_meta($userid, 'user_subscriptions', $subs); 
    echo json_encode($subs);
    exit;
}