このコードはテーマカスタマイザからのカスタムCSS選択を追加します。このコードについて私が嫌いなのは、選択範囲を自分のスタイルシートに貼り付けたり、それらを別のスタイルシートに配置したりするのではなく、スタイルタグをサイトのHTMLに直接出力することです。
このCSSをテーマの内部style.cssの最後に貼り付けるか、新しいスタイルシートを生成して配置する方法はありますか? (あるいはこれは悪い考えでしょうか?)
function mytheme_customize_css()
{
?>
<style type="text/css">
html, body, .container { background:<?php echo get_theme_mod('primary_color', '#000000'); ?>; }
</style>
<?php
}
add_action( 'wp_head', 'mytheme_customize_css');
私はこのワークフローに従って可能であると思います:
テーマのmodがいつ更新され、いつそれが起こったかを見るために 'updated_option'
フックにアクションを追加する
style.css
を使ってfile_get_contents
の内容を文字列として取得するstyle.css
文字列に追加しますfile_put_contents
を使用して、新しいcssファイルに新しい文字列を書き込み、アクセス可能なフォルダに保存します。カスタマイズされたファイルのURLが存在する場合はそれを返すfilter 'stylesheet_uri'
フック
あなたのテーマでは、 get_stylesheet_uri()
を使ってスタイルシートがインクルードされていることを確認してください。
だから#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;
});