WordPress定制器选择性刷新:仅在第一次更改设置时起作用

时间:2018-04-12 作者:Akil

我在WP Customizer中创建了一个新控件(复选框)。其工作方式如下:选中复选框时,相应的部分应显示上次发布的帖子(true),或选中复选框时,显示自定义背景图像(和某些内容)(false)。

第一次设置更改时一切正常。假设页面加载时未选中输入-该部分将显示自定义背景图像。如果选中该复选框,则部分将刷新,并显示最后一篇文章。在这里之前一切都很好。

但如果我取消选中该复选框(作为对同一控件的第二个操作),则什么都不会发生。下次检查/取消检查时仍然没有任何内容。

我没有任何与此控件相关的JS(我还删除了所有自定义JS,问题仍然存在)。

customizer.php

$wp_customize->add_setting( \'latest_post\', 
                            array(
                                \'default\'    => "", 
                                \'type\'       => \'theme_mod\',
                                \'capability\' => \'edit_theme_options\',
                                \'transport\'   => \'postMessage\',
                            ) 
                        );
$wp_customize->add_control(\'latest_post\', 
                            array(
                                \'label\'    => __( \'Header Content\', \'mytheme\' ),
                                \'section\'  => \'header_section\',
                                \'settings\' => \'latest_post\',
                                \'type\'     => \'checkbox\'
                            )
                        );      
$wp_customize->selective_refresh->add_partial( \'latest_post\', array(
                            \'selector\'        => \'.header-section\',
                            \'render_callback\' => \'header_markup\'
                        ) );



function header_markup(){
  $latest_post = get_theme_mod(\'latest_post\');

  switch($latest_post):
     case true:
        return "latest post";
     case false:
        return "custom media";
     default:
        return "custom media";
  endswitch;

}

html

<div class="header-section">
   <php echo header_markup(); ?>
</div>

4 个回复
SO网友:Joy Reynolds

检查从复选框返回的实际值,使用var_dump(). 看起来不匹配truefalse, 但总是遇到违约情况。即使您的默认值“”也不是truefalse.

SO网友:Weston Ruter

我认为问题是,您的设置被保存为字符串而不是布尔值。您需要提供sanitize_callback 注册设置以确保将其保存为设置时。

我认为这应该做到:

$wp_customize->add_setting( \'latest_post\',
    array(
        \'default\'           => false,
        \'type\'              => \'theme_mod\',
        \'capability\'        => \'edit_theme_options\',
        \'transport\'         => \'postMessage\',
        \'sanitize_callback\' => \'wp_validate_boolean\', // 
    )
);

SO网友:Roman

这是因为add\\u partial方法和preview js文件中的选择器不匹配!

enter image description here

enter image description here

SO网友:nishal

将其添加到selective\\u refresh数组:

\'container_inclusive\' => true,
这对我有帮助。

这篇文章是很久以前写的。。但你永远不知道其他人是否也会遇到同样的问题。

结束

相关推荐