2013-10-28 2 views
1

Я просто использую w3 общий кэш плагин для ускорения моего сайта. Он отлично работает во многих отношениях, таких как кеширование страниц, кэширование db, кэширование объектов, js & css minification, а также сокращает время, затрачиваемое на FBR (первый байтовый запрос).Является ли W3 Total cache совместимым с формой контакта 7?

Но когда я проверка PageSpeed ​​тест в tools.pingdom.com, это показывает некоторые нежелательные URL (www.mydomain.com/?_wpcf7_is_ajax_call=1 & _wpcf7 = 63) занимает много времени, чтобы выполнить запрос, который влияет представление.

После деактивации плагина w3 cache, который нежелательный URL-адрес исчез. Я знаю причину этой проблемы. Из-за использования плагина contactform7 с вызовом ajax. Но нужно w3 totalcache устранить кэширование contactform7



параметры изменились:
w3 кэш страниц TAB-> расширенный настройки-> никогда не кэшировать следующие страницы:

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

, но не использовать. Любая помощь!!!

ответ

6

W3TotalCache устанавливает «WP_Cache» постоянная истина, добавляя это WP- config.php:

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

Когда WP_Cache установлена ​​истина, Contact Form 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 добавляет встроенный JavaScript с wp_localize_script, который выглядит следующим образом, когда WP_CACHE установлено:

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

Когда WP_CACHE не установлен, это свойство «кэшировать» уезжает из. Это происходит в функции wpcf7_enqueue_scripts() в контроллере.php

Код, который я предоставил вызовам wp_localize_script сразу после запуска wpcf7_enqueue_scripts(). Это фактически вставляет один и тот же встроенный код, но без свойства «кэширования», чуть ниже встроенного кода, созданного контактной формой 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 делает это всегда так. Сброс - единственный вариант, который работает. Недостатком этого подхода является то, когда наступает время, вам действительно нужна эта функциональность снова, тогда вам нужно отредактировать его снова. –

Смежные вопросы