2

私はWordpressで作業しており、ajaxリクエストを使用して、ユーザーIDを渡してユーザーデータをフェッチしようとしています。

ユーザーIDがAJAXPOSTを介して正しく送信されていることはわかりますが、内部エラーメッセージが表示され、その理由がわかりません。

最初は、ユーザープロファイルに追加したカスタムフィールドを取得しようとしたためだと思いましたが、スクリプトを簡略化しても、エラーメッセージが表示されます。

どんな助けでも大歓迎です!

フロントエンド

$('.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;
});

author_info.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 リクエストを検証します。好きなものを指定できます。

次に、または関数を構築する必要があります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

むしろ、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 に答える
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 に答える