補習 WordPressがテーマを認識する仕組みがちょっぴりわかった

WordPressがテーマを認識する仕組みについて急に不思議に思ったので
「自習 テーマに関するコアファイルを調べてみた。」に書いたようにテーマに関すると思われるコアファイルを調べてはみたものの、わかったようなわからないような。。

引き続き調べてみよう、と思っていました。

そしたら。。。

補習その1 file_existsとis_readableで存在チェック

ヒントをいただきました!

class-wp-theme.phpの

if ( is_array( $cache ) ) {
               foreach ( array( 'errors', 'headers', 'template' ) as $key ) {
                    if ( isset( $cache[ $key ] ) )
                         $this->$key = $cache[ $key ];
               }
               if ( $this->errors )
                    return;
               if ( isset( $cache['theme_root_template'] ) )
                    $theme_root_template = $cache['theme_root_template'];
          } elseif ( ! file_exists( $this->theme_root . '/' . $theme_file ) ) {
               $this->headers['Name'] = $this->stylesheet;
               if ( ! file_exists( $this->theme_root . '/' . $this->stylesheet ) )
                    $this->errors = new WP_Error( 'theme_not_found', __( 'The theme directory does not exist.' ) );
               else
                    $this->errors = new WP_Error( 'theme_no_stylesheet', __( 'Stylesheet is missing.' ) );
               $this->template = $this->stylesheet;
               $this->cache_add( 'theme', array( 'headers' => $this->headers, 'errors' => $this->errors, 'stylesheet' => $this->stylesheet, 'template' => $this->template ) );
               if ( ! file_exists( $this->theme_root ) ) // Don't cache this one.
                    $this->errors->add( 'theme_root_missing', __( 'ERROR: The themes directory is either empty or doesn’t exist. Please check your installation.' ) );
               return;
          } elseif ( ! is_readable( $this->theme_root . '/' . $theme_file ) ) {
               $this->headers['Name'] = $this->stylesheet;
               $this->errors = new WP_Error( 'theme_stylesheet_not_readable', __( 'Stylesheet is not readable.' ) );
               $this->template = $this->stylesheet;
               $this->cache_add( 'theme', array( 'headers' => $this->headers, 'errors' => $this->errors, 'stylesheet' => $this->stylesheet, 'template' => $this->template ) );
               return;
          } else {
               $this->headers = get_file_data( $this->theme_root . '/' . $theme_file, self::$file_headers, 'theme' );
               // Default themes always trump their pretenders.
               // Properly identify default themes that are inside a directory within wp-content/themes.
               if ( $default_theme_slug = array_search( $this->headers['Name'], self::$default_themes ) ) {
                    if ( basename( $this->stylesheet ) != $default_theme_slug )
                         $this->headers['Name'] .= '/' . $this->stylesheet;
               }
          }

とかあるあたりっぽい。

file_existsとis_readableのとこで存在チェックして、状況に応じてテーマ・ディレクトリが、存在しないとか、style.cssがないとかそういうエラーをだすようになってる。

ふむふむ。ちょっとずつだけどわかってきたよ。

ちなみに
file_exists→ファイルまたはディレクトリが存在するかどうか調べる
is_readable→ファイルが存在し、読み込み可能であるかどうかを調べる
です。

そしてその夜。。

補習その2 get_file_data

検索しました、ありましたっ!

get_file_data:WordPress私的マニュアル

「get_file_data- WordPress規定のヘッダー情報を取得する」とあります。

これです!これ!

これでstyle.cssのヘッダー情報持ってきてるんですね

file_existsとis_readableでstyle.cssがあるかをチェック。
なければそれに応じたエラーを出して、きちんとあれば
WP_Theme Class(class-wp-theme.php)の中で定義されたファイルのヘッダー情報をget_file_dataで取得。

ってな流れでいいのかな。間違ってたら教えてください。。

つながってなかった知識

そしてさらに検索するとこの記事。

プラグインでバージョン情報を使いたいときは、get_file_data を用いるととってもエコなのよ

これ、読んでたんです。でも全くつながってなかった。。><

仕事でやってたり、ブログ読んだり、
断片的に色々入って来てるはずなんだけど、
自分の中でうまく消化されてないというか、
つながってないんだなぁーと、しみじみ思いました。

今回は本当に興味だけで調べ始めて、
いろんなことが少しずつつながっていくのが、
急に目の前がひらけたみたいになって面白かったです。

とはいっても、まだまだ「ココにかいてある〜♪」レベルなので
もっとソースコードしっかり読める様になりたいです。

おまけ

ちなみにget_file_dataは/wp-includes/functions.php にあるというのでちょっと見てみた。

function get_file_data( $file, $default_headers, $context = '' ) {
     // We don't need to write to the file, so just open for reading.
     $fp = fopen( $file, 'r' );

     // Pull only the first 8kiB of the file in.
     $file_data = fread( $fp, 8192 );

     // PHP will close file handle, but we are good citizens.
     fclose( $fp );

     // Make sure we catch CR-only line endings.
     $file_data = str_replace( "\r", "\n", $file_data );

     if ( $context && $extra_headers = apply_filters( "extra_{$context}_headers", array() ) ) {
          $extra_headers = array_combine( $extra_headers, $extra_headers ); // keys equal values
          $all_headers = array_merge( $extra_headers, (array) $default_headers );
     } else {
          $all_headers = $default_headers;
     }

     foreach ( $all_headers as $field => $regex ) {
          if ( preg_match( '/^[ \t\/*#@]*' . preg_quote( $regex, '/' ) . ':(.*)$/mi', $file_data, $match ) && $match[1] )
               $all_headers[ $field ] = _cleanup_header_comment( $match[1] );
          else
               $all_headers[ $field ] = '';
     }

     return $all_headers;
}

うむむ。。またしてもクラクラするのでこれは次回以降への宿題。。です。

class-wp-theme.phpも、もうちょっと見てみたいな。

補習してくださった@HissyNC さん、@jim0912 さん、本当にありがとうございました。

コメントをどうぞ♪