TwentyTwelveの子テーマつくったらハマった話
-
Upload
masahiko-kawai -
Category
Documents
-
view
12.516 -
download
9
description
Transcript of TwentyTwelveの子テーマつくったらハマった話
2
自己紹介●川井昌彦(かわいまさひこ) @sakuragi_kei 東京の制作会社で24年間勤めた後、 京都府舞鶴市に帰郷してフリーランスで活動中
実は、DTPのほうが経験が長い (このスライドも InDesign で作っています) 実は、MovableTypeのほうが経験が長い
小桜インコ・シロハラインコ・黒い柴犬のパパ
Cherry Pie Web http://www.cherrypieweb.com
3
このスライドは、こんな人におススメいわゆる「Webデザイナー」• HTMLとCSSはだいたいわかる
• JavaScriptは、どっかのブログに書いてあるのを コピペして使うくらい
• PHPは、WordPressで最低限必要なことを、 解説書とかブログとか読んで、 なんとなくわかっているような、いないような・・・
4
まえがき―子テーマとはWordPressの制作 ≒ テーマの作成一からテーマを作るのは大変 既存のテーマを持ってきて、一部を改造して使うのが手っ取り早い
その時によく使われる方法が、「子テーマ」 ※ 子テーマのメリットは、他でもいろいろ説明されているので
ここでは省略
WordBench京都2月の、瀬戸さんのスライドとか見ましょう。 http://www.slideshare.net/aschachamaru/ss-16625153
←これは、子イヌ
7
子テーマを作るのは、 「良い方法」だけど「簡単な方法」ではない!
特に、WordPressに付属してくるテーマは要注意! (TwentyEleven, TwentyTwelve など)
新しい機能や新しい考え方を盛り込んであるので、 新しい機能をすぐに使える
↓
新しい考え方を理解しないといけない!
10
本日のメニュー●まずは、子テーマを作ってみよう!
●ie8以下にだけ、子テーマの style.css が適用されない!
●えっ? テンプレートにcssの記述がないよ?
●font-sizeの「rem」って何? なんか小数点が凄いよ!
●タイトルに勝手にサイト名が付いて、 SEO対策のプラグイン入れても変なタイトルになるよ!
●親テーマの functions.php のおせっかいな設定が、 子テーマで上書きできないよ!
11
子テーマを作ってみよう子テーマを作るには、 ディレクトリを作って、 style.css に2行ほど書くだけ。 超カンタン!/*
Theme Name: WB Kyoto 2013_3
Template: twentytwelve
*/
これは、最低限の記述で、 ホントは、
他にもいろいろ 書かないといけないのだ。
だまされちゃイケナイのだ!
12
子テーマを適用すると、 親テーマの style.css が適用されなくなる子テーマでは、cssは子テーマの style.css が使用される
親テーマを流用して一部だけ改造したいのだから、 親テーマのcssを適用したい ↓ 子テーマの style.css の先頭に、親テーマの style.css を読み込んで、子テーマの style.css で上書きしていく@import url('../twentytwelve/style.css');
(注)この方法は、TwentyEleven までのやりかた
13
ie8以下だけ、 子テーマの style.css が適用されない!
この方法で、子テーマの style.css で上書きしてみると・・・
子テーマの css が 「適用されるところ」と「適用されないところ」が出てくる! しかも、 ie8以下 だけ!
・・・でも、これ、ieが悪いんじゃないんです。 TwentyTwelve のせいなんです・・・
14
書き出された HTML を見てみると、 子テーマの style.css の後に、 親テーマの ie.css というのが読み込まれている<link rel='stylesheet' id='twentytwelve-style-css' href='http://.../wp-content/themes/twentytwelve/style.css?ver=3.5.1' type='text/css' media='all' />
<!--[if lt IE 9]> <link rel='stylesheet' id='twentytwelve-ie-css' href='http://.../wp-content/themes/twentytwelve/css/ie.css?ver=20121010' type='text/css' media='all' /> <![endif]-->
で、ここを直そうと思ってテンプレートを見てみると・・・
15
テンプレートに、cssの記述がない!
TwentyEleven では、header.php で スタイルシートを読み込んでいたが、 TwentyTwelveでは読み込む記述がない!
どうなってんの?
16
テンプレートにcssの記述がない どうなってんの?
実は、TwentyTwelve の functions.php で記述されているfunction twentytwelve_scripts_styles() { global $wp_styles; (中略 webfontの読込) /* * Loads our main stylesheet. */ wp_enqueue_style( 'twentytwelve-style', get_stylesheet_uri() );
17
/* * Loads the Internet Explorer specific stylesheet. */ wp_enqueue_style( 'twentytwelve-ie', get_template_directory_uri() . '/css/ie.css', array( 'twentytwelve-style' ), '20121010' ); $wp_styles->add_data( 'twentytwelve-ie', 'conditional', 'lt IE 9' ); } add_action( 'wp_enqueue_scripts', 'twentytwelve_scripts_styles' );
これで、header.php の wp_head() のところにcssが挿入される
メインのcssは、get_stylesheet_uri() で子テーマの style.css が 適用されるが、ieは、コンディショナルコメントが生きて、 ie.css が後から適用される。 ie.css は、get_template_directory_uri() が指定されているので、 親テーマの ie.css が適用されてしまう!
18
つまり、子テーマの style.css に親テーマの style.css を @import で読み込む方法だと・・・
1.親テーマの style.css
2.子テーマの style.css
3.親テーマの ie.css
の順に読み込まれるので、 ie8以下で見たときは、子テーマの style.css が、 親テーマの ie.css で上書きされてしまう!
ネットに書いてある通りじゃ ダメってことなのだ・・・
こんなの、フツー、 わかんないのだ!
19
対策: 子テーマに functions.php をつくって、 スタイルシートの読み込みを再定義するfunction wbkyoto_scripts_styles() { global $wp_styles; wp_enqueue_style( 'twentytwelve-style', get_template_directory_uri().'/style.css', array() ); wp_enqueue_style( 'twentytwelve-ie', get_template_directory_uri() . '/css/ie.css', array( 'twentytwelve-style' ), '20121010' ); $wp_styles->add_data( 'twentytwelve-ie', 'conditional', 'lt IE 9' );
wp_enqueue_style( 'wbkyoto-style', get_stylesheet_uri(), array('twentytwelve-ie') ); wp_enqueue_style( 'wbkyoto-ie', get_stylesheet_directory_uri().'/css/wbkyoto-ie.css', array( 'wbkyoto-style' ) ); $wp_styles->add_data( 'wbkyoto-ie', 'conditional', 'lt IE 9' ); }
add_action( 'wp_enqueue_scripts', 'wbkyoto_scripts_styles' );
20
(解説) 親テーマの下記の記述では、 子テーマの style.css が読み込まれてしまう wp_enqueue_style( 'twentytwelve-style', get_stylesheet_uri() );
そのため、 子テーマで同じハンドルを使って、再定義する wp_enqueue_style( 'twentytwelve-style', get_template_directory_uri().'/style.css', array() );
21
なぜ、こんなややこしいことをしているのか?
1. 読込順序(依存関係)をコントロールできる
2. バージョン指定により、 ブラウザキャッシュの コントロールができる
うー、めんどくさくて、 眠くなりそうなのだー
22
読込順序(依存関係)をコントロールできるwp_enqueue_style() は、 記述順に読み込むのではなく、 第3引数に指定されたハンドルの「次」に読み込むように指定される
さきほどの場合は、 1. 親テーマの style.css ハンドル: twentytwelve-style 2. 親テーマの ie.css ハンドル: twentytwelve-ie 3. 子テーマの style.css ハンドル: wbkyoto-style 4. 子テーマの ie.css ハンドル: wbkyoto-ie
の順に書き出される
23
ブラウザキャッシュのコントロールができる第4引数にバージョンを指定すると、ブラウザキャッシュのコントロールができる (バージョンがGETパラメーターに指定される)
chromeのように、キャッシュが効きすぎてスタイルシートを修正してもなかなか表示に反映されない場合、GETパラメータを変えてやることで反映されるようになる
いちいちバージョンを指定するのも面倒なので、こんな感じで書いておくと、 cssファイルの修正日時を、バージョンとして出力してくれるので、オススメ!
wp_enqueue_style( 'twentytwelve-style', get_template_directory_uri() . '/style.css', array(), date('YmdHis', filemtime(get_template_directory_uri() . '/style.css')) );
24
テンプレートごと(投稿タイプごととか、カテゴリごとなど)に cssを適用したいとき、たとえば・・・ single-blog.php → blog.css archive-blog.php → blog.css single-news.php → news.css archive-news.php → news.css
<?php function news_scripts_styles() { wp_enqueue_style( 'news-style', get_stylesheet_directory_uri().'/css/news.css', 'wbkyoto-style' ); wp_enqueue_style( 'news-style-ie', get_stylesheet_directory_uri().'/css/news-ie.css', 'news-style' ); } add_action( 'wp_enqueue_scripts', 'news_scripts_styles' ); get_header(); ?>
25
font-sizeの「rem」って何? なんか、小数点が凄いよ!
TwentyTwelve の style.css には、見慣れない単位がある.site-header h1 { font-size: 24px; font-size: 1.714285714rem; }
font-size の値は、アクセシビリティに配慮し、 文字サイズを変えられるようにするため、 親要素からの相対サイズで指定するのが一般的 (例) html が 14px なら、p は、86%(12px)とか
26
しかし、親要素を継承するので、だんだんわからなくなる。
(例) html { font-size: 14px; } ul li { font-size: 86%; }
li はどんどん小さくなる<ul> <li>aaa <- 12px <ul> <li>aaa</li> <- 10px </ul> </li> </ul>
14px × 0.86 × 0.86 = ???
27
rem (root em) ルート要素(htmlタグ)を基準とした相対サイズ(例) html { font-size: 14px; } ul li { font-size: 0.857142857rem; }
li は 12px で変わらない。<ul> <li>aaa <- 12px <ul> <li>aaa</li> <- 12px </ul> </li> </ul>
28
TwentyTwelve - style.css html { font-size: 87.5%; } ← ブラウザのデフォルトが16px
基準の文字サイズが 14px なので、各フォントサイズは下記のようになる
16px = 1.142857143rem 12px = 0.857142857rem 11px = 0.785714286rem 10px = 0.714285714rem
こんなの、 おぼえられないのだー
29
「こんなの、覚えられないよ!」というあなた!子テーマの style.css の最初にこう書いてしまいましょう。html { font-size: 10px; }
これで、基準の文字サイズが 10pxになったので、
16px = 1.6rem 12px = 1.2rem 11px = 1.1rem 10px = 1rem
これなら、 わかりやすいのだー
30
style.css では、なぜ rem の前に px を重複して指定しているのか.site-header h1 { font-size: 24px; font-size: 1.714285714rem; }
というと・・・
ie8以前は rem に対応していない のでした・・・
みんな、さっさと バージョンアップ してほしいのだ!
31
タイトルに勝手にサイト名が付いて、 SEO対策のプラグインを入れると 変なタイトルになってしまう!
All in One SEO Pack、Headspace2 などのSEO対策用プラグインで、タイトルに自動でキーワードやサイト名を挿入する対策を行うとき
TwentyTwelve で、これらのプラグインを推奨設定にすると、 投稿のタイトルにサイト名がダブってしまう
・All in One SEOの設定 %post_title% | %blog_title%
・出力されたTitleタグ <title>投稿Cherry Pie Wordpress | Cherry Pie Wordpress</title>
↑ 投稿名になぜかサイト名が付いてしまう
32
TwentyEleven から、プラグイン無しの状態でも タイトルにサイト名が入るようになっている
TwentyEleven は、テンプレートファイル header.php に 処理が書いてあったので、子テーマで変更してやればよかったが、 TwentyTwelve では、functions.php に書かれてしまっているので、 テンプレートファイルでは変更できない
TwentyTwelve - functions.php function twentytwelve_wp_title( $title, $sep ) { ・・・ (タイトルにサイト名を追加する処理) ・・・ } add_filter( 'wp_title', 'twentytwelve_wp_title', 10, 2 );
33
add_filter されている処理は、 remove_filter で削除できる
でも・・・ functions.php は、 子テーマ → 親テーマ の順で読み込まれるので、
子テーマの functions.php で単に remove_filter( 'wp_title', 'twentytwelve_wp_title');
と書いても、そのあとで親テーマで add_filterされてしまう・・・
34
親テーマの functions.php の 処理を変更したい!
子テーマで親テーマの処理を変更したいときは、 アクションフック after_setup_theme を使う
子テーマ - functions.php function wbkyoto_theme_setup () { remove_filter( 'wp_title', 'twentytwelve_wp_title'); } add_action( 'after_setup_theme', 'wbkyoto_theme_setup' );
TwentyTwelve に限らず、 子テーマで親テーマの functions.php 内の処理を変えたり キャンセルするときには、上記の関数の中に追加していけばよい
35
親テーマやプラグインの functions.php の中で、 after_setup_theme でフックされている処理は どうするか?add_action() は、第3引数が小さいほうが先に実行される
TwentyTwelve の functions.php にも after_setup_theme でフックされている関数があるが、 第3引数が設定されていない(デフォルト値=10)ので、 第3引数に10より大きな数値をつければ、上書きできるfunction child_theme_setup () { (親テーマの処理を上書きする処理) } add_action( 'after_setup_theme', 'child_theme_setup', 20 );