WordPressのコアファイルの仕組み。3ステップでざっくりまとめ。

WordPressをダウンロードすると入っているたくさんのファイル、どんな構成になっていて、それらがどんなふうに動いているのか、まずは図を見てください。

クリックして拡大してみてください。

3ステップで理解する

ステップ1:3つのフォルダをおさえる

  • 管理画面を表示させているwp-adminフォルダ
  • 一番馴染みの深いwp-contentフォルダ(テーマやプラグイン!)
  • 色んな関数やapiが詰まっているwp-includesフォルダ

それぞれのフォルダの中にも、かなりたくさんのファイルが入ってますが、ここはヒトカラゲにざっくり捉えます。

ステップ2:ブログのトップページが表示されるフローをおさえる

ユーザがブログのトップページに訪れたときに、だいたいどんな処理が行われているのか、それが図の下半分です。
ひとつずつ読んでけば大丈夫です。

この記事の最後に、それぞれのファイルを読んでみた記事のリストがあります。

ステップ3:その他のファイルを覗いてみる

wp-login.phpはユーザ登録、wp-mail.phpは多分メール制御、などですが、ファイルを開いてみると最初にコメントで大体の機能を説明しているので、把握する。

という感じです!

各ファイルの詳細記事案内

上の図に登場するファイルをひとつひとつ読んできました。
それぞれ記事になっていますので、よろしければどぞ!

フロー図に載っているもの(ステップ2のあたり)

WordPressが動くようになるまでを、1ファイルずつ丁寧に見てます。

その他、重要そうなファイル

上のフロー図には登場してないけど、勉強すると理解が深まります!

以上です。

WordPress管理画面の研究2:index.php

前回はファイル構成をみました。

今回は、wordpress/wp-admin/index.phpです。

管理画面の一番最初のファイルです。

コメントと基本の関数ファイルの読み込み

/**
 * Dashboard Administration Panel
 */

/** Load WordPress Bootstrap */
require_once('./admin.php');

/** Load WordPress dashboard API */
require_once(ABSPATH . 'wp-admin/includes/dashboard.php');

管理画面です。
wordpress/wp-admin/admin.phpと、wordpress/wp-admin/includes/dashboard.phpを読み込んでいます。

ウィジェットやJavaScriptなどの読み込み

wp_dashboard_setup();

wp_enqueue_script( 'dashboard' );
wp_enqueue_script( 'plugin-install' );
wp_enqueue_script( 'media-upload' );
wp_admin_css( 'dashboard' );
wp_admin_css( 'plugin-install' );
add_thickbox();

wp_dashboard_setup();は、dashboard.phpで最初に定義されている関数で、その中に、wp_add_dashboard_widget($widget_id, $widget_name, $callback, $control_callback)というダッシュボードに表示されるウィジェットを表示する関数がたくさん入ってます。

wp_enqueue_script()は、JavaScriptファイルをロードする関数です。
wp_admin_css()は、cssファイルをロードする関数です。
add_thickbox()は、投稿画面で画像をアップロードするときにポップアップというかモーダルウィンドウというか、あの効果を使うためのJSやcssが読み込まれます。

変数

$title = __('Dashboard');
$parent_file = 'index.php';

タイトルや親ファイル。

ヘルプメッセージ

