如何扩展wordpress核心小部件?

时间:2016-06-16 13:46:51

标签: php wordpress widget

默认情况下,wordpress有许多有用的小部件,例如类别小部件。现在查看位于 wp_includes / widgets / class-categories-widget.php

的课程WP_Widget_Categories
class WP_Widget_Categories extends WP_Widget 
{
    /**
     * Sets up a new Categories widget instance.
     *
     * @since 2.8.0
     * @access public
     */
    public function __construct() 
    {
        $widget_ops = array(
            'classname' => 'widget_categories',
            'description' => __( 'A list or dropdown of categories.' ),
            'customize_selective_refresh' => true,
        );
        parent::__construct( 'categories', __( 'Categories' ), $widget_ops );
    }
    //...
}

我们在$widget_ops数组中有一个选项,我想编辑类名widget_categories

搜索窗口小部件

的另一个示例
public function __construct() 
{
    $widget_ops = array(
        'classname' => 'widget_search',
        'description' => __( 'A search form for your site.' ),
        'customize_selective_refresh' => true,
    );
    parent::__construct( 'search', _x( 'Search', 'Search widget' ), $widget_ops );
}

有时我们需要在这里编辑一些字符串。

那么我们如何扩展这些课程呢?当然我不想编辑这些核心文件

1 个答案:

答案 0 :(得分:1)

如果要为所有小部件添加自定义类,可以在注册侧边栏时执行此操作。 before_widget参数是输出类名的位置。

<?php    
add_action( 'widgets_init', 'theme_slug_widgets_init' );
    function theme_slug_widgets_init() {
        register_sidebar( array(
            'name' => __( 'Main Sidebar', 'theme-slug' ),
            'id' => 'sidebar-1',
            'description' => __( 'Widgets in this area will be shown on all posts and pages.', 'theme-slug' ),
            'before_widget' => '<li id="%1$s" class="widget %2$s">', // this is where you would add additional classes
            'after_widget'  => '</li>',
            'before_title'  => '<h2 class="widgettitle">',
            'after_title'   => '</h2>',
        ) );
    }

如果您想要更精细的控制,可以使用dynamic_sidebar_params过滤器循环浏览侧栏中的小部件,更改特定小部件的before_title参数。

add_filter( 'dynamic_sidebar_params', 'my_dynamic_params' );

function my_dynamic_params( $params ) {

    foreach ( $params as $key => $param ) {

        // check to see if the widget is a category widget
        if ( $param['widget_name'] == 'Categories' ) {
            $params[$key]['before_widget'] = '<li id="' . $param['widget_id'] . '" class="widget my-custom-class">';
        }
    }

    return $params;
}