2

我在 Wordpress 中工作,尝试使用 ajax 请求通过传递用户 ID 来获取用户数据。

我可以看到用户 ID 通过 AJAX POST 正确发送,但我收到一条内部错误消息,我不知道为什么。

起初我认为这是因为我试图获取一些已添加到用户配置文件中的自定义字段,但即使我简化了脚本,我仍然会收到错误消息。

任何帮助深表感谢!

前端

$('.author').click(function() {

    var id   = $(this).attr('id');
    var temp = id.split('-');
    id = temp[1];

    $.ajax({
            type: 'POST',
            url: 'wp-content/themes/twentyeleven/author_info.php',
            data: {id: id},
            dataType: 'html',
            success: function(data) {
                $('#author-bio').html(data);        
            }
        });     

    return false;
});

作者信息.php

$user_id = $_POST['id'];
$forename = get_the_author_meta('user_firstname', $user_id);
$output = $user_id;
echo $output;

错误信息

500 (Internal Server Error) jquery.min.js:4

4

3 回答 3

3

Mathieu 添加了一种可破解的方法来拦截请求并重定向它,这很好。我更喜欢构建返回json_encoded数组的 AJAX 响应。

$('.author').click(function() {

  var id   = $(this).attr('id');
  var temp = id.split('-');
  id = temp[1];

  $.ajax({
    url: 'http://absolute.path/wp-admin/admin-ajax.php',
    data: {'action' : 'ajax_request', 'fn': 'getAuthorMeta', 'id': id},
    dataType: 'json',
    success: function(data) {
      //We expect a JSON encoded array here, not an HTML template.       
    }
  });     
  return false;
});

现在我们构建函数来处理我们的 ajax 请求。

首先,我们需要定义我们的 ajax add_action 方法 ->

add_action('wp_ajax_nopriv_ajax_request', 'ajax_handle_request');
add_action('wp_ajax_ajax_request', 'ajax_handle_request');

我们需要在add_action这里使用两条线。我不会解释为什么。你会注意到_ajax_request这里。这是我们在 AJAX 函数中发送的“动作” data: {'action' : 'ajax_request'}。我们使用这个钩子来验证我们的 AJAX 请求,它可以是任何你想要的。

接下来,我们需要构建 out 或 function ajax_handle_request

function ajax_handle_request(){
  switch($_REQUEST['fn']){
    case 'getAuthorMeta':
      $output = ajax_get_author_meta($_REQUEST['id']);
      break;
    default:
      $output = 'That is not a valid FN parameter. Please check your string and try again';
      break;
  }
  $output = json_encode($output);
  if(is_array($output)){
    return $output;
  }else{
    echo $output;
  }
}

现在让我们构建我们的函数来实际获取作者元数据。

function ajax_get_author_meta($id){
  $theMeta = get_the_author_meta([meta_option], $id);
  return $theMeta;
}

其中 [meta_option] 是WP 原生 get_the_author_meta 函数提供的字段

在这一点上,我们现在将回到我们的success:function(data)and (data) 是对json_encoded我们返回的数组的引用。我们现在可以遍历对象以获取我们的字段并根据需要将它们输出到页面中。

于 2012-07-24T15:31:58.723 回答
2

您当时不在 POST 中,因为您正在调用模板的特定页面,该页面可能与您博客中的任何文章都不对应。

相反,请创建一个插件来执行此操作:

add_action('template_redirect', 'my_author_meta_intercept');
function my_author_meta_intercept(){
    if(isset($_POST['getAuthorMeta'])){
        echo get_the_author_meta('user_firstname', $_POST['getAuthorMeta']);
        exit();
    }
}

当您使用以下命令调用它时,这会将请求短路到与以前相同的页面:

http://mysite/mycurrenturl?getAuthorMeta=testMetaKey

因此,正常调用该帖子将照常返回文章,但如果您传入 ?getAuthorMeta,它将停止选择模板并简单地返回您希望它返回的确切内容。

在您的页面中,您只需将 javascript 更改为:

$('.author').click(function() {

    var id   = $(this).attr('id');
    var temp = id.split('-');
    id = temp[1];

    $.ajax({
            type: 'POST',
            url: window.location.href,
            data: {getAuthorMeta: id},
            success: function(data) {
                $('#author-bio').html(data);        
            }
        });     

    return false;
});

只要确保您根据需要调整概念即可!

于 2012-07-24T15:19:36.310 回答
2

我宁愿推荐你使用WP AJAX 操作方法

与您的情况一样,将以下内容添加到您的 functions.php 文件中。

 add_action('wp_ajax_get_user_info', 'ajax_get_user_info');
 add_action('wp_ajax_nopriv_get_user_info', 'ajax_get_user_info');

 function ajax_get_user_info() {
    //Handle request then generate response using WP_Ajax_Response or your html.
 }

然后在javascript标签中。

$('.author').click(function() {

    var id   = $(this).attr('id');
    var temp = id.split('-');
    id = temp[1];

jQuery.post(
   ajaxurl,  /* if you get error of undefined ajaxurl. set it to "http://example.com/wordpress/wp-admin/admin-ajax.php"*/
   {
      'action':'get_user_info',
      'user_id':id
   }, 
   function(response){
      alert('The server responded: ' + response);
   }
);
});

我建议您阅读在 WordPress 中使用 AJAX 的 5 个技巧

ps; 以上代码未经测试,可能有错误。但你明白了。

于 2012-07-24T15:33:20.853 回答