wordpress admin-ajax.php问题

时间:2011-12-08 00:31:33

标签: php ajax wordpress

我正在开发一个wordpress项目,并且遇到了令人沮丧的ajax问题。

我正在尝试从wordpress页面设置一个ajax调用到我称为getHistoricalTransFunctions.php的php脚本。 getHistoricalTransFunctions.php然后包含一个充满函数的文件,并运行我需要的函数。然后,所需的函数打印出一个响应,然后将其发送回我的javascript代码,然后显示响应。问题是,我试图将NEEDS称为wordpress环境,因为它调用了特定的wordpress函数。

我做了一些研究,发现wordpress在admin-ajax.php中提供了一个ajax处理程序。我已经学过很多教程,包括:

http://codex.wordpress.org/AJAX_in_Plugins/

http://www.1stwebdesigner.com/css/implement-ajax-wordpress-themes/

http://www.garyc40.com/2010/03/5-tips-for-using-ajax-in-wordpress/

我已经遵循了所有这些,但仍然出于任何原因我从admin-ajax.php页面得到“-1”响应。我跟踪它并发现它源自is_user_logged_in()函数。显然wordpress不认为我的用户已登录,因此它在该代码块中出错。以下是我的一些代码:

这是我的javascript电话:

$('button#RunReportButton2').click(function() {
  $('#transactionContainer2').html("<img src='<?php echo $RootDomain; ?>/wp-content/themes/test-client/images/ajax-loader.gif' id='ajaxloader' style='margin: 170px auto auto 340px;' />");
  var fromDate2 = $('#fromDate2').val();
  var toDate2 = $('#toDate2').val();
  $.ajax({ type: "POST",
    url:ajaxurl,
    type:'POST',
    data: { action:"runReport2",
            startingInt:"0",
            fromDate:fromDate2,
            toDate:toDate2 },
    success: function(html) {
      $('#transactionContainer2').html(html);
    }
  });
  return false;
});

我将其添加到admin-ajax.php的底部:

add_action(wp_ajax_nopriv_runReport2, runReport2);
add_action(wp_ajax_runReport2, runReport2);

然后我调用的实际php函数是:

function runReport2() {
  include("$RootDomain/wp-content/themes/test-client/reports/historicalTransFunctions.php");

  $startingIndex = $_POST['startingInt'];
  //$startingIndex = 0;
  $fromDate = $_POST['fromDate'];
  //$fromDate = "2011-02-11";
  $toDate = $_POST['toDate'];
  //$toDate = "2011-12-05";

  // post variable sanitization
  if(!is_numeric($startingIndex)) {
    printHistoricalTransactions($token, $client, 0);
    die();
  }

  if($startingIndex <= 0) {
    printHistoricalTransactions($token, $client, 0);
    die();
  }

  // match date
  $dateregex = '/^(19|20)\d\d-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$/';

  if($toDate != "" && $fromDate != "") {
    if(preg_match($dateregex, $fromDate) && preg_match($dateregex, $toDate))
      printHistoricalTransactions($token, $client, $startingIndex, $fromDate, $toDate);
  } else {
    printHistoricalTransactions($token, $client, $startingIndex);
  }
  die();
}

我想知道admin-ajax.php是否是做我需要做的最好的方法,而且我也想知道为什么这不起作用?谢谢!

1 个答案:

答案 0 :(得分:3)

首先,你永远不应该修改核心文件。无需将您的ajax函数添加到admin-ajax.php。只需将add_action放在函数上方即可。此外,您的add_action缺少操作和函数名称周围的引号(在此处发布代码时可能会出现疏忽)。

除非用户登录,否则javascript ajaxurl变量在前端不可用。您需要在js中定义变量:ajaxurl = 'http://your_site.com/wp-admin/admin-ajax.php';

通常使用admin-ajax.php我必须使用输出缓冲来使其正常工作:

 function runReport2() {
 ob_start ();
 //your code

 //end your code
$response = ob_get_contents ();
    ob_end_clean ();
    echo $response;
    die( 1 );