2012-07-24 3 views
1

나는 Wordpress에서 ajax 요청을 사용하여 사용자 ID를 전달하여 사용자 데이터를 가져 오려고 노력하고 있습니다.Wordpress - jQuery ajax POST 요청을 사용하여 사용자 정보 가져 오기

사용자 아이디가 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; 
}); 

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

+0

이것은 Wordpress에서 ajax를 사용하는 올바른 방법이 아닙니다. 올바른 방법을보고 싶으십니까? – Ohgodwhy

+0

@Ohgodwhy 정답을 얻지 못하면 왜 질문을할까요? –

+0

@ Jason Towne 왜냐하면 'best practice'! = '효과가 있습니다'. – Ohgodwhy

답변

2

마티유는 요청을 차단하고 리디렉션하는 해킹 가능 접근법을 추가했습니다. 나는 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 요청을 처리하는 기능을 구축합니다.

첫째, 우리는 우리의 아약스 ADD_ACTION 방법을 정의 할 필요가있다 - 우리는 여기에 모두 add_action 라인을 사용할 필요가>

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

. 나는 왜 들어 가지 않을거야. 여기에 _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]은 a field provided by WP's native get_the_author_meta function입니다.

이 시점에서 우리는 이제 success:function(data)으로 돌아갈 것이며 (데이터)는 우리가 반환 한 json_encoded 배열에 대한 참조입니다. 이제 개체를 반복하여 필드를 가져 와서 원하는대로 페이지에 출력 할 수 있습니다.

+0

고마워해야합니다. 오류가 발생합니다. 간단히 말해서,'add_action'과'function ajax_handle_request() {'는'functions.php'에 놓이고 마지막 함수'function ajax_get_author_meta ($ id) {'는'author_info.php'에 들어 있어야합니까? – martincarlin87

+0

이 모든 함수는 functions.php에 있어야합니다. author_info.php가 필요 없습니다. – Ohgodwhy

+0

괜찮 았어. 그냥 마지막 함수가 functions.php에 붙여지면 바로 내 페이지가로드되지 않는다. 또한 별도의 ajax 파일이 필요없는 경우 왜 Ajax 요청의 URL이 여전히이 파일을 가리키고 있습니까? - 'url :'http : // absolute.path/wp-content/themes/twentyeleven/author_info.php ',' – martincarlin87

1

블로그의 특정 기사와 일치하지 않는 템플릿의 특정 페이지를 호출하기 때문에 그 순간 POST되지 않았습니다.

대신,이 작업을 수행하는 pluggin을 만듭니다

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를 전달하면 템플릿이 선택되지 않고 반환하려는 정확한 콘텐츠가 반환됩니다. 페이지에서

, 당신은 당신의 자바 스크립트를 변경해야합니다 :

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

그냥 당신이 당신이 필요로 개념을 적용해야합니다!

+0

덕분에, 나는 그것을 줄 것입니다. – martincarlin87

+0

또한 정보를 얻는 방법으로 "POST"를 사용했습니다. 서브 ジェット에서 "POST"는 서버의 상태 변경을 위해 예약되어 있지만 "GET"은 정보를 쿼리하는 데 사용됩니다. 따라서 데이터를 가져 오려면 AJAX 호출에서 항상 GET을 사용해야합니다. 그러나 서버의 상태를 변경해야하는 경우 POST –

2

WP AJAX action method을 사용하는 것이 좋습니다.

귀하의 경우에 따라 다음을 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. 
} 

자바 스크립트 태그.

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

나는 5 tips for using AJAX in WordPress을 읽을 것을 권합니다.

p.s; 위의 코드는 테스트되지 않았으므로 오류가있을 수 있습니다. 그러나 당신은 아이디어를 얻는다.

+1

이것의 긴 형태의 버전에 대한 내 게시물을 참조하십시오! – Ohgodwhy

관련 문제