Я пытаюсь динамически записать в файл 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)?
Это проигрышная ситуация … так как php должен знать, что сохранить и что изменить. Это подразумевает разбор css-контента, который, я полагаю, находится за пределами вашей компетенции.
Мое решение было бы иметь отдельный css-файл, где живут все «заменяемые» css-правила, и где вы заменяете все при каждой записи.
В качестве альтернативы, вы можете использовать специальный comment
-delimiter (уникальная строка) вокруг правил, которые вы хотите заменить, в главном css-файле, а затем найдите этот разделитель … оставив все снаружи и заменив все внутри. Это немного сложнее, но выполнимо.
PS: Вы должны знать о полу-гоночных условиях, когда клиент запрашивает ваш файл, в то время как он EX-заблокирован … блокировка не будет (насколько я знаю) помешать простому серверу, запрошенному клиентом … только головы.
Других решений пока нет …