我需要从一个函数为我的插件生成css,如何在前端将一个请求映射到一个函数?

时间:2012-07-19 作者:Nicola Peluchetti

我在函数中使用这样的链接生成CSS

<link id="www-core-css" rel="stylesheet" href="http://wordpress/myplugin/theme-css-loader.php?v=1" /> 
我想知道该采取什么方法。我可以将href指向如下文件http://wordpress/myplugin/theme-css-loader.php?v=1 或者我可以尝试将请求映射到函数http://mysite.com/wordpress/?requested_page=myplugin_theme_css_loader&v=1 但我不知道如何在前端实现这一点(在后端,我会使用add\\u menu\\u page添加一个页面,然后使用remove\\u menu\\u page删除该页面,url仍然可以调用。你知道我如何将url请求映射到函数,这有意义吗?对我来说,需要该文件的开销似乎要小得多

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

这是从我为类似需求编写的内容派生出来的。

empty( $_GET[\'my-css-var\'] ) || add_action( \'plugins_loaded\', \'wpse_59089_css\' );
function wpse_59089_css()
{       
    header( \'Content-Type: text/css\' );

    // Aggressive caching to save future requests from the same client.
    $etag = \'"\' . md5( __FILE__ . $_GET[\'my-css-var\'] ) . \'"\';

    header( \'ETag: \' . $etag );
    header( \'Expires: \' . gmdate( \'D, d M Y H:i:s\', time() + 31536000 ) . \' GMT\' );
    header( \'Cache-Control: public, max-age=31536000\' );

    if ( empty( $_SERVER[\'HTTP_IF_NONE_MATCH\'] ) || $etag != stripslashes( $_SERVER[\'HTTP_IF_NONE_MATCH\'] ) ) {
        // Set all your variables here.
        $my_height = 100;

        // Render your CSS with a heredoc!
        $content = <<<CSS
#my_id {
    height: $my_height;
}
CSS;

        header( \'Content-Length: \' . strlen( $content ) );
        echo $content;

    } else {
        // Not modified!
        status_header( 304 );
    }

    // We\'re done!
    exit;
}
而资源链接就是:

http://example.com/?my-css-var=20120719_or_static_hash.css

每当更改CSS时(通常在设置更新之后),更改URL中的日期戳/哈希以强制刷新。

如果已在服务器级别关闭ETag,则需要发送并检查“上次修改”。

Update:

不要使用链接。额外的http请求是有害的。将动态CSS内联。真正地甚至谷歌也推荐它。

这要看情况而定。除非CSS的重量很小,或者它只适用于重复访问量很低的一次性页面,那么是的,内联可能是一种方式。

但积极缓存的外部样式表只会在第一次访问时触发请求(对于大多数客户机*)。

网站的每一位新访问者都必须以某种方式下载CSS。但是,内联样式将为每个后续视图发送,而外部样式将命中本地缓存。

以1000名访客为例,每个点击10次,500字节的CSS。内联将使带宽增加约4MB**。可能看起来不太多,但增加CSS大小或每个访问者的点击率,它将继续蔓延。

就像我刚说的,这要看情况而定!CSS有多大?在哪里使用?你的新访客和忠实访客比例高吗?(*你的大多数观众都支持代理吗?)(**您是否在HTML上实现了“未修改”)

我想我要说的是,“HTTP请求是邪恶的”并不是福音,即使它是从谷歌口中说出来的;)

我仍然认为,任何超过几行的内容都属于外部样式表,再加上一组紧凑的缓存规则,但这适合我,而不是所有人!

SO网友:Chip Bennett

我正在函数中生成我的CSS。。。

如果是这样,那太好了!您只需将该函数的输出挂接到\'wp_print_scripts\' 动作钩,如:

function wpse59089_dynamic_css() {
    ?>
<style type="text/css">
<?php
// Dynamic CSS goes here
?>
</style>
    <?php
}
add_action( \'wp_print_scripts\', \'wpse59089_dynamic_css\' );

结束

相关推荐

Per theme plugins?

我正在构建一个插件,它可以对博客页面的评论部分进行大量修改。它认为我不能用一种适用于所有主题的方式来实现这一点——根据使用的特定主题,必须调整一些CSS。我猜在将来,插件还会在数据库中存储一些数据。所以我想它应该是一个插件,而不是一个主题。(?)因此,这些问题:有没有可能以某种方式表明插件只能处理这个主题和那个主题?然后发布一些相当简单的插件版本,每个版本都针对一组特定的主题进行了调整?或者插件应该与。。。是否存在所有主题?除了按主题插件和/或分叉和修改现有主题之外,你能想出其他解决方案吗?也许是儿童主题