以编程方式将字体-令人惊叹的图标添加到类别小部件

时间:2014-01-01 作者:MrJustin

我使用侧栏上的Categories小部件,我想显示Font Awesome icon 在小部件中列出的每个类别旁边。目前,所有类别的图标都是一样的,但我想在将来为每个类别赋予自己独特的图标。

我想使用我的functions.php 通过插入标记添加图标的文件,如<i class="fa fa-chevron-right"></i> 进入类别标题后的类别链接/锚定元素。我可以通过CSS来实现这一点,但这样做的时候,我失去了以编程方式确定要显示哪个图标的能力,以及我希望在将来进行其他改进/更改的灵活性。


基本上,我希望达到这样的效果:

Cat 1          >

Cat 2          >

Cat 3          >
(The greater-than symbol \'>\' represents the icon placement relative to the category title)


我在函数中加入了Font-Awesome。使用wp_enqueue_scripts 钩子如下,它可以完美地加载和显示图标。请注意,我没有使用任何为WordPress构建的字体很棒的插件。

/* Enqueue Scripts
-----------------------------------------------------------------*/
add_action( \'wp_enqueue_scripts\', \'essentials_enqueue_scripts\' );
function essentials_enqueue_scripts() {
    /* jQuery */
    wp_enqueue_script(\'jquery\');
    wp_enqueue_script( \'jquery_ui\', "http" . ($_SERVER[\'SERVER_PORT\'] == 443 ? "s" : "") . "://ajax.googleapis.com/ajax/libs/jqueryui/2.0.3/jquery-ui.min.js", false, null);
    wp_enqueue_script( \'waypoints\', get_template_directory_uri() . \'/js/waypoints.min.js\');
    wp_enqueue_script( \'essentials_main\', get_template_directory_uri() . \'/js/essentials_main.js\', array(), \'1.0.0\', true );
    wp_enqueue_script( \'essentials_show_stuff\', get_template_directory_uri() . \'/js/essentials_show_stuff.js\', array(), \'1.0.0\', true );
    /* Google Fonts */
    wp_register_style(\'GoogleFonts\',\'http://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700,800|Bad+Script\');
    wp_enqueue_style( \'GoogleFonts\');
    /* Font Awesome Fonts */
    wp_register_style(\'Font Awesome\',\'//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css\');
    wp_enqueue_style( \'Font Awesome\'); 
}
尽管我尽了最大的努力,我还是无法找到修改categories小部件的解决方案。

4 个回复
最合适的回答,由SO网友:birgire 整理而成

假设:

您没有解释如何安装Font Awesome软件包,所以我只是假设您使用该插件Font Awesome Icons.

您写道:

在任何人说使用背景图像之前,我不想这样做。我希望是身体上的。

所以我假设你想使用<i> 直接标记,例如:

<i class="fa icon-caret-right"></i>
在小部件类别列表中的每个类别链接之后。

想法:

您可以使用wp_list_categories 筛选以修改小部件类别列表的输出。

示例:

下面是一个简单的示例,如何通过wp_list_categories 过滤器:

/**
 * Inject Font Awesome <i> tag after each widget category link
 *
 * @param string $output
 * @return string $output
 */

 function custom_wp_list_categories( $output )
 {  
     remove_filter( current_filter(), __FUNCTION__ ); 
     return str_ireplace( \'</li>\', \'<i class="fa icon-caret-right"></i></li>\', $output);
 }

 add_action( \'widgets_init\', function(){
     add_filter( \'wp_list_categories\', \'custom_wp_list_categories\' );
 });
这将为您提供与此类似的输出:

catlist

SO网友:JMB

This answer 包含一个相当简单的CSS解决方案。

基本上,您需要在样式表中添加以下内容:

.cat-item cat-item-7 {
     list-style-image: url(\'my-epic-news-icon\');
}


cat-item cat-item-11 {
     list-style-image: url(\'my-epic-jquery-icon\');
}

是的,这不是一个非常动态的解决方案,但我认为您的类别不太可能改变。

SO网友:Chip Bennett

假设您要使用the fa-chevron-right icon, 您只需通过CSS以列表项为目标。使用:after 伪类:

.list-item:after {
    font-family: FontAwesome; // or whatever the font awesome family is registered as
    content: \'\\f054\';
}
因此,为了了解如何通过回调传递动态CSS(可以轻松调整为自定义插件选项),下面是一个示例:

(注意:“插件”和“主题”在下面可以互换。)

首先,我们将修改CSS以专门针对小部件内的列表项。WordPress添加了一个类,.widget, 到小部件容器。因此,您可以针对以下目标:

.widget .list-item:after {}
或者,如果这些都将打包在注册自定义小部件的插件中,那么您可以通过$widget_ops 阵列:

$widget_ops = array( 
    \'classname\' => \'custom-widget-classname\', 
    \'description\' => __( \'Custom Widget Description\', \'namespace\' ) 
);
因此,您可以针对该自定义类名:

.custom-widget-classname .list-item:after {}
或者,如果您想以核心“类别”小部件为目标,您可以使用.widget_categories 班我们将以这种方法为例。

我们将把它放在回调中,连接到wp_head, 虽然你可以很容易地使用wp_print_styles:

function pluginslug_fontawesome_styles() {
    // Code will go here
}
add_action( \'wp_head\', \'pluginslug_fontawesome_styles\' );
在内部,我们将输出一个样式表,使用上面的规则:

function pluginslug_fontawesome_styles() {
    ?>
<script type="text/css">
.widget_categories .list-item:after {
    font-family: FontAwesome; // or whatever the font awesome family is registered as
    content: \'\\f054\';
}
</script>
    <?php
}
add_action( \'wp_head\', \'pluginslug_fontawesome_styles\' );
至此,您已完成。简单的豌豆。但是,由于您已经在PHP函数中,您可以通过使用变量轻松地使此样式表成为动态的:

function pluginslug_fontawesome_styles() {

    // Define list-style icon variable
    $list_item_icon = \'\\f054\';

    // ...snip:
    content: <?php echo $list_item_icon; ?>;
现在,使用自定义插件选项值很简单,只需将其传递给变量即可:

function pluginslug_fontawesome_styles() {

    // Get Plugin options, assumed to be an array
    $plugin_options = get_option( \'pluginslug_plugin_options\' );

    // Define list-style icon variable
    $list_item_icon = $plugin_options[\'list_item_icon\'];

    // Output stylesheet
    ?>
<script type="text/css">
.widget_categories .list-item:after {
    font-family: FontAwesome; // or whatever the font awesome family is registered as
    content: <?php echo $list_item_icon; ?>;
}
</script>
    <?php
}
add_action( \'wp_head\', \'pluginslug_fontawesome_styles\' );
就是这样!动态CSS,输出实际图标(不是背景图像),从插件选项中提取。

而且,由于它只是CSS,所以很容易扩展到几乎任何您可以想象的选择器,而不仅仅限于小部件中的列表项。

SO网友:tfrommen

我会这样做:

// If you\'re using the widget only on specific pages,
// you might want to use some appropriate conditions here
add_action(\'wp_enqueue_scripts\', function() {
    wp_enqueue_style(\'font-awesome\',
        \'//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css\');
});

function wpse_128247_font_awesome_categories($cat_name) {
    // Define your desired icon here
    $icon = \' <i class="fa fa-smile-o"></i>\';

    return $cat_name.$icon;
} // function wpse_128247_font_awesome_categories

function wpse_128247_add_filter($cat_args) {
    add_filter(\'list_cats\', \'wpse_128247_font_awesome_categories\');

    // Since we\'re hijacking this filter, we just pass through its data
    return $cat_args;
} // function wpse_128247_add_filter
add_filter(\'widget_categories_args\', \'wpse_128247_add_filter\');

function wpse_128247_remove_filter($output) {
    remove_filter(\'list_cats\', \'wpse_128247_font_awesome_categories\');

    // Since we\'re hijacking this filter, we just pass through its data
    return $output;
} // function wpse_128247_remove_filter
add_filter(\'wp_list_categories\', \'wpse_128247_remove_filter\');
首先,我们将字体排成令人敬畏的样式。然后,我们劫持一些过滤器来添加/删除我们自己的类别列表过滤器。就是这样。

<小时>// EDIT:
没有注释,适应了您已经将Font-Awesome排入队列的事实,使用闭包,并让过滤器自行删除,代码如下所示:

function wpse_128247_font_awesome_categories($cat_name) {
    remove_filter(current_filter(), __FUNCTION__);
    return $cat_name.\' <i class="fa fa-smile-o"></i>\';
} // function wpse_128247_font_awesome_categories

function wpse_128247_add_filter($cat_args) {
    add_filter(\'list_cats\', \'wpse_128247_font_awesome_categories\');
    return $cat_args;
} // function wpse_128247_add_filter
add_filter(\'widget_categories_args\', \'wpse_128247_add_filter\');
我不认为这是杀伤力过大。但是,是的,我的代码比birgire当前的解决方案包含更多的行。

结束

相关推荐

Widgets in the loop if active

我正在尝试将一个小部件作为“第一个帖子”,如果它处于活动状态。。然后让帖子继续。。它可以工作,但第一篇帖子消失了,第二篇帖子成为小部件后的第一行。。看不出我做错了什么。。正如你所看到的,我已经有一个小部件显示在帖子之间。<?php if (have_posts()) : ?> <?php $paged = (get_query_var(\'paged\')) ? get_query_var(\'paged\') : 1; ?> <?php $i=1;?>