W3 total cache - программное обновление кэша
Я разрабатываю сайт в стиле Digg на WordPress.
После установки W3 Total Cache я заметил, что определенные элементы, такие как количество голосов (и ID проголосовавших) за публикацию, кэшируются, хотя этого не должно происходить (по крайней мере, после того как пользователь голосует за статью). Я предполагаю, что невозможно предотвратить кэширование определенных элементов на странице (или это возможно?), поэтому я подумал о программном запуске обновления кэша страницы.
Есть ли какие-либо предложения?

Если вам нужно очистить кеш, вы можете сделать это: в плагине есть функции для этого:
<?php
flush_pgcache() //кеш страниц
flush_dbcache() //кеш базы данных
flush_minify() //кеш минификации
flush_all() //весь кеш
?>
И вам просто нужно вызвать это следующим образом:
<?php
$w3_plugin_totalcache->flush_all();
?>
И это, по сути, ответ на вопрос в заголовке "как программно обновить кеш"

Можете, пожалуйста, явно указать, как вы создали экземпляр объекта $w3_plugin_totalcache?

создайте новый экземпляр класса и затем обратитесь к этому методу. https://plugins.trac.wordpress.org/browser/w3-total-cache/trunk/CacheFlush.php. if(class_exists('CacheFlush') ){ $CacheFlush = new CacheFlush; $CacheFlush::flush_post(get_option('page_on_front')); }

Куда следует поместить этот код? Похоже, он выполняется при каждой загрузке страницы (для этого ID). Нет ли способа полностью отключить кеширование?

@s_ha_dum Не могли бы вы уточнить, с каким хуком мы можем использовать этот код?

Дополнительные хуки не требуются, если событие, к которому привязывается ваш пользовательский код/плагин, выполняется после загрузки плагинов, что обычно и происходит. Все доступные функции находятся в файле w3-total-cache-api.php
в директории плагина W3TC.

Спасибо, это было полезно для меня сейчас в декабре 2018 года. Мне нужен был способ очистить кеш главной страницы, когда клиент посещал определенную страницу (страницу настроек для отображения доступности агента). Это очень полезно для конкретных страниц, но было бы здорово, если бы существовала функция, которая очищает ВЕСЬ кеш, как это делает "Purge All Caches"!

Решение от Bainternet мне не подошло.
Я успешно использую этот альтернативный сниппет в плагине, загружаемом на действии admin_init:
// Очистить весь W3 Total Cache
if( class_exists('W3_Plugin_TotalCacheAdmin') )
{
$plugin_totalcacheadmin = & w3_instance('W3_Plugin_TotalCacheAdmin');
$plugin_totalcacheadmin->flush_all();
echo __('<div class="updated"><p>Все кеши <strong>W3 Total Cache</strong> успешно очищены.</p></div>');
}
Надеюсь, это кому-то поможет.

Я могу подтвердить, что решение kevinlearynet работает с W3 Total Cache версии 0.9.2.4. После этого обновления оно перестало работать для моего плагина, но это решение отлично помогло. Спасибо! Пол.

W3 Total Cache поддерживает фрагментарное кеширование. Из FAQ:
Как реализовать фрагментарное кеширование?
Отредактируйте свои шаблоны, используя следующий синтаксис, чтобы динамические элементы оставались таковыми:
Пример 1:
<!-- mfunc любой PHP-код --><!-- /mfunc -->
Пример 2:
<!-- mfunc -->любой PHP-код<!-- /mfunc -->
Пример 3:
<!--MFUNC -->
echo rand();
<!--/mfunc -->
Пример 4:
<!-- mclude путь/к/файлу.php --><!-- /mclude -->
Пример 5:
<!-- mclude -->путь/к/файлу.php<!-- /mclude -->

Спасибо, Rast. Но когда я использую любой из приведённых примеров, получаю ошибку Parse error: syntax error, unexpected '<'

@user1567 вероятно у вас несоответствие открывающих/закрывающих тегов <?php ?>
. Я ещё не использовал их, поэтому не могу показать рабочий пример.

Во-первых, я хотел бы загружать functions.php без кэширования. Следующий код в functions.php вызвал ошибку выше: <?php <!-- mclude -->require_once(functions2.php)<!-- /mclude --> ?> Что не так с этим кодом?

@user1567 согласно примерам это должно выглядеть примерно так ?><!-- mclude -->functions2.php<!-- /mclude --><?php
(я думаю :)

Не получается заставить работать фрагментарное кэширование. Моя проблема описана здесь: http://stackoverflow.com/questions/31125413/w3-total-cache-and-fragment-cache-not-able-get-it-to-work

Ни один из вышеперечисленных способов не сработал в моем плагине. Однако этот вариант работает! Подтверждена работоспособность для версии 0.9.2.4 w3tc.
if (function_exists('w3tc_dbcache_flush')) { w3tc_dbcache_flush(); }
Я выполнил запрос:
$wpdb->get_results( "SELECT `sb_settings`.`f_fb_app_id`,`sb_settings`.`f_fb_secret` FROM `sb_settings`" );
и с удивлением обнаружил, что значения f_fb_secret и f_fb_app_id были одинаковыми каждый раз. Очевидно, w3tc кэшировал результат запроса. Поэтому я добавил очистку кэша базы данных на странице изменения таблицы sb_settings.
Если вам нужно очистить кэш страниц, просто используйте w3tc_pgcache_flush вместо этого.

Хотелось бы, чтобы тот, кто поставил минус, объяснил, почему он это сделал. Есть ли что-то неверное в моем ответе?

Используйте этот сниппет, чтобы ваш PHP-код выполнялся независимо от того, включено кеширование или нет. Да, вам придётся написать/вызвать вашу функцию дважды.
<!-- mfunc echo 'кеширование ВКЛ'; --><?php echo 'кеширование ВЫКЛ'; ?><!-- /mfunc -->
(Я думаю) вот как это работает:
- Условные выражения mfunc заменяют php-теги.
- Если кеширование ВЫКЛЮЧЕНО, php-код внутри комментариев mfunc отображается в вашей разметке как HTML-комментарии.
<!-- mfunc echo "привет?"; -->
Учтите это в зависимости от того, насколько вы готовы показывать свой PHP-код людям (происходит только при отключённом кешировании).
