少CSS enqueue_style与add_filter更改rel属性


8

我想做的是在Wordpress中使用更少的CSS

您应该将rel属性设置为'stylesheet / less'链接到.less文件。但是我不知道如何更改enqueue_style输出的代码。

有没有办法应用过滤器并影响输出?

编辑:如果有人对我最终如何使它起作用感到好奇,请参见以下代码片段:

function enqueue_less_styles($tag, $handle) {
    global $wp_styles;
    $match_pattern = '/\.less$/U';
    if ( preg_match( $match_pattern, $wp_styles->registered[$handle]->src ) ) {
        $handle = $wp_styles->registered[$handle]->handle;
        $media = $wp_styles->registered[$handle]->args;
        $href = $wp_styles->registered[$handle]->src . '?ver=' . $wp_styles->registered[$handle]->ver;
        $rel = isset($wp_styles->registered[$handle]->extra['alt']) && $wp_styles->registered[$handle]->extra['alt'] ? 'alternate stylesheet' : 'stylesheet';
        $title = isset($wp_styles->registered[$handle]->extra['title']) ? "title='" . esc_attr( $wp_styles->registered[$handle]->extra['title'] ) . "'" : '';

        $tag = "<link rel='stylesheet' id='$handle' $title href='$href' type='text/less' media='$media' />";
    }
    return $tag;
}
add_filter( 'style_loader_tag', 'enqueue_less_styles', 5, 2);

为什么要加载.less样式表?它们最适合在开发过程中使用,然后导出到普通CSS,我认为这不是您的情况,因为您在询问如何使其与enqueue_style一起使用:)
onetrickpony

我在构建过程中将它们转换为CSS。没错,这仅是出于开发目的。
cbaigorri

感谢您发布代码段,因为它解决了我的问题。我在其他地方找到了类似的脚本,但是无法正常工作。
ScottS

我在$ tag值的末尾添加了“ \ r \ n”,因为它正在连接HTML中的行。$tag = "<link rel='stylesheet/less' id='$handle' $title href='$href' type='text/less' media='$media' />\r\n";
jnthnclrk 2013年

Answers:


5

是的,最终样式链接输出通过style_loader_tag过滤器传递。


2

我做了一个使用WP_Dependancies类的query()方法的函数。此外,它不会重新生成输出,而是仅重写必要的部分。

该函数访问全局$ wp_styles对象并执行查询以获取样式表对象。使用正则表达式检查src是否包含.less文件,如果为true,则对rel属性进行相应的修改。在我的函数中,我进一步将ID中的-css后缀替换为-less后缀,如果您不喜欢它,只需删除此行。

function allow_less_stylesheets( $style_tag, $handle )
{
    global $wp_styles;

    $obj = $wp_styles->query( $handle );
    if( $obj === false )
    {
        return $style_tag;
    }
    if( !preg_match( '/\.less$/U', $obj->src ) )
    {
        return $style_tag;
    }

    // the current stylesheet is a LESS stylesheet, so make according changes
    $rel = isset( $obj->extra['alt'] ) && $obj->extra['alt'] ? 'alternate stylesheet' : 'stylesheet';
    $style_tag = str_replace( "rel='" . $rel . "'", "rel='stylesheet/less'", $style_tag );
    $style_tag = str_replace( "id='" . $handle . "-css'", "id='" . $handle . "-less'", $style_tag );
    return $style_tag;
}

0

改变rel=stylesheetrel=stylesheet/less$tag定义..也rel=alternate stylesheet/less,不工作..


2
“由于答案的长度和内容,此答案被自动标记为低质量”,我确定您不希望这样做。您能否添加一些解决方案的说明以及为什么您认为它可以解决问题。
s_ha_dum 2013年

-1

感谢您的回答。直到我放回声代替return,它对我来说都是无效的:

function enqueue_less_styles($tag, $handle) {
    global $wp_styles;
    $match_pattern = '/\.less$/U';
    if ( preg_match( $match_pattern, $wp_styles->registered[$handle]->src ) ) {
        $handle = $wp_styles->registered[$handle]->handle;
        $media = $wp_styles->registered[$handle]->args;
        $href = $wp_styles->registered[$handle]->src . '?ver=' . $wp_styles->registered[$handle]->ver;
        $rel = isset($wp_styles->registered[$handle]->extra['alt']) && $wp_styles->registered[$handle]->extra['alt'] ? 'alternate stylesheet' : 'stylesheet';
        $title = isset($wp_styles->registered[$handle]->extra['title']) ? "title='" . esc_attr( $wp_styles->registered[$handle]->extra['title'] ) . "'" : '';

        $tag = "<link rel='stylesheet' id='$handle' $title href='$href' type='text/less' media='$media' />";
    }
    echo $tag;
}
add_filter( 'style_loader_tag', 'enqueue_less_styles', 5, 2);

1
看起来不对,过滤器绝对应该返回输出,否则您将破坏过滤器链并弄乱事情。
拉斯特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.