我正在使用Super Cache插件。
一段时间以来,我一直在寻找解决方案,但没有成功。我需要为文件functions.php
中的一个功能禁用缓存。
add_shortcode('custom_counter', 'example_shortcode');
function example_shortcode() {
// Get custom counter option value
$counter = get_option( 'wc-custom-counter' );
return '<span class="custom-counter">' . $counter . ' rub.</span>';
}
这是在创建的自定义页面上使用的简码。此简短代码输出的数据必须不落入页面缓存中。
答案 0 :(得分:2)
改编自this old WSE thread,您将在下面找到使它运行的完整方法。
在这里,我们显示一个微调器加载图标,它将通过ajax替换为计数器实际非缓存值。即使在缓存的页面中,Javascript始终保持活动状态,因此它可以通过Ajax或任何检测到的事件来更改页面上所需的任何内容。因此,无需在插件设置中排除任何内容。
替换代码:
// The shortcode
add_shortcode('custom_counter', 'customer_counter_shortcode');
function customer_counter_shortcode() {
// Start buffering
ob_start();
// Using woocommerce existing animated spinner gif icon
$loading_url = home_url( '/wp-content/plugins/woocommerce/assets/images/select2-spinner.gif' );
// Displaying a "Loading spinner icon + text to be replaced by Ajax value
echo '<span class="custom-counter">
<img id="loading-img" src="'.$loading_url.'" alt="Loading..." style="opacity:0.5; display:inline-block; vertical-align: middle;" />
<span style="opacity:0.5;"> ' . _("loading…") . '</span>
</span>';
?>
<script type="text/javascript">
jQuery( function($){
if (typeof woocommerce_params === 'undefined')
return false;
$.ajax({
type: 'POST',
url: woocommerce_params.ajax_url,
data: {
'action': 'custom_counter',
'custom-counter': true,
},
success: function (result) {
$('.custom-counter').text(result);
console.log('response: '+result); // just for testing | TO BE REMOVED
},
error: function(error){
console.log(error); // just for testing | TO BE REMOVED
}
});
});
</script>
<?php
return ob_get_clean(); // Return the buffered code
}
// The wordpress ajax hooked function (for logged in and non logged users)
add_action('wp_ajax_custom_counter', 'ajax_custom_counter');
add_action('wp_ajax_nopriv_custom_counter', 'ajax_custom_counter');
function ajax_custom_counter() {
if( isset($_POST['custom-counter']) && $_POST['custom-counter'] )
echo get_option( 'wc-custom-counter' ); // Get option value
exit();
}
代码进入您的活动子主题(或活动主题)的function.php文件中。测试和工作。
答案 1 :(得分:1)
您不能从缓存插件中排除功能。相反,您可以排除URL(在WP Super Cache中,转到“设置> WP Super Cache>高级”-“接受的文件名和拒绝的URI”部分)。
因此,请使用AJAX而不是直接调用来调用此函数,并且可以排除AJAX URL。
这是完整的代码。
将这些添加到主题的 functions.php :
add_action('wp_ajax_customer_counter', 'customer_counter_ajax_handler'); // wp_ajax_{action}
add_action('wp_ajax_nopriv_customer_counter', 'customer_counter_ajax_handler'); // wp_ajax_nopriv_{action}
function customer_counter_ajax_handler() {
// Get custom counter option value
$counter = get_option( 'wc-custom-counter' );
echo $counter . ' rub.';
}
将所有简码[custom_counter]
实例替换为<span class="customer_counter_shortcode"> </span>
。
将此脚本添加到主题的 footer.php :
jQuery(function($){
$.ajax({
url : '<?php echo site_url(); ?>/wp-admin/admin-ajax.php', // AJAX handler
data : { action : 'customer_counter' },
type : 'POST',
success : function( $result ){
if( $result ) {
$('.customer_counter_shortcode').html($result);
}
}
});
});
然后您可以排除AJAX URL- /wp-admin/admin-ajax.php?action=customer_counter 。