如何在不使用内联样式的情况下向插件添加CSS选项?


26

我最近发布了一个插件WP Coda Slider,它使用短代码将jQuery滑块添加到任何帖子或页面。我要在下一版本中添加一个选项页面,并且我想包括一些CSS选项,但是我不希望插件将样式选择添加为内联CSS。我希望这些选项在调用时被动态添加到CSS文件中。

我也想避免使用fopen或写入文件来解决安全问题。

这样的事情容易实现吗?还是直接将样式选择添加到页面上会更好吗?


@Chris_O:我一直在思考几乎完全相同的事情。我想要的是一种使用函数名而不是文件名调用wp_enqueue_style()(和 wp_enqueue_script())的方法,让我的函数生成CSS(或JS),但最终还是通过链接的样式表将其包括在内。据我所知,这是不可能的wp_equeue_*()功能。也许我们应该提交示踪票?
MikeSchinkel 2010年

@MikeSchinkel:那是使用wp_enqueue函数的非常合乎逻辑的方法。我会向该票证添加支持。
Chris_O 2010年

@Chris_O:我刚刚看到了@Doug的回答;我做了一个错误的假设,您已经知道这一点。如果我意识到情况并非如此,我会向您指出:wordpress.stackexchange.com/questions/556/#562
MikeSchinkel 2010年

@MikeSchinkel我知道wp_register和wp_enqueue。我一直在寻找一种基于插件选项页面中的值构建样式表的方法。
Chris_O 2010年

@Chris_O:嗯。我喜欢把自己想象成一个人,即使我学会了解决方案,他仍然可以看到其他人在解决方案中所缺少的东西(即,大多数专家都不是好老师,尽管我不是最好的专家,但我通常还是个好老师。 )太太,这是我想念的,对不起。:)
MikeSchinkel 2010年

Answers:


27

使用wp_register_stylewp_enqueue_style添加样式表。不要简单地将样式表链接添加到wp_head。排队样式允许其他插件或主题在必要时修改样式表。

您的样式表可以是.php文件:

wp_register_style('myStyleSheet', 'my-stylesheet.php');
wp_enqueue_style( 'myStyleSheet');

my-stylesheet.php看起来像这样:

<?php
// We'll be outputting CSS
header('Content-type: text/css');

include('my-plugin-data.php');    
?>

body {
  background: <?php echo $my_background_variable; ?>;
  font-size: <?php echo $my_font_size; ?>;
}

3
另外-由于值仅在选项页上的值更改时才更改-您可以在保存时生成CSS文件。您也可以将CSS文件存储在plugin目录中,因此与在包含include的每个CSS请求上运行PHP文件相比,这样做的性能更高。
hakre 2010年

1
谢谢!运作良好。但是我得到了致命错误get_option()...未定义。然后,我加载了wp-config.php文件,然后解决了该问题。
Sumith Harshan'1

Sumith,您能解释一下如何在自定义CSS文件中使用get_option吗?非常感谢!
Antonio Petricca 2015年

10

动态地构建CSS文件然后加载它会给添加CSS文件带来非常低的带宽负担,这会增加巨大的性能负担,尤其是在CSS中有一些变量需要通过WP处理的情况下。由于是为一次页面加载而创建的两个不同文件,因此WP启动两次,并两次运行所有数据库查询,这很麻烦。

如果您的滑块仅位于一页上,并且您希望动态设置样式,那么最好的选择是在标题中添加样式块。

按性能排序:

  1. 在标头中添加小块样式,动态创建-非常快
  2. 通过wp_enqueue_style添加非动态样式表-中
  3. 通过wp_enqueue_style添加动态样式表-非常慢

@ Dan-gayle很好。该插件可以在一页以上的页面上使用,有些用户在2页或3页上使用它。它仅将当前静态样式表和js放入具有短代码的页面上。
Chris_O 2010年

我同意丹·盖尔(Dan Gayle)的观点,即使您投票赞成我的回答。与在每个页面视图上下载一个单独的样式表相比,在wp_head上添加一个小的CSS块在性能方面要好得多(即使限于简短代码的几个帖子/页面)。首先使用单独的样式表的唯一原因是浏览器可以缓存它们。无法缓存动态样式表。
道格

2
这仍然是正确的做法吗?
Dave Kiss

2

这是我通常的做法:

function build_stylesheet_url() {
    echo '<link rel="stylesheet" href="' . $url . 'stylesheetname.css?build=' . date( "Ymd", strtotime( '-24 days' ) ) . '" type="text/css" media="screen" />';
}

function build_stylesheet_content() {
    if( isset( $_GET['build'] ) && addslashes( $_GET['build'] ) == date( "Ymd", strtotime( '-24 days' ) ) ) {
        header("Content-type: text/css");
        echo "/* Something */";
        define( 'DONOTCACHEPAGE', 1 ); // don't let wp-super-cache cache this page.
        die();
    }
}

add_action( 'init', 'build_stylesheet_content' );
add_action( 'wp_head', 'build_stylesheet_url' );

1

我对此类建议的所有建议都遇到了困难-也许我有点胖,或者贡献者失去了共同点。

我决定将其编码在插件php文件中:-

echo "<link href='http://www.brittany-gite-holidays.co.uk/wp-content/plugins/flexavailability/css/css.css' type='text/css' rel='stylesheet' />";
echo "<link href='http://www.brittany-gite-holidays.co.uk/wp-content/plugins/flexavailability/css/public.css' rel='stylesheet' type='text/css'/>";

它似乎有效。它只会在使用该插件的页面上加载。它在h1标签之后加载,这对我来说很好。我看不出它怎么可能更有效或更清晰。

....但也许我错了-我确实说我有点胖。


您只应<link>在页面标题中加载元素
shea 2013年

是的。那是因为您的CSS希望影响从页面顶部向下的所有内容。我很高兴只影响h1标签之后的内容。我无法使任何示例正常工作(我认为它们可能无法正确解释)。您可以在一些测试html上自己尝试一下。如果我错了,请告诉我:)
chazza

@chazza并非唯一原因。当浏览器在编写body标签后检测到任何样式时,它将停止执行任何其他操作,直到加载和应用该样式为止,这对性能不利,并导致屏幕重排和未样式化文本的闪烁。但是,如果这并不重要,请像您所说的那样放入这些css文件。我无时无刻不在做,最终还是可以的。不是最佳,但很好。
Dan Gayle

0

自Wordpress 3.3起更新

有一个名为wp_add_inline_style的函数,该函数可用于基于主题/插件选项动态添加样式。这可以用来在头部添加一个小的css文件,该文件应该快速有效。

<?php
function myprefix_scripts() {

    wp_enqueue_style('name-of-style-css', plugin_dir_path(__FILE__) . '/css/ccsfilename.css');

    $css = get_option( 'loader_css', 'default css goes here for when there is no value' );

    //or for Example
    $color = get_option( 'custom_plugin_color', 'red' ); //red is default value if value is not set
    $css = ".mycolor{
                background: {$color};
           }";

    wp_add_inline_style('name-of-style-css', $css);

}

add_action( 'wp_enqueue_scripts', 'myprefix_scripts' );
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.