2011-12-08 69 views
0

我工作的一個WordPress的項目,並具有與阿賈克斯一個令人沮喪的問題。WordPress管理-ajax.php發出

我試圖從一個WordPress頁面調用Ajax成立一個PHP腳本我呼籲getHistoricalTransFunctions.php。然後getHistoricalTransFunctions.php包含一個充滿函數的文件,並運行我需要的函數。然後所需的功能打印出一個響應,它被髮回到我的JavaScript代碼,然後顯示響應。問題在於,我試圖將NEEDS稱爲wordpress環境中的函數,因爲它調用了特定的wordpress函數。

我做了一些研究,發現WordPress的提供管理-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/

我已經遵循所有這些,但還是因爲種種原因,我得到一個「-1 「來自admin-ajax.php頁面的響應。我追蹤它,發現它來自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; 
}); 

我將此添加到管理員-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是做我需要做的事情的最好方法,我是人所以想知道爲什麼這不起作用?謝謝!

回答

3

第一件事,你永遠不應該修改的核心文件。沒有必要將您的ajax功能添加到admin-ajax.php。只需將add_action放在函數的上方即可。此外,您的add_action缺少動作和函數名稱周圍的引號(在此處發佈代碼時可能是疏忽)。

而且除非用戶登錄的JavaScript ajaxurl變量不可在前端你需要在你的js定義變量:ajaxurl = 'http://your_site.com/wp-admin/admin-ajax.php';

與管理-ajax.php

我經常不得不使用輸出緩衝來得到它的工作權利:

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

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

感謝克里斯。這有幫助。事實證明我的問題是我試圖在我的runReport2()函數中使用$ RootDomain變量。該變量是不正確的,所以我硬編碼的路徑,它完美的工作。另外,我將所有代碼移出admin-ajax.php文件 - 現在全部放在functions.php中。感謝您的提示! – Erreth

+0

不要對admin ajax url進行硬編碼。使用'admin_url('admin-ajax.php')''。如果沒有別的,只是這樣你不會硬編碼「http:」,但也包括基礎域需要改變(例如:本地測試)。 – Jake