仅将div类添加到一个小部件

时间:2017-02-28 作者:Peronia

我想在div 我的搜索小部件的标记。我的搜索与其他小部件一起位于侧栏中。

我的代码:

function NT_widgets_init() {
register_sidebar( array(
    \'name\'          => __( \'Sidebar\', \'side\' ),
    \'id\'            => \'sidebar\',
    \'description\'   => __( \'Rechte Spalte\', \'rechts\' ),
    \'before_widget\' => \'<div id="%1$s" class="widget %2$s">\',
    \'after_widget\'  => \'</div>\',
    \'before_title\'  => \'<span class="none">\',
    \'after_title\'   => \'</span>\',
) );

}
add_action( \'widgets_init\', \'NT_widgets_init\' );
因此,每个小部件都有一个id 和aclass. 如何只向一个小部件添加更多类,而不向其余小部件添加更多类。

2 个回复
最合适的回答,由SO网友:Nabil Kadimi 整理而成

您有两种可能的解决方案。

1。这个widget_display_callback 过滤器挂钩

This filter hook 参数允许您轻松地以小部件实例为目标并覆盖其参数。

一种可能的方法是:在过滤器回调中,修改该实例的参数,显示它,然后return false 防止WordPress以正常方式再次显示。请参见中的此代码wp-includes/class-wp-widget.php.

2。注册一个扩展搜索小部件的新小部件,您可以扩展搜索小部件—定义于wp-includes/widgets/class-wp-widget-search.php 并覆盖widget() 方法添加所需的类,类似这样的内容(应该在WordPress看到的某个地方添加代码,例如自定义插件或主题中functions.php 文件):

/**
 * Custom widget search
 *
 * Extends the default search widget and adds a class to classes in `before_title`
 *
 * @author  Nabil Kadimi
 * @link    http://wordpress.stackexchange.com/a/258292/17187
 */
class WP_Widget_Search_Custom extends WP_Widget_Search {

    public function __construct() {
        $widget_ops = array(
            \'classname\' => \'widget_search widget_search_custom\',
            \'description\' => __( \'A Custom search form for your site.\' ),
            \'customize_selective_refresh\' => true,
        );
        WP_Widget::__construct( \'search_custom\', _x( \'Custom Search\', \'Custom Search widget\' ), $widget_ops );
    }

    public function widget( $args, $instance ) {

        $custom_class = \'wpse-258279\';
        $args[\'before_widget\'] = str_replace(\'class="\', "class=\\"$custom_class", $args[\'before_widget\']);

        /** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */
        $title = apply_filters( \'widget_title\', empty( $instance[\'title\'] ) ? \'\' : $instance[\'title\'], $instance, $this->id_base );
        echo $args[\'before_widget\'];
        if ( $title ) {
            echo $args[\'before_title\'] . $title . $args[\'after_title\'];
        }
        // Use current theme search form if it exists
        get_search_form();
        echo $args[\'after_widget\'];
    }
}

/**
 * Register the custom search widget
 */
add_action( \'widgets_init\', function() {
    register_widget( \'WP_Widget_Search_Custom\' );
} );

SO网友:Fayaz

选项1:使用已经提供的CSS类:

每个小部件都已经提供了唯一的idclass 在CSS规则中使用。因此,对于大多数样式需求,最好使用这些来生成只适用于该小部件的特定CSS规则(例如搜索)。例如,默认的搜索小部件将具有CSS类widget_search. 您可以使用它来设置搜索小部件与其他小部件不同的样式。例如:

.widget {
    background-color: wheat;
}
.widget.widget_search {
    background-color: gold;
}
选项2:使用dynamic_sidebar_params 过滤器:因为您正在将小部件注册到register_sidebar() 函数,很可能您已将其用于dynamic_sidebar() 模板中的函数。在这种情况下,您可以使用dynamic_sidebar_params 过滤钩子以仅向特定小部件插入额外的CSS类。

在主题中使用以下代码functions.php 文件(代码中有其他说明):

add_filter( \'dynamic_sidebar_params\', \'wpse258279_filter_widget\' );
function wpse258279_filter_widget( $params ) {
    // avoiding admin panel
    if( ! is_admin() ) {
        if ( is_array( $params ) && is_array( $params[0] ) && $params[0][\'widget_name\'] === \'Search\' ) {
            // Insert your custom CSS class (one or more) in the following array
            $classes = array( \'custom-css-class-for-search\' );

            // The following three lines will add $classes
            // (along with the existing CSS classes) using regular expression
            // don\'t touch it if you don\'t know RegEx
            $pattern = \'/class\\s*=\\s*(["\\\'])(?:\\s*((?!\\1).*?)\\s*)?\\1/i\';
            $replace = \'class=$1$2 \' . implode( \' \', $classes ) . \'$1\';
            $params[0][\'before_widget\'] = preg_replace( $pattern, $replace, $params[0][\'before_widget\'], 1 );
        }
    }
    return $params;
}
使用上述代码,您可以在此行中添加一个或多个CSS类:$classes = array( \'custom-css-class-for-search\' );. 因此,如果要为搜索小部件添加两个CSS类,它将如下所示:

$classes = array( \'custom-css-class-for-search\', \'another-class\' );
选项3:自定义小部件:如果您需要比上述方法所能处理的更多的控制,那么您可以实现用于搜索的自定义小部件like shown in this answer.

但是,如果您希望多个小部件具有相同的行为,则可能很难维护自定义小部件。因为这样你也必须实现这个小部件(只针对额外的CSS类)!如果这不是您的问题,那么您可以遵循该路径,就像使用自定义小部件一样,您可以更好地控制标记和功能。

相关推荐

My widgets do not save

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