2013-10-28 39 views
1

我只是使用W3總緩存插件來加快我的網站。它在很多方面都有很好的效果,例如頁面緩存,數據庫緩存,對象緩存,CSS縮小以及減少FBR(第一個字節請求)所花費的時間。W3總緩存是否與聯繫表格7兼容?

但是,當我檢查的PageSpeed在tools.pingdom.com測試,它顯示了一些不需要的URL(www.mydomain.com/?_wpcf7_is_ajax_call=1 & _wpcf7 = 63)取大量的時間來完成這影響了請求表現。

在w3緩存插件停用後,不需要的url就消失了。我知道這個問題的原因 - 因爲使用帶有Ajax調用的contactform7插件。但它需要W3 totalcache消除緩存contactform7



設置更改:
W3頁緩存標籤 - >高級設置 - >從不緩存以下頁面:

  1. /。 []。
  2. /?_ wpcf7_is_ajax_call = 1 & _wpcf7 = 63/

但沒有用。任何幫助!

回答

6

W3TotalCache設置「WP_CACHE」不斷爲真config.php:

/** Enable W3 Total Cache */ 
define('WP_CACHE', true); // Added by W3 Total Cache 

當WP_Cache設置爲true時,聯繫表單7將進行您描述的Ajax調用。

這發生在的script.js:

if (_wpcf7.cached) 
    this.wpcf7OnloadRefill(); 

看來這個功能真的只需要,當您使用的驗證碼或測驗,如在此間指出,https://wordpress.org/support/topic/plugin-contact-form-7-wpcf7onloadrefill-not-useful-and-causing-load

爲了避免Ajax調用,你可以把下面的代碼到functions.php:

// Hack Contact Form 7 to avoid unwanted ajax calls 
// see http://stackoverflow.com/questions/19632244/is-w3-total-cache-compatible-with-contact-form-7 
add_action('wpcf7_enqueue_scripts', 'hack_cf7'); 
function hack_cf7() { 
    $_wpcf7 = array(
     'loaderUrl' => wpcf7_ajax_loader(), 
     'sending' => __('Sending ...', 'contact-form-7') 
    ); 
    wp_localize_script('contact-form-7', '_wpcf7', $_wpcf7); 
} 

說明:

聯繫表格7增加了與wp_localize_script一些內嵌的JavaScript,它看起來像這樣當WP_CACHE設置:

var _wpcf7 = { 
    "loaderUrl":"http:\/\/elsassfonden.dk\/wp-content\/plugins\/contact-form-7\/images\/ajax-loader.gif", 
    "sending":"Sender ...", 
    "cached":"1" 
}; 

當WP_CACHE沒有設置,它的「緩存」屬性闊葉出來。 這發生在controller.php中的函數wpcf7_enqueue_scripts()

我提供的代碼在運行wpcf7_enqueue_scripts()後立即調用wp_localize_script。這實際上插入了相同的內聯代碼,但沒有「緩存」屬性,恰好在聯繫表單7生成的內聯代碼下面。

享受!

+0

這種解決方案不再有效作爲wpcf7_ajax_loader()已經從插件 –

1

您也可以在客戶端禁用這些呼叫,例如,在頁腳:

<script type="text/javascript"> 
    $.fn.wpcf7OnloadRefill=function(){}; 
</script> 

這基本上空白JS函數,重新填寫表單。

3

我剛剛通過rosell.dk嘗試了上述修復程序,但遇到錯誤sayintg函數「wpcf7_ajax_loader()」未找到。

我猜這個插件最近改變了結構,或者其他一些原因。

儘管如此,基於他的解決方案,我做了一些小改動來檢查它是否是正確的句柄,然後取消設置「緩存」鍵。這樣數組中的任何其他鍵都會保留。

class Filterable_Scripts extends WP_Scripts { 
function localize($handle, $object_name, $l10n) { 

    $l10n = apply_filters('script_l10n', $l10n, $handle, $object_name); 
    if ('contact-form-7' === $handle) { 
      unset($l10n['cached']); // This is where we remove the problem. 
     } 
     return parent::localize($handle, $object_name, $l10n); 
    } 
} 

add_action('wp_loaded', function() { 
    $GLOBALS['wp_scripts'] = new Filterable_Scripts; 
}); 

只需放在您的functions.php文件或特定於站點的插件中。

+0

這可能是因爲https://wordpress.stackexchange.com/questions/108362/how-to-intercept-already-localized-scripts 啓發刪除 我遇到這個問題時也找到了。 也值得注意的是,如果您正在根據需要自定義此腳本...設置$ ln10 ['cached'] = 0不起作用。不知何故,它將其解釋爲一個字符串,並且在JavaScript中隱式布爾類型轉換使其始終如此。取消設置是唯一有效的選項。 這個方法的缺點是,當時間到了,你實際上需要再次使用這個功能,那麼你需要再次編輯它。 –