【问题标题】:Adding css to file via php通过php将css添加到文件
【发布时间】:2017-02-20 15:59:14
【问题描述】:

我正在开发一个 WordPress 插件,当有人启用某个功能时,我希望它能够将一些预定义的 CSS 添加到样式表中。

除了常规样式表之外,我不能简单地包含样式表,因为某些功能会与之冲突。我希望这样当他们单击一个元素时,它只加载与此相关的 CSS。

当他们选择这个元素时,它应该将相关的 CSS “打印”到样式表中。

我可以调用我创建的包含 CSS 并且仅在启用该功能后才被调用的函数吗?

【问题讨论】:

    标签: php css wordpress


    【解决方案1】:

    我有几种方法可以解决这个问题。

    您可以使用内联 css 而不需要主题的样式表。并在您的条件之间写下您需要的内容,例如第一个示例或使用wp_add_inline_style

    想法 1:使用 wp_add_inline_style

    //* Load CSS
    function yourplugin_prefix_load_css() {
         add_action( 'wp_head', 'yourpluginprefix_css', 15 );
    }
    add_action( 'plugins_loaded' , 'yourplugin_prefix_load_css' );
    
    
    //* CSS
    function yourpluginprefix_css() {
    
        //vars
        $a = get_option( 'where_a', 'what_a' );
        $b = get_option( 'where_b', 'what_b' );
    
        // begin CSS
        $css = '';
    
        $css .= '<style class="whatever" >';
    
        //condition $a
        if ( $a == '0' ) :
    
            $css .= '
    
                .property{
                    display: inline-block;
                }
    
            '; 
    
        endif;  //condition for $a
    
    
        //condition $b
        if ( $b != '1' ) :
    
            $css .= '
    
                .property-something{
                    border: 1px solid #333;
                }
    
            '; 
    
        endif;  //condition for $b
    
    
        //close the style sheet
        $css .= '</style>';
    
        //minify it
        $css_min = str_replace( array("\r\n", "\r", "\n", "\t", '  ', '    ', '    '), '', $css );
    
        echo $css_min;
    
    }   
    

    带有 wp_add_inline_style 的 IDEA 2

    或者,您可以使用 wp_add_inline_style 并获取当前主题的句柄。

    function pluginprefix_css() {
    
        //get current theme stylesheet handle
        $current_theme = ( wp_get_theme() );
    
        //get our values for conditions
        $a             = get_option( 'where_a', 'what_a' );
        $b             = get_option( 'where_b', 'what_b' );
    
    
        //begin css
        $css = '';
    
    
        //condition $a
        if ( $a == '0' ) :
    
            $css .= '
    
                .property{
                    display: inline-block;
                }
    
            '; 
    
        endif;  //condition for $a
    
    
        //condition $b
        if ( $b != '1' ) :
    
            $css .= '
    
                .property-something{
                    border: 1px solid #333;
                }
    
            '; 
    
        endif;  //condition for $b      
    
    
        //minify css
        $css_min = str_replace( array("\r\n", "\r", "\n", "\t", '  ', '    ', '    '), '', $css );
    
        //add inline style                
        wp_add_inline_style( $current_theme->stylesheet, $css_min );
    
    
    }
    add_action( 'wp_enqueue_scripts', 'pluginprefix_css' );
    

    【讨论】:

    • 是的传奇!!!非常感谢。我做了一个小改动并更改了:“$css .= str_replace(”到“$css_min .= str_replace(”然后exho $css_min。因为你的代码输出的是缩小的而不是不输出的。非常感谢!!正是我想要的!耶
    • 好收获。我从我的插件中修改它的速度太快了。我更新了答案。
    • 我添加了一个选项,您可以在其中使用 wp_add_inline 并且句柄是主题的样式表,使其对 WordPress 更加友好。没有太大的改变,除了你不需要打开和关闭样式标签,你需要添加功能。
    【解决方案2】:

    如果您需要在网站加载后加载库,您最好的希望是javascript。 例如。单击元素时,您可以将代码 sn-p 添加到头部。在 jQuery 中

    var e = 'button.class';
    var remove_css = '#my_style_1';
    var code = '<link rel="stylesheet" type="text/css" href="/path/to/css_part.css">';
    $(e).on( 'click', function() {
       $('head').append( code );
       $(remove_css).remove();
    });
    

    将 e 变量替换为将在点击时将代码添加到标题中的类或元素。

    更新:在源代码中找到您的 css 文件的标识符 (ID) 并将其放入 remove_css 变量中。单击元素后它将删除它。我应该注意,这个解决方案不是持久的,并且会持续到页面切换。

    --

    如果您需要基于选项加载 css,请在您的管理员中创建一个选项,注册您的样式,然后根据选项启用它。

    在代码的某个地方注册你的风格:

    wp_register_style( 'my_style_original', '/path/to/css_part.css' );
    wp_register_style( 'my_style_replace', '/path/to/css_part.css' );
    

    然后根据选项启用它

    $enable_css = get_option( 'enable_css' );
    if( $enable_css )
       wp_enqueue_style( 'my_style_replace' );   // if setting enabled load second css
    else
       wp_enqueue_style( 'my_style_original' );   // if setting not enabled load original css
    

    这只有在选项'enable_css'不是false或空时才加载样式。 要创建选项页面,请参阅https://codex.wordpress.org/Creating_Options_Pages 或为了更轻松的设置,您可以坚持使用 ACF 选项 (https://www.advancedcustomfields.com/add-ons/options-page/);

    【讨论】:

    • 如果我理解正确的话。我将有多个 css 文件,其中包含代码。上面的代码将采用 css 并将其加载到站点的头部而不链接样式表?可能会成为赢家
    • 我将同时更新这两种解决方案以替换样式/仅加载一个。
    • 这会加载一个外部工作表,对吧?如果我启用了 4-5 个功能,那么我将加载 4-5 个外部工作表?谢谢
    • 我应该先问问你想达到什么目的。您需要此设置是持久的(例如,管理员将在管理员中设置它,并且每次都会在前端加载库)或者它只是网站上特定页面上的一个镜头目的?
    • 所以基本上我有一些 CSS 可以改变存档页面上博客文章的外观。当他们选择和选项时,它将显示为网格格式(砌体)。如果他们选择另一个选项将显示为全宽。所以基本上这两个css代码是冲突的。但是我还有其他选项也可以“启用”,因此也需要将这些脚本添加到 css 文件中。回答您的问题:它将像在许多页面上一样在整个网站上加载。
    【解决方案3】:

    您可以创建一个将缩进样式写入特定元素的函数。请记住,这不被认为是糟糕的编码,反正我不知道如何考虑它,因为它是动态内容。

    因此,例如,您有:

    <input type="text" />
    

    当用户点击添加样式时,函数会添加:

    <input type="text" style="..." />
    

    另一方面,当用户刷新页面时,样式会消失。

    【讨论】:

    • 虽然它可以工作,但这是一种混乱且难以维护的方式。
    • 哦,是的,是的。
    • 谢谢。不确定这是否会像我希望的那样工作。用户将单击 wordpress 后端中的按钮并将 css 发布到将在前端加载的文件中。也可能有一大块 css,所以不确定它会不会很容易。谢谢您的帮助。不知道是否有办法将 css “放入” style.css 文件中。
    • 非常感谢您的帮助 - 上面的答案帮助了我,但非常感谢您的意见
    【解决方案4】:

    创建一个 php 函数,该函数接受启用哪些功能的参数来制作自定义样式表,并动态地将该样式表排入队列。使用 .htaccess 或类似设置将您的 custom_thingy.css 请求重定向到 custom_thingy.php 并让它回显自定义样式,它的行为就像一个常规样式表。

    foreach($style_options as $option) {
        echo file_get_contents($option_style_file[$option]);
    }
    

    【讨论】:

    • 我想过这个,但是我会加载多个 css 表。因此,如果他们启用 4-5 个功能,我将加载五张纸?你是这个意思吗?感谢您的帮助:D
    • 排序。制作多张工作表,并拥有一个 php 脚本,在需要时将它们组合在一起并将其作为样式表回显。类似于“缓存”插件所做的,将所有文件编译为一个,只包括你需要的。
    • 好的,我明白了。你知道如何编写一个将它们组合在一起的脚本吗?
    • 伪代码,但这样的事情将是一个开始:foreach($style_options as $option) { echo file_get_contents($option_style_file[$option]); }
    • 如果我想将 .css 文件重定向到 .php 文件。由于无法访问每个人的 htaccess,我将如何通过插件执行此操作?这可以通过插件完成吗?再次感谢
    【解决方案5】:

    如果你使用 wordpress。你可以使用 wp_add_inline_style

    【讨论】:

      猜你喜欢
      • 2016-07-22
      • 1970-01-01
      • 2012-06-09
      • 2020-11-16
      • 1970-01-01
      • 2011-04-10
      • 1970-01-01
      • 1970-01-01
      • 2013-09-08
      相关资源
      最近更新 更多