Are WordPress widgets cached?

时间:2015-11-25 作者:Benito Lopez

我不确定这是不是真的,但小部件的内容似乎是缓存的。我最初认为我的代码有问题(我需要根据会话值在自定义小部件中隐藏/显示一个部分),但我对所有小部件和get\\u option()都有同样的问题。

我做了这个测试。

在“A”页中,我更新了一个选项:

update_option( \'custom_check\', \'a\' );
在“B”页中,我用不同的值更新相同的选项:

update_option( \'custom_check\', \'b\' );
当我从页面“A”转到“B”(或反之)时,数据库中的选项会正确更新。并在页面中正确打印值,包括:

echo get_option( \'custom_check\' );
但是如果我在一个小部件中打印该值(我尝试过使用不同的小部件,包括默认文本和最近发布的小部件),则该值不会更新。直到刷新页面。

示例:我在“A”页上,因此值为“A”。当我访问页面“B”时,数据库中的值为“B”,并在页面内容中正确打印。但小部件显示旧值(“a”)。当我刷新页面时,小部件显示正确的值(“b”)。

有什么想法吗?

[Edit] 我会尽力更好地解释我的意思。

我用的是214,不是自定义主题。在侧边栏中,我有一个带有“A”和“B”页的菜单,这样我只需单击一下即可访问这些页面(@s\\u ha\\u dum♦ 不涉及AJAX)。以及WordPress中包含的默认文本小部件。

在里面page.php (214)我在顶部有以下代码:

<?php
if ( is_page( 749 ) ) {
    update_option( \'custom_check\', \'a\' );
} elseif ( is_page( 800 ) ) {
    update_option( \'custom_check\', \'b\' );
}

echo get_option( \'custom_check\' );
?>
749和800是页面“A”和“B”的ID。

为了测试小部件中的变量,我在/wp-includes/default-widgets.php (我知道这是一种不好的做法,我只是在测试),在WP\\u Widget\\u Text类中:

echo get_option( \'custom_check\' );
问题:我在“A”页上,“custom\\u check”等于“A”,小部件显示“A”。当我单击菜单上的页面“B”链接时,“custom\\u check”等于db中的“B”,并正确打印在页面顶部。但在文本小部件中,我仍然看到“a”。如果刷新页面,小部件将显示正确的值。

这是缓存问题吗?或者是选项更新太晚了(在widget\\u init之后)?

1 个回复
SO网友:Benito Lopez

好的,看来问题与缓存无关。而是行动执行令。如果我更新页面模板内的值(或短代码内的值,这就是我开始测试的原因),则在呈现小部件后会触发更新。

解决方案:更新操作中的值。在本例中,您可以使用\'wp\' 措施:

function test() {
    if ( is_page( 749 ) ) {
        update_option( \'custom_check\', \'a\' );
    } elseif ( is_page( 800 ) ) {
        update_option( \'custom_check\', \'b\' );
    }
}

add_action( \'wp\', \'test\' );

相关推荐

无法在模板函数.php中使用IS_HOME

我试图在标题中加载一个滑块,但只在主页上加载。如果有帮助的话,我正在使用Ultralight模板。我正在尝试(在template functions.php中)执行以下操作:<?php if ( is_page( \'home\' ) ) : ?> dynamic_sidebar( \'Homepage Widget\' ); <?php endif; ?> 但这行不通。现在,通过快速的google,我似乎需要将请