2011-12-08 12 views
0

私はwordpressプロジェクトに取り組んでいて、ajaxに苛立たしい問題があります。wordpress admin-ajax.php issues

私はWordPressのページからgetHistoricalTransFunctions.phpというPHPスクリプトにajax呼び出しを設定しようとしています。 getHistoricalTransFunctions.phpには、関数でいっぱいのファイルが含まれていて、必要な関数が実行されます。その後、必要な関数が応答を出力し、応答が表示されるjavascriptコードに返されます。キャッチは、特定のwordpress関数を呼び出すため、Wordpress環境にあるためにNEEDSを呼び出しようとしている関数です。

私はいくつかの調査を行い、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/

私はこれらすべてが、それでも私は取得しています何らかの理由で続いてきたの「-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(); 
} 

管理者-ajax.phpは私が何をする必要があるか行うための最善の方法である場合、私は思ったんだけど、私はアルよなぜこれが動作していないのだろうか?ありがとう!

答えて

3

まず、コアファイルを変更しないでください。 admin-ajax.phpにajax関数を追加する必要はありません。 add_actionを関数のすぐ上に置くだけです。また、あなたのadd_actionにはアクション名と関数名の引用符がありません(ここにあなたのコードを投稿する際の見落としでしょう)。

ユーザーがログインしている場合を除きまた、javascriptのajaxurl変数は、フロントエンドでは使用できませんあなたのJSで変数を定義する必要があります。ajaxurl = 'http://your_site.com/wp-admin/admin-ajax.php';

多くの場合、私は出力を使用する必要があり、管理-ajax.phpでバッファリングして正常に動作させる:

+0

おかげさまでChris。それが助けになりました。私の問題は、私がrunReport2()関数に$ RootDomain変数を使うことを含めることを試みていたことが判明しました。その変数は間違っていたので、私はパスをハードコードし、それは完全に機能しました。また、私はすべてのコードをadmin-ajax.phpファイルから削除しました。これですべてがfunction.phpになりました。あなたのヒントありがとう! – Erreth

+0

admin ajax URLをハードコードしないでください。 'admin_url( 'admin-ajax.php')'のようなものを使用してください。他に何もなければ、 "http:"をハードコードするのではなく、ベースドメインを変更する必要があります(例:ローカルテスト)。 – Jake