2012-03-29 4 views
0

나는 이것을 wordpress.stackexchange.com에 올렸습니다. 그러나 결코 답장을받지 못했습니다. 그러므로 여기에서 나의 운을 시험해보십시오.Wordpress Ajax 호출을 전역 변수와 함께 사용하여 데이터베이스 쿼리를 줄입니다.

본인은이 문제에 대해 내가 무엇을 필요로하고 무엇을했는지에 대해 자세히 설명합니다. 나는 내가 한 일이나 어쩌면 새로운 제안에 대해 실행 가능한 해결책을 열어두고 있습니다.

$user_data = get_user_by('login', get_query_var('user_login')); 

위의 코드는 URL의 query_var로 전달 된 사용자 이름을 사용

나는 다음과 같은 사용하여 검색되는 사용자 데이터의 사용을 확인해야합니다. 모두는 여기까지 일합니다.

단일 페이지로드시 여러 Ajax 콜백 (admin-ajax.php에서 처리)에서 위의 코드를 사용합니다. 이후 사이트는 대량 사이트로 타겟팅됩니다. 이러한 모든 Ajax 요청은 동일한 데이터에 대한 여러 데이터베이스 쿼리를 유도합니다.

$_GLOBALS['user_data'] = get_user_by('login', get_query_var('user_login')); 

그리고 아약스 콜백에서 동일하게 사용 : 그래서 일부 데이터베이스 쿼리를 저장하는 명백한 아이디어는 아래와 같이 전역 변수로 데이터를 전달하는 것입니다. 여기에 문제가있다. Ajax 콜백 함수 중 어느 것도 global $ user_data 변수를 볼 수 없습니다. 네가 물어보기 전에, 나는 글로벌 콜백을 선언했다.

그래서, 명백한 대답은 다음과 같습니다 왜 안 wp_localize_script를 사용하고 우는 소리처럼 자바 스크립트를 통해 아약스 콜백은 $ _ 데이터를 전달합니다

wp_localize_script('jquery', 'ajaxVars', array('ajaxurl' => admin_url('admin-ajax.php'), 'user_data' => $user_data)); 

자바 스크립트에서 :

PHP에서

 jQuery.ajax({ 
     url: ajaxVars.ajaxurl, 
     type:'POST', 
     async: false, 
     cache: false, 
     timeout: 10000, 
     data: 'action=ajax_callback&user_data=' + ajaxVars.user_data, 
     success: function(value) { 
      alert(value); 
     }, 
     error: function() { 
      alert(error); 
     } 
    }); 

그러나 두 가지 질문이 있습니다.

get_user_by('login', get_query_var('user_login')); 반품을 wp_localize_script()으로 처리해야합니까?

위의 질문에 대한 대답이 '예'인 경우 개체에 중요한 사용자 정보가 포함되어있어 보안 위협이되지 않습니까?

Ajax 콜백에 사용할 수없는 전역 변수를 극복하기 위해 함수 내에서 직접 랩핑하지 않고 functions.php에서 직접 선언했습니다. 그러나 get_query_var('user_login')은 functions.php에서 직접 사용할 때 데이터를 반환하지 않습니다 (함수 안에 추가하고 작업을 통해 호출해야 함).

그래서 질문이 남아 있습니다. $user_data = get_user_by('login', get_query_var('user_login'));을 모든 Ajax 요청에 대해 어떻게 호출합니까? 아니면 직접 함수 (함수 안에 배치하지 않고) function.php 안에서 작동하도록 get_query_var('user_login')을 얻을 수있는 방법이 있습니까?

어쩌면 완전히 새로운 사고 방식일까요?

답변

2

이러한 모든 Ajax 요청은 동일한 데이터에 대한 여러 데이터베이스 쿼리로 연결됩니다.

$_GLOBALS['user_data'] = get_user_by('login', get_query_var('user_login')); 

그리고 아약스 콜백에서 동일하게 사용 : 그래서 일부 데이터베이스 쿼리를 저장하는 명백한 아이디어는 아래와 같이 전역 변수에 데이터를 전달하는 것입니다.

응용 프로그램, AJAX하거나 수신하는 각 요청은 고립에서 완전히 살고 : (무엇이든하는 것은 데이터베이스에 유지됩니다 이외의) 요청을 처리하는 코드가 그들 사이의 상태를 공유하지 않습니다. 하나의 요청에서 정의하는 전역 (또는 상수, 속성 또는 변수 등)은 어딘가에 저장하지 않으면 후속 요청에서 사용할 수 없습니다.

이러한 요청이 생성하는 쿼리 수를 줄이는 데는 여러 가지 방법이 있습니다. 하나는 페이지로드시 필요한 사용자 데이터를 검색하여 후속 요청에 전달하는 것입니다. 예컨대 :

또는
var user = 'someUser'; 

$.get('user-data.php?user=' + user, function(user_data) { 
    $.ajax('some-endpoint.php', { 
      type: 'POST', 
      data: { user: user_data }, 
      success: function() { /* ... */ } 
    }); 
    $.ajax('some-other-endpoint.php', { 
      type: 'POST', 
      data: { user: user_data }, 
      success: function() { /* ... */ } 
    }); 
}); 

, 그것은 현재 나중에 사용하기 위해 초기 페이지로드에 자바 스크립트 객체에 자신의 세부 사항을 기록 할 수 있습니다 당신과 함께 작업하고 로그인 한 사용자의 경우.

var userData = <?php get_currentuserinfo(); echo json_encode($current_user); ?>; 

또 다른 옵션은 워드 프레스, MySQL의 또는 다른 캐싱 계층에 의해 하나의 get_user_by 결과가 캐시되는되었는지 확인하는 것입니다. 그런 식으로 코드가 메서드를 몇 번이나 호출하는지는 중요하지 않습니다.

일반적으로 엔드 포인트가 많은 경우 기능을 공유하는 경우 리팩터링에 해당하는 코드가있을 수 있습니다.

+0

설명해 주셔서 감사합니다. Javascript 객체에 사용자 데이터를 작성하고 나중에 가져 오는 아이디어를 좋아합니다. 이것이 보안 위협을 초래하는지 여부를 알고 싶습니까? 둘째, 우리는 일시적인 API 또는 뭔가 다른 것을 사용하여 Wordpress cache get_user_by 결과를 가질 수 있습니까? – John

+0

어떤 의미에서 보안 위협이 있습니까? 어떤 방식 으로든 데이터를 가져 오는 중입니다. 초기 페이지로드시 렌더링할지 AJAX 요청에 대한 응답으로 전달할지에 따라 약간의 차이가 있습니다. Transients API를 사용하여 쿼리 결과를 캐시 할 수는 있지만 쿼리가 "비용이 많이 드는 경우에만 수행 할 수 있습니다. 과도기는 여전히 데이터베이스에 저장되므로 쿼리를 검색하기 위해 계속 쿼리가 수행됩니다. – cantlin

+0

정말 도움이되었습니다. Javascript 객체로 사용자 데이터를 전달하겠습니다. – John

관련 문제