子テーマでのスキン管理について

Simplicityの特徴 フォーラム 要望・機能追加など 子テーマでのスキン管理について

  • このトピックには12件の返信、2人の参加者があり、最後にわいひら わいひらにより5年前に更新されました。
12件の返信スレッドを表示中
  • 投稿者
    投稿
    • #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(); 以下 
      }
    • #10113
      遠藤
      ゲスト

      あ、一箇所間違って投稿してしましました。

      正しくはこちらです。

      //子skinsフォルダ内を検索
      $dir = dirname(dirname(__FILE__).'/../').'/skins/';
    • #10115
      わいひらわいひら
      キーマスター

      いつもありがとうございます。

      なるほど。
      その発想はなかったです。
      確かに、今のままだと親テーマのスキンを編集しても普通にアップデートしたら上書きしてしまいますものね。

      早速実装してみました。
      次のバージョンで反映されると思います。

      ただ、一つ質問です。

      //子skinsフォルダ内を検索
      $dir = dirname(dirname(__FILE__).'/../').'/skins/';

      //子skinsフォルダ内を検索
      $dir = dirname(__FILE__) . '/skins/';

      は、どちらも意図通りに動作する(同じ結果になる)のですけど、前者はどうしてそのようにした方がよいのでしょうか?

    • #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;
      }
    • #10151
      わいひらわいひら
      キーマスター

      おお!ありがとうございます。
      そっか、get_template_directoryとget_stylesheet_directoryという関数がありましたね。
      普段よく使っているのに思いつかなかった;
      早速、適用して動作確認してみます。

    • #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が使われることになりシンプルかと思います。

    • #10189
      わいひらわいひら
      キーマスター

      なるほど。
      確かにそっちの方が断然スマートな方法ですね。
      あとで修正しておこうと思います。

    • #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)

      みたいな感じに変更した方がいいかも?

    • #10309
      わいひらわいひら
      キーマスター

      そんな方法ができるのですね。
      目から鱗です。
      これから適用して試してみます。

      読みやすさは大事なので、判読性の部分も修正しておきます。

    • #10311
      遠藤
      ゲスト

      お忙しい中、返信有難うございました。

      一箇所訂正です。skins の部分が skin になってました。

      正しくはこちら
      if(function_exists(‘set_skins_parent’)){

      それと子テーマで get_skin_files() の再定義の
      必要性が無くなったので、

      親テーマの
      if(!function_exists(‘get_skin_files’)){

      の部分は不要でいいのかなと思います。

    • #10326
      わいひらわいひら
      キーマスター

      親テーマの
      if(!function_exists(‘get_skin_files’)){

      の部分は不要でいいのかなと思います

      消し忘れてました;

      ただ、このトピックの最初で思ったのですが、抜粋を取得する関数とか、今回のスキン関数とか、その他メイン機能をつかさどる主要な関数は、!function_existsを付けて子テーマ側で編集できても良いのかもと思って迷っています。

      ユーザーが自由に主要関数動作をいじってカスタマイズできるようになってもよいのかなと。
      反面、そこまでして使う人はいないだろうという思いと、インデントが増えてコードの可読性が下がるので、リクエストがない限りは、このままで行こうとは思っているのですけど。

    • #10362
      遠藤
      ゲスト

      確かにあった方が自由度が高まりますが
      可読性やレスポンス、需要度を考慮すると

      !function_exists は無くていいと思います。

      必要な場合は自分で出来る範囲だと思いますし、
      コアな部分のコードはシンプルで読みやすい方が
      結果的にカスタマイズしやすいからです。

      僕は、WP自体デフォルト以外で使用した経験が
      無く、子テーマって何?というレベルです。

      使い方を知ったら、コレは便利!

      ということで、マルチサイトや別サイトを
      構築するときに1つの子テーマに複数のskin
      を用意しておけば設定が超簡単ですよね。

      Simplicity は本来プラグインしなければ
      ならないような機能がはじめから実装され
      ていて、オールインワン的な特徴が気に
      入っています。

      プラグインが多いとレスポンスの低下や
      update管理や設定が大変になってくるので
      本当に助かります。

    • #10366
      わいひらわいひら
      キーマスター

      今回のカスタマイズは、カスタマイザー画面でしか使用しないからいいけど、通常利用する関数は、function_existsを利用すると、かなり遅くなりそうなことを考えると、やっぱなしですね。
      最近、関数までカスタマイズして使用されている方のブログを見たので、いろいろ考えてました。

      確かに、マルチサイトをするときに、子テーマでスキンを設定できれば、その子テーマ一つだけ管理していれば良いですもんね。今回は、良いアイディアいただきありがとうございます。

      僕も、Simplicityを作るまでは、Wordpressに関するプログラムをやったことがなく、言語ももっぱらRubyで、PHPで何か作ったことがなかったので、また至らぬ点があるかもしれませんが、よろしかったらアドバイスお願いします。

12件の返信スレッドを表示中
  • トピック「子テーマでのスキン管理について」には新しい返信をつけることはできません。
スポンサーリンク
アドセンス(大)
アドセンス(大)