如何通过src而不是句柄将样式表出列?

时间:2014-05-28 作者:Knott

我正在尝试开发一个Wordpress插件,如果主题已经使用了Wordpress插件,那么该插件将退出/注销用户可能安装的特定插件添加到主题的样式表。

换句话说,如果管理员使用的主题Font Awesome 字体很棒。css(或font-awesome.min.css),他使用了2个插件,也使用了font-awesome,管理员将得到3个font-awesome。已加载css(或font-awesome.min.css)样式表。

是否有办法检查主题是否已经加载了字体Awesome样式表,如果已经加载,则在主题将其排入队列之前,自动退出/取消所有插件的注册?

我想到的解决方案是这样的(伪代码):

add_action( \'wp_enqueue_scripts\', \'no_more_fontawesome\', 999 );
function no_more_fontawesome() {
    if ( src_contain (\'font-awesome.css\') || src_contain(\'font-awesome.min.css\') ) {
        wp_dequeue_style( that has font-awesome.css or font-awesome.min.css in src);
    }
解决方案可能是在src中对表达式进行regex检查。css和字体很棒。min.css但如何做到这一点?

任何帮助都将不胜感激!

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

我想你说的是一种罕见的情况。“font awsome”是所有插件和主题都应该用作句柄的预期名称。如果开发人员没有更改字体awsome CSS文件的源代码,则没有理由更改句柄的名称。无论如何,您可以检查全局$wp_styles对象,并在每个排队样式的src值中生成一个正则表达式:

function cybmeta_dequeue_fontawsome() {

    global $wp_styles;
    // we use preg_match to find only the following patterns as exact matches, to prevent other stylesheets that contain font-awesome expression to be also dequeued
    $patterns = array(
        \'font-awesome.css\',
        \'font-awesome.min.css\'
        );

    $regex = \'/(\' .implode(\'|\', $patterns) .\')/i\';

    foreach( $wp_styles -> registered as $registered ) {

        if( preg_match( $regex, $registered->src) ) {
            wp_dequeue_style( $registered->handle );
            // FA was dequeued, so here we need to enqueue it again from the location we want (cdn in our code)
            wp_enqueue_style( \'font-awesome\', \'//netdna.bootstrapcdn.com/font-awesome/4.1.0/css/font-awesome.min.css\' );
        }
    }

}
add_action( \'wp_enqueue_scripts\', \'cybmeta_dequeue_fontawsome\' );

结束