add_contextual_help($current_screen,

	'<p>' . __('Welcome to your WordPress Dashboard! You will find helpful tips in the Help tab of each screen to assist you as you get to know the application.') . '</p>' .
	'<p>' . __('The left-hand navigation menu provides links to the administration screens in your WordPress application. You can expand or collapse navigation sections by clicking on the arrow that appears on the right side of each navigation item when you hover over it. You can also minimize the navigation menu to a narrow icon strip by clicking on the separator lines between navigation sections that end in double arrowheads; when minimized, the submenu items will be displayed on hover.') . '</p>' .
	'<p>' . __('You can configure your dashboard by choosing which modules to display, how many columns to display them in, and where each module should be placed. You can hide/show modules and select the number of columns in the Screen Options tab. To rearrange the modules, drag and drop by clicking on the title bar of the selected module and releasing when you see a gray dotted-line box appear in the location you want to place the module. You can also expand or collapse each module by clicking once on the the module&#8217;s title bar. In addition, some modules are configurable, and will show a &#8220;Configure&#8221; link in the title bar when you hover over it.') . '</p>' .
	'<p>' . __('The modules on your Dashboard screen are:') . '</p>' .
	'<p>' . __('<strong>Right Now</strong> - Displays a summary of the content on your site and identifies which theme and version of WordPress you are using.') . '</p>' .
	'<p>' . __('<strong>Recent Comments</strong> - Shows the most recent comments on your posts (configurable, up to 30) and allows you to moderate them.') . '</p>' .
	'<p>' . __('<strong>Incoming Links</strong> - Shows links to your site found by Google Blog Search.') . '</p>' .
	'<p>' . __('<strong>QuickPress</strong> - Allows you to create a new post and either publish it or save it as a draft.') . '</p>' .
	'<p>' . __('<strong>Recent Drafts</strong> - Displays links to the 5 most recent draft posts you&#8217;ve started.') . '</p>' .
	'<p>' . __('<strong>Other WordPress News</strong> - Shows the feed from <a href="http://planet.wordpress.org" target="_blank">WordPress Planet</a>. You can configure it to show a different feed of your choosing.') . '</p>' .
	'<p>' . __('<strong>Plugins</strong> - Features the most popular, newest, and recently updated plugins from the WordPress.org Plugin Directory.') . '</p>' .
	'<p><strong>' . __('For more information:') . '</strong></p>' .
	'<p>' . __('<a href="http://codex.wordpress.org/Dashboard_SubPanel" target="_blank">Dashboard Documentation</a>') . '</p>' .
	'<p>' . __('<a href="http://wordpress.org/support/" target="_blank">Support Forums</a>') . '</p>'
);

管理画面右上の、「ヘルプ」というところをクリックすると出てくる、管理画面のお助けコンテンツです。
多分、一つ目の引数で表示場所を指定して、2個目の引数でメッセージ内容を記述。

HTMLソースを作る

最後に、色々と組み合わせてHTMLを作ってます。

require_once('./admin-header.php');

$today = current_time('mysql', 1);
?>

<div class="wrap">
<?php screen_icon(); ?>
<h2><?php echo esc_html( $title ); ?></h2>

<div id="dashboard-widgets-wrap">

<?php wp_dashboard(); ?>

<div class="clear"></div>
</div><!-- dashboard-widgets-wrap -->

</div><!-- wrap -->

<?php require(ABSPATH . 'wp-admin/admin-footer.php'); ?>

admin-header.php読み込み、タイトル書き出し、wp_dashboard()、admin-footer.php読み込みです。

WordPress管理画面の研究1:ファイルの構成

WordPressの管理画面がどのような仕組みで動いているのか、研究したいと思います。

ファイルの構成

URLを見てみると、管理画面のダッシュボードは、http://www.example.com/wp/wp-admin/index.phpとなっているので、大体がwp-adminディレクトリに入っているのでしょう。

主なところを見繕うと、

index.php
最初に読まれるファイルですし。
admin.php
パッと見、色々設定がありそうでした。
includes/dashboard.php
ダッシュボード、どうやって動いてるんでしょう。他にも、includesディレクトリにたくさん色々入ってます
admin-header.php / admin-footer.php
管理画面全体で共有されていると思われる、ヘッダ、フッタの出力用?
post.php / post-new.php
投稿の仕組みは抑えたい
upload.php / themes.php / plugins.php / users.php / tools.php など
左側メニューのリンク先でした。
cssディレクトリ
62個のcssが入っているのですが。。。
jsディレクトリ
60個のJavaScriptファイルが入ってます。

というわけで、次回以降、少しずつ色々見ていきたいと思います。

プラグインの研究:Absolute Privacyを読んでみる5:メンバ関数を全部読む

というわけで、一行目に戻って、プラグインの中の様々な関数の定義を読みます。

あと、前回勉強したプラグインがどうして動くのか?については、WordPress プラグイン作成時のノウハウがとっても分かりやすかったので、おすすめです。
この後編を読んで分かったのですが、

add_action( 'register_form', array(&$absolutePrivacy, 'registrationBox'));

の2個目の引数は、クラスを利用しているのでこういう書き方になっているのですね。

クラスの定義

