VPS(ConoHa)+Kusanagi+WordPress上でSimplicityのスキン選択機能が動かない

Simplicityの特徴 フォーラム 不具合報告 VPS(ConoHa)+Kusanagi+WordPress上でSimplicityのスキン選択機能が動かない

9件の返信スレッドを表示中
  • 投稿者
    投稿
    • #50875 返信
      curo
      ゲスト

      Simplicity2を使わせていただいております。ありがとうございます。

      Simplicityの外観を手軽に変更しますというスキンの選択機能で、
      選択肢に
      選択しない(デフォルト)
      しか表示されず、何故かなと苦慮しております。

      動作不良時の対応のページを参考に、
      キャッシュを消したり、プラグインをすべて停止したりなど試しました。

      環境が、ConoHaというVPSで、kusanagiを使用しており、
      関係があるのか分からないのですが、
      HVMM・PHP7・PHP5モードとそれぞれ切り替えましたが、
      やはりスキン機能だけ選択肢が出ませんでした。

      Simplicity2.4.9 2.4.0 2.3.0と入れて試しましたがだめでした。

      別で借りているレンタルサーバー(共用)だと、スキンの選択は問題なく機能していたので、
      VPS+kusanagi+WordPressだと何か影響しているのかなと思うのですが・・・。

      kusanagiの機能のページキャッシュ機能やデバイスによるテーマ切替機能は停止にしています。

      VPSを1から建てて、なるべく手を加えない状態で確認してみましたが、やはりできませんでした。

      もし、どなたかお心当たりがあれば教えていただければ幸いです。

      ブラウザ環境は、Windows10でGoogle ChromeとEdgeで試しています。

      サイトは https://curo.jp です

      よろしくお願いします。

    • #50876 返信
      curo
      ゲスト

      追伸

      動かないのは、そのスキン選択機能だけなので、
      子テーマを編集したりすれば、特に問題はありません。

      他の機能でまた何か問題あれば、報告したいと思います。

    • #50891 返信
      わいひらわいひら
      キーマスター

      僕からは、個々のサーバーの設定は分かりません。
      なので、以下のスキンリスト表示で利用するコードの中から、サーバーで使用できない関数とかがないかをを調べていただくしかないかもしれません。

      //フォルダ以下のファイルをすべて取得
      function get_file_list($dir) {
        $list = array();
        $files = scandir($dir);
        foreach($files as $file){
          if($file == '.' || $file == '..'){
            continue;
          } else if (is_file($dir . $file)){
            $list[] = $dir . $file;
          } else if( is_dir($dir . $file) ) {
              //$list[] = $dir;
            $list = array_merge($list, get_file_list($dir . $file . DIRECTORY_SEPARATOR));
          }
        }
        return $list;
      }
      
      //スキンとなるファイルの取得
      function get_skin_files(){
        define( 'FS_METHOD', 'direct' );
      
        $parent = true;
        // 子テーマで 親skins の取得有無の設定
        if(function_exists('include_parent_skins')){
          $parent = include_parent_skins();
        }
      
        $files  = array();
        $child_files  = array();
        $parent_files  = array();
      
        //子skinsフォルダ内を検索
        $dir = get_stylesheet_directory().'/skins/';
        if(is_child_theme() && file_exists($dir)){
          $child_files = get_file_list($dir);
        }
      
        //親skinsフォルダ内を検索
        if ( $parent || !is_child_theme() ){//排除フラグが立っていないときと親テーマのときは取得
          $dir = get_template_directory().'/skins/';
          $parent_files = get_file_list($dir);
        }
      
        //親テーマと子テーマのファイル配列をマージ
        $files = array_merge( $child_files, $parent_files );
      
        //置換DIR
        $this_dir = str_replace('\\', '/', dirname(__FILE__));
        $this_ary = explode('/', $this_dir);
        array_pop($this_ary);
        $search = implode ('/',$this_ary);
      
        //置換URI
        $uri_dir = get_template_directory_uri();
        $uri_ary = explode('/', $uri_dir);
        array_pop($uri_ary);
        $replace = implode ('/',$uri_ary);
      
        $results = array();
        foreach($files as $pathname){
          $pathname = str_replace('\\', '/', $pathname);
      
          if (preg_match('/([a-zA-Z0-9\-_]+).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 = floatval($m[1]);
                } else {
                  $priority = 9999;
                }
                $name = trim(strip_tags($matches[1]));
                if ( is_parts_skin_file($pathname) )//パーツスキンの場合
                  $name = '[P] '.$name;
      
                $file_path = str_replace($search, $replace , $pathname);
                $file_path = remove_protocol($file_path);
                //返り値の設定
                $results[] = array(
                  'name' => $name,
                  'dir' => $dir_name,
                  'priority' => $priority,
                  'path' => $file_path,
                );
              }
            }
          }
        }
        uasort($results, 'skin_files_comp');//スキンを優先度順に並び替え
      
        return $results;
      }
    • #50892 返信
      わいひらわいひら
      キーマスター

      Simplicityで定義している関数もあるので、詳しくはfunctions.phpを参照してください。

    • #56569 返信
      さすけ
      ゲスト

      Simplicity2を快適に使用させていただいております。

      さて、私も同じように”kusanagi+Simplicity2″で使用しているのですがテーマカスタマイザーのスキンの選択でやはり一覧表示されませんでした。
      何か情報がないかと調べていた際に、こちらの投稿を見つけた次第です。

      わいひらさんの「使用できない関数がある~」という書き込みから、少し調べてみました。その結果、表示ができない原因が特定できましたのでお知らせいたします。
      ※PHPは普段書かないため的外れでしたら平にご容赦を。

      “functions.php”の「function get_skin_files()」内において”WP_Filesystem()”を初期化する箇所がありますが、kusanagiの環境の場合ですと初期化できず失敗します。

      if ( WP_Filesystem() ) {
      ↑こちらのif文において、falseを返しているため、以降の処理をスキップします。このため、必要な返り値を取得できず一覧表示できません。

      初期化失敗の原因ですが、kusanagiはセキュリティ向上のためにプラグインやテーマのインストールといった、ファイルシステムに干渉する動作を行う場合、FTPアカウントでの認証が入ります。

      WP_Filesystem()を初期化する場合、認証を有効にしたシステムの場合、認証結果を引数として渡さない限りfalseを返す仕様です。
      このため、Simplicity2においては認証結果を渡していないので、kusanagiで使用する場合は一覧表示に失敗します。

      wordpressではこういったケースにおいて”WP_Filesystem()”を初期化するために強制的に認証させる”request_filesystem_credentials()”という関数があります。
      これをWP_Filesystem()の直前に記述することでエラーを回避できます。

      “request_filesystem_credentials()”の動作はざっと以下のようになります。

      • まず認証なしに直接書き込み可能かどうかをテストし、問題なければ認証は発生しません。
      • 認証が必要な場合、”wp-config.php”で記述されているアカウント・パスワード情報を利用します。
      • 上記のいずれにも当てはまらない場合、認証のフォームを表示し手動入力にて認証します。

      今回は2番目の”wp-config.php”を利用した認証コードを付け加えてみたところ、問題なくスキン一覧が表示されました。
      具体的なコードは次の通りです。

      $creds = request_filesystem_credentials();
      if ( WP_Filesystem($creds) ) {//WP_Filesystemの初期化

      “request_filesystem_credentials()”関数はPOST先のURL指定などのオプションがあるのですが、”wp-config.php”の情報で強制的に認証させるため、何も付与していません。

      そして、wp-config.php内において
      define(‘FTP_PASS’, ‘hogehoge’);
      を追記します。
      ※kusanagiシステムの場合ですとユーザー名やFTPホスト等は記載済みです

      私の環境ではこの対応でスキン選択の一覧表示から適用まで行えたことを確認しております。

      なお、”wp-config.php”にパスワードをハードコーディングしているのでせっかくのセキュリティが台無しです。kusanagiで本当にこの運用する場合はご注意を。

      実際にきちんと実装するのであれば、認証が必要な環境の場合はテーマカスタマイザーにアクセスする前に認証フォームを表示させ、不要な環境ではそのままアクセスさせるといった感じになるかと思います。
      kusanagi環境はVPSで人気なので使用している人も多いかもしれませんが、環境依存なのでどこまで対応するかは難しいところですね。

      参考
      https://wpdocs.osdn.jp/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0API

    • #56583 返信
      わいひらわいひら
      キーマスター

      詳しい情報をありがとうございます!
      “request_filesystem_credentials()”こういった関数があるのを初めて知りました。
      Simplicityは、結構WP_Filesystem()を使っているのですが、問題が出るところは、スキンのところだけっぽいですね。
      なので、スキンのところの「WP_Filesystem()」は、「WP_Filesystem(request_filesystem_credentials())」に変更してみようと思います。

      まず認証なしに直接書き込み可能かどうかをテストし、問題なければ認証は発生しません。

      とのことなので、kusanagiではなく、通常のレンタルサーバー環境だと、そのように書いても多分問題ないのかなと。
      ちょっと、変更して動作テストを行ってみます。

      テーマカスタマイザーでの対応は、「どれほどの需要があるか?」を判断してからになるかもしれません。
      ほとんど使用しないのに、機能が増えても、混乱するだけだったりするので。
      おっしゃる通りここら辺は難しいところですね。

    • #56584 返信
      わいひらわいひら
      キーマスター

      ローカル環境で以下のコードを試してみました。
      if ( WP_Filesystem(request_filesystem_credentials()) ) {//WP_Filesystemの初期化
      ”wp-config.php”を設定しないで、引数なしで試してみたら、以下のようなエラーコードが出ました。

      ( ! ) Fatal error: Uncaught ArgumentCountError: Too few arguments to function request_filesystem_credentials(), 0 passed in /app/public/wp-content/themes/simplicity2/functions.php on line 483 and at least 1 expected in /app/public/wp-admin/includes/file.php on line 1063
      ( ! ) ArgumentCountError: Too few arguments to function request_filesystem_credentials(), 0 passed in /app/public/wp-content/themes/simplicity2/functions.php on line 483 and at least 1 expected in /app/public/wp-admin/includes/file.php on line 1063

      テーマ側で、実装するのであれば、ちゃんと引数を入れないとダメっぽいです。

    • #56586 返信
      さすけ
      ゲスト

      さっそくの検証ありがとうございます。

      私もkusanagi以外の環境で試してみましたところ、確かに引数なしで指定した場合エラーとなりました。
      wp-config.phpありきで認証させる場合ですと、フォームPOST先のURL指定は不要のようでしたので、きちんと指定してみましたところ、エラー回避できました。

      if ( WP_Filesystem(request_filesystem_credentials('', '', false, false, null)) ) {//WP_Filesystemの初期化

      このコードに書き換え、wp-config.phpにてパスワードを記述したkusanagiで正常表示が確認できました。
      また、kusanagi以外の環境でwp-config.phpの編集なしの場合でもエラーは出ずに通常通りの動作となりました。

      この対応を行い、スキン一覧から適用するスキンを設定したあとに、wp-config.phpに記載したパスワードを削除してもスキン設定はきちんと反映され使用できていますので、変更するだけならこれでもいいかな、と個人的には思っております。
      認証フォームを表示させるまで対応すると結構大変そうです。

    • #56587 返信
      さすけ
      ゲスト

      すみません。
      request_filesystem_credentialsを指定してwp-config.phpからパスワードを削除してしまうとkusanagi環境ですと強制的に認証フォームが表示されてしまいました。引数も適当なので使用できないフォームです。

      これだとちょっと使用をためらいますね・・・。
      やはりちゃんと設計しないと難しそうです。もう一歩な感じです。

    • #56593 返信
      わいひらわいひら
      キーマスター

      ローカル環境で、以下のコードをWP_Filesystemの引数にしてみました。
      request_filesystem_credentials('', '', false, false, null)
      僕のローカル環境だと、全く動作に影響はないようです。
      ただ、request_filesystem_credentialsが必要な環境だと、いずれにせよ、「wp-config.phpにパスワード記述」か「ちゃんとした引数の設定」が必要ということですね。
      確かに、もう1歩ですね。

      とりあえず、次のバージョンではせめて子テーマのfunctions.phpからget_skin_files()関数がオーバーライドできるようにはしておこうと思います。

9件の返信スレッドを表示中
返信先: VPS(ConoHa)+Kusanagi+WordPress上でSimplicityのスキン選択機能が動かない
あなたの情報:




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