2012-03-29 17 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回調。這是問題。 Ajax回調函數都沒有看到全局的$ user_data變量。在你問之前,是的,我已經宣佈全球內部回調。

所以,顯而易見的答案是:爲什麼不使用wp_localize_script並通過JavaScript傳遞$ USER_DATA到Ajax回調像波紋管:

在PHP:

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

在Javascript中:

 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); 
     } 
    }); 

但是,這提出了兩個問題:

可以o get_user_by('login', get_query_var('user_login'));退貨由wp_localize_script()負責處理?

如果上述問題的答案是肯定的,那麼它會不會構成安全威脅,因爲該對象將包含敏感的用戶信息?

爲了克服Ajax回調無法使用的全局變量,我直接在functions.php中聲明瞭它(沒有將它包裝在函數中)。但是,get_query_var('user_login')直接在functions.php中使用時不會返回任何數據,這使得這個無用的練習(您必須將其添加到函數中並通過操作調用它)。

因此,問題依然存在:我如何停止爲每個Ajax請求調用$user_data = get_user_by('login', get_query_var('user_login'));調用?或者有什麼辦法可以讓get_query_var('user_login')直接在functions.php中工作(沒有將其封裝在函數中)或解決方法?

或者,也許一些全新的開箱即用思想?

回答

2

所有這些Ajax請求都會導致針對同一個 數據的多個數據庫查詢。所以顯而易見的想法,以節省一些數據庫查詢是對 數據傳遞到一個全局變量,象下面這樣:

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

然後使用相同的AJAX回調。

的每個應用程序接收,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() { /* ... */ } 
    }); 
}); 

或者,如果它是當前登錄的用戶你與你合作以後可以寫上使用的初始頁面加載他們的詳細資料爲JavaScript對象。

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

另一種選擇是,以確保get_user_by結果被緩存,或者由WordPress,MySQL或一些其它高速緩存層。這樣,代碼調用方法的次數並不重要。

一般情況下,如果您的許多端點正在共享功能,您可能需要重構某些代碼。

+0

感謝您解釋這一點。我喜歡將用戶數據寫入Javascript對象並稍後檢索它的想法。只是想知道這是否構成任何安全威脅?其次,我們可以使用諸如Transients API之類的東西來獲得Wordpress緩存的get_user_by結果嗎? – John 2012-03-30 12:35:45

+0

安全威脅在哪些方面?無論如何,你都在檢索這些數據:無論你是在初始頁面加載還是傳遞它,因爲對AJAX請求的響應幾乎沒有什麼區別。你當然可以使用Transients API來緩存查詢結果,但是如果查詢是「昂貴的」,這可能是值得的。瞬變仍然存儲在數據庫中,因此仍然會執行查詢來檢索它們。 – cantlin 2012-03-30 12:50:40

+0

這真的很有幫助。我想我會將用戶數據作爲Javascript對象傳遞 – John 2012-03-30 16:51:34