0

我正在尝试动态写入 css 文件。该文件中已经有一些内容,我希望动态生成的 css 规则附加到文件的末尾。

但是,我的代码总是覆盖删除所有以前数据的文件,但是当我使用FILE_APPEND标志时。问题是,当我再次写入文件时,它会在底部再次附加数据,复制现有规则。

这是我经过大量试验和错误后得到的最终代码:

function mytheme_save_page_css( $post_id ) {

    $margin = get_post_meta( $post_id, '_page_margin', true );
    $padding = get_post_meta( $post_id, '_page_padding', true );
    $bgcol = get_post_meta( $post_id, '_page_bg_col', true );

    $newmargin = sanitize_text_field( $_POST['pagemargin'];
    $newpadding = sanitize_text_field( $_POST['pagepadding'];
    $newbgcol = sanitize_text_field( $_POST['pagebg'];

    if ( $margin != $newmargin || $padding != $newpadding || $bgcol != $newbgcol ) {

        $file = get_stylesheet_directory() . '/lib/css/sections/style.css';
        $css = 'header{margin:'.$newmargin.';padding:'.$newpadding.';background-color:'.$newbgcol.';}';

        file_put_contents($file, $css, FILE_APPEND | LOCK_EX);

    }

    update_post_meta( $post_id, '_page_margin', $newmargin );
    update_post_meta( $post_id, '_page_padding', $newpadding );
    update_post_meta( $post_id, '_page_bg_col', $newbgcol );

}

有没有办法只替换那些规则,而不是一次又一次地复制它们(并创建一个单独的 CSS 文件)?

4

1 回答 1

0

这是一个双输的局面……因为 php 应该知道要保留什么以及要更改什么。这意味着解析 css 内容,我猜这超出了您的范围。

我的解决方案是有一个单独的 css 文件,所有“可替换”的 css 规则都在其中,并且每次写入时都替换所有内容。

或者,您可以comment在主 css 文件中围绕要替换的规则使用特殊的 -delimiter(唯一字符串),然后搜索该分隔符......将所有内容保留在外面,并替换里面的所有内容。这有点复杂,但可行。

PS:您应该注意半竞速条件,即客户端请求您的文件,而文件已被 EX 锁定......锁不会(据我所知)阻止简单的客户端请求的服务...... . 只是提醒一下。

于 2015-07-25T16:13:16.887 回答