向动态侧边栏添加类

时间:2016-05-06 作者:Carl Sergile

嘿,我正在尝试创建这个条件,当添加和删除小部件/侧栏时,它会自动创建一个网格布局。目标是让用户尽可能多地放入小部件,而不必担心布局。这是我的代码,如果你想让我进一步解释自己,请告诉我:

if (function_exists(\'create_widget\') && dynamic_sidebar(\'sidebar-1\') && dynamic_sidebar(\'sidebar-2\') && dynamic_sidebar(\'sidebar-3\') ) {
            $layout_classes = "col-md-4";
    }       elseif ( is_active_sidebar( \'sidebar-1\' ) && is_active_sidebar( \'sidebar-2\' ) ) {
                $layout_classes = "col-md-6";
    } else {
            $layout_classes = "col-md-2";
    }

<div class="row"
    <div class="container">
        <div class="col-md-12">
        <div class="<?php echo $layout_classes ?>">

                                <?php dynamic_sidebar( \'sidebar-1\'); ?>

                                    <?php dynamic_sidebar( \'sidebar-2\'); ?>

                                        <?php dynamic_sidebar( \'sidebar-3\'); ?>

</div>
</div>
</div>
</div><!--End Layout Class-->
P.S.使用Bootstrap 3。

3 个回复
SO网友:TheDeadMedic

你还没有说问题出在哪里。但我可以先看到一个-dynamic_sidebar 在您的if 条件将立即响应窗口小部件。如果要检查侧栏是否有小部件,请使用is_active_sidebar:

is_active_sidebar( \'sidebar-1\' ); // True/false

SO网友:MikeiLL

有一个答案here, 但它依赖于wp_get_sidebars_widgets, 这是贬值的,也是私有的。

This code 看起来是一个更好、更强健的解决方案:

其实很简单。我用它为我的小部件添加类PureCSS 框架

在本例中,我们希望外部容器具有类pure-g 对于“网格”。以及要具有pure-u-1-*, 其中,星号是列的总数,在本例中为小部件计数。

因此,注册侧栏:

register_sidebar([
    \'name\'          => __(\'Footer Widget Area\', \'pure-demo\'),
    \'id\'            => \'sidebar-footer\',
    \'class\'            => \'pure-g\',
    // Next line has our callback
    \'before_widget\'  => \'<section class="widget %2$s \'. slbd_count_widgets( \'sidebar-footer\' ) .\'">\',
    \'after_widget\'  => \'</section>\',
    \'before_title\'  => \'<h3>\',
    \'after_title\'   => \'</h3>\'
]);
下面是我们的回调函数:

 function slbd_count_widgets( $sidebar_id ) {
  // If loading from front page, consult $_wp_sidebars_widgets rather than options
  // to see if wp_convert_widget_settings() has made manipulations in memory.
  global $_wp_sidebars_widgets;
  if ( empty( $_wp_sidebars_widgets ) ) :
    $_wp_sidebars_widgets = get_option( \'sidebars_widgets\', array() );
  endif;

  $sidebars_widgets_count = $_wp_sidebars_widgets;

  if ( isset( $sidebars_widgets_count[ $sidebar_id ] ) ) :
    $widget_count = count( $sidebars_widgets_count[ $sidebar_id ] );
    $widget_classes = \'\';
    $widget_classes .= \'pure-u-1 pure-u-sm-1-1\';
    $widget_classes .= \' pure-u-md-1-\' . ceil($widget_count / 2);
    $widget_classes .= \' pure-u-lg-1-\' . $widget_count;
    return $widget_classes;
  endif;
}
然后我显示如下:

<footer class="content-info pure-g">
  <?php if ( is_active_sidebar( \'sidebar-footer\' ) ) : ?>
      <?php dynamic_sidebar( \'sidebar-footer\' ); ?>
  <?php endif; ?>
  <div id="colophon" class="site-footer" role="contentinfo">
  <?php
    if ( has_nav_menu( \'footer_links\' ) ) :
       wp_nav_menu([\'theme_location\' => \'footer_links\', \'container_class\' => \'pure-menu\', \'menu_class\' => \'pure-menu-list\']);
    endif;
  ?>
  </div>
</footer>

SO网友:Lucas Bustamante

这是向Widgets文本字段添加自定义类的示例:

add_filter( \'dynamic_sidebar_params\', [ new Sidebar_Filterer, \'filter\' ], 10, 1 );

class Sidebar_Filterer {

    /**
     * @filter dynamic_sidebar_params 10 1
     *
     * @param $param
     *
     * @return mixed
     */
    public function filter( $params ) {
        if ( ! is_array( $params ) || empty( $params ) ) {
            return $params;
        }

        foreach ( $params as &$param ) {
            if ( is_array( $param ) ) {
                $param = $this->filter_text_widget( $param );
            }
        }

        return $params;
    }

    private function filter_text_widget( array $param ): array {
        if ( ! array_key_exists( \'widget_name\', $param ) ) {
            return $param;
        }

        if ( $param[\'widget_name\'] != \'Text\' ) {
            return $param;
        }

        if ( ! array_key_exists( \'before_widget\', $param ) ) {
            return $param;
        }

        if ( strpos( $param[\'before_widget\'], \'widget_text\' ) === false ) {
            return $param;
        }

        $param[\'before_widget\'] = str_replace( \'widget_text\', \'widget_text some-other-class\', $param[\'before_widget\'] );

        return $param;
    }
}

相关推荐

My widgets do not save

每次我保存我的小部件并离开页面时,我的小部件都会消失。侧边栏已完全清空,不会保存任何更改。控制台或PHP日志中没有任何错误。如果我将小部件直接复制并保存在数据库中widgets_text, 它们将被显示,但我仍然无法在侧边栏中添加或删除任何内容。这只发生在我的右侧边栏上,左侧边栏工作正常,但它们都以相同的方式注册。这是我注册侧边栏的方式:function my_widgets_init() { register_sidebar( array ( \'name\'