条件窗口小部件_表单_回调

时间:2013-08-25 作者:manc

我试图开发一种方法,仅当小部件存在于特定的侧栏中时,才在小部件中设置某些内容。下面的代码查找名为“footer”的侧栏,并在小部件的默认选项上方显示选择选项。

然而,当我将一个新的小部件拖动到侧栏中时,它不会出现。当我按save时,该选项会出现在我必须选择该选项并再次单击save的位置。我缺少什么来确保它在拖到提要栏后立即加载?

function mytheme_colspan_widget_extend( $instance, $widget ) {
    if ( !isset($instance[\'colspan\']) )
    $instance[\'colspan\'] = 3; // set a default if none is set
    foreach ( wp_get_sidebars_widgets() as $sidebar => $widgets ) {
       if (\'footer\' == $sidebar && in_array( $widget->id, $widgets )) {
        echo "<p>\\n";
        echo "\\t<label for=\'widget-{$widget->id_base}-{$widget->number}-colspan\'>Column Span:</label> \\n";
        ?>
        <select name="widget-<?php echo $widget->id_base.\'[\'.$widget->number.\'][colspan]\'; ?>" id="widget-<?php echo $widget->id_base.\'-\'.$widget->number; ?>-colspan">
        <option>Select:</option>
        <option<?php if ($instance[\'colspan\']==\'1\') {echo \' selected\';} ?> value="1">1</option>
        <option<?php if ($instance[\'colspan\']==\'2\') {echo \' selected\';} ?> value="2">2</option>
        <option<?php if ($instance[\'colspan\']==\'3\') {echo \' selected\';} ?> value="3">3</option>
        <option<?php if ($instance[\'colspan\']==\'4\') {echo \' selected\';} ?> value="4">4</option>
        <option<?php if ($instance[\'colspan\']==\'5\') {echo \' selected\';} ?> value="5">5</option>
        <option<?php if ($instance[\'colspan\']==\'6\') {echo \' selected\';} ?> value="6">6</option>
        <option<?php if ($instance[\'colspan\']==\'7\') {echo \' selected\';} ?> value="7">7</option>
        <option<?php if ($instance[\'colspan\']==\'8\') {echo \' selected\';} ?> value="8">8</option>
        <option<?php if ($instance[\'colspan\']==\'9\') {echo \' selected\';} ?> value="9">9</option>
        <option<?php if ($instance[\'colspan\']==\'10\') {echo \' selected\';} ?> value="10">10</option>
        <option<?php if ($instance[\'colspan\']==\'11\') {echo \' selected\';} ?> value="11">11</option>
        <option<?php if ($instance[\'colspan\']==\'12\') {echo \' selected\';} ?> value="12">12</option>
        </select>
        <?php
        echo "</p>\\n";
       }
    }
    return $instance;
}
add_filter(\'widget_form_callback\', \'mytheme_colspan_widget_extend\', 10, 2);


function mytheme_colspan_widget_update( $instance, $new_instance ) {
    $instance[\'colspan\'] = $new_instance[\'colspan\'];
    return $instance;
}
add_filter( \'widget_update_callback\', \'mytheme_colspan_widget_update\', 10, 2 );

1 个回复
SO网友:J.D.

您需要使用wp_get_sidebars_widgets(), 然后检查当前小部件是否位于\'footer\' 侧栏:

$sidebars = wp_get_sidebars_widgets();

 if ( in_array( $widget->id, $sidebars[\'footer\'] ) ) {

      /* Display form fields here */
 }
更新:对此有一个警告,您已经发现了。在将新小部件分配给侧栏之前,将输出小部件表单,并且在保存小部件设置之前不会重新加载小部件表单。如果希望所有设置立即可用,则必须使用CSS或JavaScript解决此问题。我认为CSS将是最好的方式,如果你的页脚侧边栏总是有相同的数字ID(如果侧边栏的数量不是动态的,这应该是真的-虽然人们可以添加额外的自定义侧边栏,我想)。

基本上,如果小部件没有连接到任何侧栏,则输出表单输入,并使用CSS将其隐藏,除非将其移动到正确的侧栏。

您可以这样执行检查:

if ( \'__i__\' == $widget->number ) { 

    /* This widget isn\'t hooked to a sidebar yet. */ 
}
因此,您的完整支票如下所示:

$sidebars = wp_get_sidebars_widgets();

if ( \'__i__\' == $widget->number || in_array( $widget->id, $sidebars[\'footer\'] ) ) {

     /* Display form fields here */
}
CSS示例,假设页脚侧边栏始终为数字3:

<style type="text/css">
.show-if-sidebar-3 {
       display: none;
}

#sidebar-3 .show-if-sidebar-3 {
      display: block;
}
</style>
例如,您可以将这些样式添加到管理样式表中,然后添加show-if-sidebar-3 类设置为段落标记,将额外字段封装在该标记中,如下所示:<p class="show-if-sidebar-3">

我真的想不出其他替代方法,除非您想尝试使用JavaScript来检测何时将这种特定类型的小部件添加到特定的侧栏中,并立即重新加载表单。但这要复杂得多。

结束

相关推荐

If has $title in widgets

我正在写一个小部件来显示125 x 125像素的广告。广告有6个空间,目前所有作品都有。然而,我想添加一些条件逻辑,这样,如果在一个广告的小部件管理中的值中没有输入任何内容,那么就不会显示add。我想这可以通过使用PHP if或其他什么东西来实现,我不记得它到底是什么。我需要它和<?php & ?> 标签打开。需要检查一下$adone 存在,如果不存在,则显示空白。我知道这里的代码是错误的,但类似这样的代码:<?php if_has($adone_img) ?>