AJAX操作未触发PHP函数

时间:2021-11-10 作者:Shelaine

我以前在WordPress中使用过Ajax,并使其正常工作。然而,事实证明,这种特殊情况(文件上传)很困难。问题似乎是,尽管我在AJAX中设置了操作,但该操作并没有调用php函数formData.append( \'action\', \'uc_user_image\' ); 与PHP中的函数名相同function uc_user_image()

我知道Ajax正在工作,因为我在success: function(data) {} 控制台中没有任何错误。

我的最终目标是允许用户通过其帐户页面动态更改其个人资料图像。我已经阅读了很多教程和SE问题,但似乎无法理解。非常感谢您的反馈。

functions.php

<?php

// includes
include( get_theme_file_path( \'/includes/enqueue.php\' ) );
include( get_theme_file_path( \'/includes/process/profile-picture.php\' ) );

// hooks
add_action( \'wp_enqueue_scripts\', \'include_scripts\' );
add_action( \'wp_ajax_uc_user_image\', \'uc_user_image\' );
更新:我没有包括nopriv操作,因为这应该只对登录用户有效。我也只在登录时进行测试。

enqueue.php

<?php

function include_scripts() {

  $uri              =     get_theme_file_uri();
  $ver              =     UC_DEV_MODE ? time() : false;

wp_register_script( \'ajax-account\', $uri . \'/assets/js/account/userimg-ajax.js\', array(\'jquery\'), $ver, true);
wp_localize_script( \'ajax-account\', \'userimg\', array( \'ajaxurl\' => admin_url( \'admin-ajax.php\', \'relataive\' )));
wp_enqueue_script( \'ajax-account\' );

}

profile-picture.php

<?php

function uc_user_image() {
// I know (assume) this isn\'t firing because I\'ve done some checks like below.
// I\'m omitting the file upload code to focus on calling the function.

  $output = [\'status\'  => \'func_fired\'];
  wp_send_json($output);

}

userimg-ajax.js

jQuery(document).ready(function( $ ) {

  $(\'#user-image-form\').submit(function(e) {
    e.preventDefault();

    var formData = new FormData()
    var file = $(\'#user-image-file\')[0].files[0];
    formData.append( \'action\', \'uc_user_image\' );
    formData.append( \'file\', file );

    $.ajax({
        url: userimg.ajax_url,
        type: \'POST\',
        data: formData,
        processData: false,
        contentType: false,
        success: function(data) {
              if ( data.status == \'func_fired\' ) {
                $(".dev-updates").html(\'Function Fired\');
              } else {
                $(".dev-updates").html(\'Function NOT Fired\');
              }
        }

    });

  });

});

form html

            <form id="user-image-form">

              <label id="user-image-upload">
                 <input type="file" name="user-image-file" id="user-image-file" accept="image/*" />
                 + Upload Picture
              </label>
              <button type="submit" id="user-image-save"/>Save</button>

            </form>
如果您质疑我为什么将输入包装在标签中,那么这是为了设计样式。

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

问题在于AJAX端点URL,即。url: userimg.ajax_url, 这实际上并没有在JS/PHP代码中定义。

更具体地说,您确实定义了正确的URL,但在JS对象中,属性名称是ajaxurlnot ajax_url:

// wrapped for brevity
wp_localize_script( \'ajax-account\', \'userimg\', array(
  \'ajaxurl\' => admin_url( \'admin-ajax.php\', \'relataive\' )
));
所以在你的$.ajax() args,请确保使用正确的属性名称-ajaxurl. 或者将PHP中的ajax_url.

然后问题就消失了。

相关推荐

无法在AJAX调用中使用‘new WP_Query’

我正在尝试为帖子创建类别过滤器。我通常与get_posts 函数,但这次我需要保持分页,这就是为什么我要使用new WP_Query.我已经成功创建了一个AJAX解决方案,它可以返回帖子并显示出来,但似乎使用new WP_Query 中断AJAX调用。以下是我的AJAX代码:(function($){ $(function() { $(\'.category-filter .filter a\' ).click( function(e) { var cate