Simplicityの特徴 › フォーラム › 要望・機能追加など › 子テーマでのスキン管理について
-
投稿者投稿
-
-
2014年11月26日 3:08 PM #10105
遠藤
ゲストいつもお世話になっております。
カスタマイズする時に「子テーマ」って便利なんですね。
WPは初心者なので、このサイトで勉強中です。
そこで「子テーマ」でスキン管理ができれば update の時に
便利ではないかと思い投稿させていただきました。// 親 functions.php
// スキンとなるファイルの取得if(!function_exists('get_skin_files')){ function get_skin_files(){ // ~ } }// 子 functions.php
// スキンとなるファイルの取得 function get_skin_files(){ define( 'FS_METHOD', 'direct' ); $parent = false; // 親skinsを含める場合は true $files = array(); //親skinsフォルダ内を検索 if($parent){ $dir = dirname(__FILE__) . '/../simplicity/skins/'; $files = get_file_list($dir); } //子skinsフォルダ内を検索 $dir = dirname(__FILE__) . '/skins/'; if(file_exists($dir)){ array_splice($files,count($files),0,get_file_list($dir)); } // 親 functions.php の $results = array(); 以下 } -
2014年11月26日 5:19 PM #10113
遠藤
ゲストあ、一箇所間違って投稿してしましました。
正しくはこちらです。
//子skinsフォルダ内を検索 $dir = dirname(dirname(__FILE__).'/../').'/skins/'; -
2014年11月26日 5:54 PM #10115
わいひらキーマスターいつもありがとうございます。
なるほど。
その発想はなかったです。
確かに、今のままだと親テーマのスキンを編集しても普通にアップデートしたら上書きしてしまいますものね。早速実装してみました。
次のバージョンで反映されると思います。ただ、一つ質問です。
//子skinsフォルダ内を検索 $dir = dirname(dirname(__FILE__).'/../').'/skins/';と
//子skinsフォルダ内を検索 $dir = dirname(__FILE__) . '/skins/';は、どちらも意図通りに動作する(同じ結果になる)のですけど、前者はどうしてそのようにした方がよいのでしょうか?
-
2014年11月26日 9:56 PM #10150
遠藤
ゲストわいひらさん お手数をお掛けしております。
子 functions.php の件ですが、
あまりテストしないままアップしましたので
書き直しました。こちらに修正していただければ幸いです。
よろしくお願い致します。
//スキンとなるファイルの取得 function get_skin_files(){ define( 'FS_METHOD', 'direct' ); $parent = true; // 親skinsフォルダ内を含める場合は true $files = array(); //親skinsフォルダ内を検索 if($parent){ $dir = get_template_directory().'/skins/'; $files = get_file_list($dir); } //子skinsフォルダ内を検索 $dir = get_stylesheet_directory().'/skins/'; if(file_exists ($dir)){ array_splice($files,count($files),0,get_file_list($dir)); } //置換DIR $this_dir = str_replace('\\', '/', dirname(__FILE__)); $this_ary = explode('/', $this_dir); array_pop($this_ary); $this_dir = implode ('/',$this_ary); //置換URI $uri_dir = get_template_directory_uri(); $uri_ary = explode('/', $uri_dir); array_pop($uri_ary); $uri_dir = implode ('/',$uri_ary); $results = array(); foreach($files as $pathname){ $pathname = str_replace('\\', '/', $pathname); if (preg_match('/([a-zA-Z\-_]+).style\.css$/i', $pathname, $matches)){//フォルダ名の正規表現が[a-zA-Z\-_]+のとき $dir_name = strip_tags($matches[1]); if ( WP_Filesystem() ) {//WP_Filesystemの初期化 global $wp_filesystem;//$wp_filesystemオブジェクトの呼び出し $css = $wp_filesystem->get_contents($pathname);//$wp_filesystemオブジェクトのメソッドとして呼び出す if (preg_match('/Name: *(.+)/i', $css, $matches)) {//CSSファイルの中にName:の記述があるとき if (preg_match('/Priority: *(.+)/i', $css, $m)) {//優先度(順番)が設定されている場合は順番取得 $priority = intval($m[1]); } else { $priority = 9999; } //返り値の設定 $results[] = array( 'name' => trim(strip_tags($matches[1])), 'dir' => $dir_name, 'priority' => $priority, 'path' => str_replace($this_dir, $uri_dir, $pathname), ); } } } } uasort($results, 'skin_files_comp');//スキンを優先度順に並び替え return $results; } -
2014年11月26日 10:54 PM #10151
わいひらキーマスターおお!ありがとうございます。
そっか、get_template_directoryとget_stylesheet_directoryという関数がありましたね。
普段よく使っているのに思いつかなかった;
早速、適用して動作確認してみます。 -
2014年11月27日 9:48 AM #10186
遠藤
ゲストいつもありがとうございます。
親 functions.php について
修正した子テーマ functions.php (上記)5行目から18行目を
//skinsフォルダ内を検索 $dir = get_stylesheet_directory().'/skins/'; if(is_child_theme() && file_exists($dir)){ $files = get_file_list($dir); }else{ $dir = get_template_directory().'/skins/'; $files = get_file_list($dir); }のように変更して親テーマの functions.php にすれば
子テーマで functions.php に手を加えなくても済むので
ご検討頂ければ幸いです。この場合、子テーマのskinsフォルダを設置した場合のみ
テーマのskinsが使われることになりシンプルかと思います。 -
2014年11月27日 10:41 AM #10189
わいひらキーマスターなるほど。
確かにそっちの方が断然スマートな方法ですね。
あとで修正しておこうと思います。 -
2014年11月28日 10:57 AM #10288
遠藤
ゲストお世話になっております。
テーマの更新早いですね!
最新版ダウロードさせて頂きました。
これは提案なんですが、get_skin_files() の
$parent = true; の下に例えば、
// 子テーマで 親skins の取得有無の設定 if(function_exists('set_skin_parent')){ $parent = set_skins_parent(); }子テーマで設定を変更する場合は functions.php に
// 親skins の取得有無の設定 function set_skins_parent(){ return true; //親skinsを含める場合はtrue、含めない場合はfalse }こんな感じではどうでしょうか?
あと提案したときには気付かなかったんですが
変数の判読性の観点から//置換DIR
$search = implode (‘/’,$this_ary);//置換URI
$replace = implode (‘/’,$uri_ary);‘path’ => str_replace($search, $replace , $pathname)
みたいな感じに変更した方がいいかも?
-
2014年11月28日 5:40 PM #10309
わいひらキーマスターそんな方法ができるのですね。
目から鱗です。
これから適用して試してみます。読みやすさは大事なので、判読性の部分も修正しておきます。
-
2014年11月28日 6:04 PM #10311
遠藤
ゲストお忙しい中、返信有難うございました。
一箇所訂正です。skins の部分が skin になってました。
正しくはこちら
if(function_exists(‘set_skins_parent’)){それと子テーマで get_skin_files() の再定義の
必要性が無くなったので、親テーマの
if(!function_exists(‘get_skin_files’)){の部分は不要でいいのかなと思います。
-
2014年11月28日 10:06 PM #10326
わいひらキーマスター親テーマの
if(!function_exists(‘get_skin_files’)){の部分は不要でいいのかなと思います
消し忘れてました;
ただ、このトピックの最初で思ったのですが、抜粋を取得する関数とか、今回のスキン関数とか、その他メイン機能をつかさどる主要な関数は、!function_existsを付けて子テーマ側で編集できても良いのかもと思って迷っています。
ユーザーが自由に主要関数動作をいじってカスタマイズできるようになってもよいのかなと。
反面、そこまでして使う人はいないだろうという思いと、インデントが増えてコードの可読性が下がるので、リクエストがない限りは、このままで行こうとは思っているのですけど。 -
2014年11月29日 9:44 AM #10362
遠藤
ゲスト確かにあった方が自由度が高まりますが
可読性やレスポンス、需要度を考慮すると!function_exists は無くていいと思います。
必要な場合は自分で出来る範囲だと思いますし、
コアな部分のコードはシンプルで読みやすい方が
結果的にカスタマイズしやすいからです。僕は、WP自体デフォルト以外で使用した経験が
無く、子テーマって何?というレベルです。使い方を知ったら、コレは便利!
ということで、マルチサイトや別サイトを
構築するときに1つの子テーマに複数のskin
を用意しておけば設定が超簡単ですよね。Simplicity は本来プラグインしなければ
ならないような機能がはじめから実装され
ていて、オールインワン的な特徴が気に
入っています。プラグインが多いとレスポンスの低下や
update管理や設定が大変になってくるので
本当に助かります。 -
2014年11月29日 10:50 AM #10366
わいひらキーマスター今回のカスタマイズは、カスタマイザー画面でしか使用しないからいいけど、通常利用する関数は、function_existsを利用すると、かなり遅くなりそうなことを考えると、やっぱなしですね。
最近、関数までカスタマイズして使用されている方のブログを見たので、いろいろ考えてました。確かに、マルチサイトをするときに、子テーマでスキンを設定できれば、その子テーマ一つだけ管理していれば良いですもんね。今回は、良いアイディアいただきありがとうございます。
僕も、Simplicityを作るまでは、Wordpressに関するプログラムをやったことがなく、言語ももっぱらRubyで、PHPで何か作ったことがなかったので、また至らぬ点があるかもしれませんが、よろしかったらアドバイスお願いします。
-
-
投稿者投稿
- トピック「子テーマでのスキン管理について」には新しい返信をつけることはできません。