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

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

このトピックには12件の返信が含まれ、2人の参加者がいます。4 年、 8 ヶ月前わいひら わいひら さんが最後の更新を行いました。

  • 投稿者
    投稿
  • #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で何か作ったことがなかったので、また至らぬ点があるかもしれませんが、よろしかったらアドバイスお願いします。

トピック「子テーマでのスキン管理について」への新規返信追加は締め切られています。

スポンサーリンク
アドセンス(大)
アドセンス(大)