使用Wordpress Super Cache从缓存中排除动态值

时间:2018-07-13 09:48:07

标签: php jquery ajax wordpress woocommerce

我正在使用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>';
}

这是在创建的自定义页面上使用的简码。此简短代码输出的数据必须不落入页面缓存中。

2 个答案:

答案 0 :(得分:2)

改编自this old WSE thread,您将在下面找到使它运行的完整方法。

在这里,我们显示一个微调器加载图标enter image description here,它将通过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">&nbsp;</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