if (!class_exists("absolutePrivacy")) {
class absolutePrivacy {

absolutePrivacyというクラスが存在していなければ、以下定義します。
続きを読む プラグインの研究:Absolute Privacyを読んでみる5:メンバ関数を全部読む

プラグインの研究:Absolute Privacyを読んでみる4:プラグインはなぜ動くのか

前回は、フォームを見て、どんな画面に対する処理なのかを把握しましたが、次は、定義されたプラグインがどのように実行されるのかを見ます。

どのプラグインでも共通の方法があると思われます。

調べた過程を書いていきます。

プラグインを有効にする

if (isset($absolutePrivacy)) {
	register_activation_hook(__FILE__, array(&$absolutePrivacy, 'createRole')); //adds role on activation
	register_deactivation_hook(__FILE__, array(&$absolutePrivacy, 'destroyRole')); //removes role on deactivation

プラグイン有効化時に実行される関数の登録

関数リファレンス/register activation hookによれば、

関数register_activation_hook(WordPress2.0より導入)はプラグインが有効化されたときに実行される関数を登録します。

とあります。

register_activation_hookの使い方

使用方法として、

<?php register_activation_hook($file, $function); ?>

とあり、
$fileにはプラグインのフルパス、
$functionにはプラグインが有効化されたときに実行される関数、を入れます。

Absolute Privacyでは、

register_activation_hook(__FILE__, array(&$absolutePrivacy, 'createRole'));

とあるので、このファイルへのフルパス(__FILE__)にあるcreateRole関数を実行します。

createRole()の定義は後々見ていきます。

プラグインフックについて

次に、add_action()やadd_filter()、do_action()、apply_filters()って何?について理解したい。

Absolute Privacy内で使われているところ

	if( isset($_GET['action']) && ($_GET['action'] == 'register') ) add_action( 'login_head', array(&$absolutePrivacy, 'regCSS')); //adds registration form CSS
	add_action( 'register_form', array(&$absolutePrivacy, 'registrationBox'));	//adds password field to registration box
	add_filter( 'registration_errors', array(&$absolutePrivacy, 'checkRegErrors')); //adds registration form error checks
	add_action('user_register', array(&$absolutePrivacy, 'addNewUser')); //adds registration info to database

	add_action('admin_menu', array(&$absolutePrivacy, 'installOptionsMenu')); //install the options menu
	add_action('admin_menu', array(&$absolutePrivacy, 'moderateMenu')); 
	add_action('template_redirect', array(&$absolutePrivacy, 'lockDown'));
	add_filter('the_content', array(&$absolutePrivacy, 'check_is_feed'));
	add_action('init', array(&$absolutePrivacy, 'adminLockDown'), 0);
	add_action('login_head', 'rsd_link');

add_action()とadd_fliterがあります。

コーデックス


CODEXのプラグインの作成> WordPress プラグイン・フック
を見ると、

多くのプラグインが、WordPress 用プラグインフックと1つ以上接続することで、目的を果たしています。プラグインフックが動く方法は、WordPress が走る間のさまざまなタイミングで、いずれかのプラグインがその時点で走る関数を登録していないかを WordPress が確認し、もしあればその関数を走らせることによります。これらの関数は、WordPress のデフォルトの振舞いを変更します。

とあります。

図表

WordPress プラグイン作成前の基礎知識のページに、こんな図がありました。

add_action()とadd_fliter()は両方ともプラグインの実行

コーデックスの該当部分を見ると、

add_action ( 'hook_name', 'your_function_name', [priority], [accepted_args] );

とあり、

hook_name
WordPress によって提供されているアクションフックの名称で、関数がどのイベントと関連するのかを示す。WP自体に埋め込まれた、ここのタイミングだよのサイン。
your_function_name
hook_name で設定されたイベントに続いて実行させたい関数の名前。標準の PHP 関数、WordPress コアに含まれる関数、プラグインファイルで定義した関数が使える。
priority
特定のアクションに関連した関数の実行時の順番を指定。数字を入れます。
accepted_args
関数が取ることのできる引数の数を定義

なので、どこで(hook_name)、何を(your_function_name)を実行するということになります。

Absolute Privacyの

add_action( 'register_form', array(&$absolutePrivacy, 'registrationBox'));

では、WPの処理中のdo_action(‘register_form’);が書きこまれた箇所で、array(&$absolutePrivacy, ‘registrationBox’)の処理を付け加える感じです。関数に配列が指定されているのが謎ですが、そういう風に定義しているのでしょう。あとで見ます。

ちなみに、do_action(‘register_form’);は、wp-login.phpの476行目にありました。
この記事の、case ‘register’ :のとき、つまりWordPressへのユーザ登録アクションの際に、実行されます。
普通だと、ユーザ登録時のパスワードは、WPが自動生成してユーザにメールをしますが、そこを書き換えるしょりです。

というわけで、次回以降、プラグインの本体である実際に実行される関数の定義を見ていきます。