我认为遵循此工作流是可行的:
将操作添加到\'updated_option\'
钩子以查看主题mod何时更新,以及何时运行一个函数
获取的内容style.css
作为字符串使用file_get_contents
获取自定义项并将其附加到style.css
字符串将新字符串写入一个新的css文件,将其保存在一个可访问的文件夹中,也可以保存在uploas文件夹的子目录中(该文件夹应可由WordPress写入),使用file_put_contents
如果文件操作出错(总是可能发生),请使用OP中的代码作为回退过滤器\'stylesheet_uri\'
钩子返回自定义文件的url(如果存在)在主题中,请确保使用get_stylesheet_uri()
So点#1代码:
add_action( \'updated_option\', function( $option ) {
$theme = get_option( \'stylesheet\' );
if ( $option === "theme_mods_{$theme}" ) {
my_update_stylesheet();
}
});
function my_update_stylesheet() {
$css = @file_get_contents( get_template_directory() . \'/style.css\' );
if ( ! $css ) { // if we can\'t read file use your function in OP as fallback
add_action( \'wp_head\', \'mytheme_customize_css\');
}
$color = get_theme_mod(\'primary_color\', \'#000000\');
$css .= PHP_EOL . sprintf( \'html, body, .container { background:%s; }\', $color );
$upload = wp_upload_dir();
$path = $upload[\'basedir\'] . \'/thememod\';
if ( ! is_dir( $path ) ) {
wp_mkdir_p( $path );
}
$newfile = @file_put_contents( $path . \'/style.css\', $css );
if ( ! $newfile ) { // if we can\'t write file use your function in OP as fallback
add_action( \'wp_head\', \'mytheme_customize_css\');
}
}
和点#2
add_filter( \'stylesheet_uri\', function( $uri ) {
$upload = wp_upload_dir();
if ( file_exists( $upload[\'basedir\'] . \'/thememod/style.css\' ) ) {
$uri = $upload[\'baseurl\'] . \'/thememod/style.css\';
}
return $uri;
});