PR

【WordPress】CSSを別ファイルで読み込む方法|SettingsAPIでの個別ページ反映

SettingsAPIを使って自作プラグインや独自の設定画面にCSSを反映する場合、その設定画面だけにCSSを読み込む方法をまとめてます。

ポイントはwp_register_style()を実行する時に使うフック。
(wp_enqueue_scripts か admin_enqueue_scripts か)

ここを押さえてないと、あれ?フックされないぞ、CSSが読み込まれない、とネットの海をさまようことになり結構大変。^-^;)

⇒「Settings APIの使い方まとめ」に戻る

CSSを読み込むための基本

CSSをプラグインや独自の関数に読み込むには以下を使います。
(具体例は下方参照)

  • wp_register_style():CSSファイルを登録する
  • wp_enqueue_style():登録したCSSファイルを追加する

関数リファレンス/wp_register_style(ワードプレス公式)
関数リファレンス/wp_enqueue_style(ワードプレス公式)

まず読み込みたいCSSを wp_register_style() でワードプレスに登録し、
その登録したCSSを読み出したい場面で wp_register_style() を使って読み込む。

こうすることで表示するページのヘッダに以下のようにCSS読み込み用のlinkタグが挿入されます。

<link rel='stylesheet' id='test_css_id-css'  href='http://localhost/jin-test/wp-content/themes/cocoon-child-master/my-func/test.css?ver=5.8.2&#038;fver=20211207082341' media='all' />

注意が必要なのは、フロントエンド(ユーザーが見る画面)と、設定など管理画面(バックエンド)ではwp_register_style() の呼び出し方(フック)が異なること。

// スタイルシートの登録【フロントエンド】
function register_styles() {
	wp_register_style( $handle, $src );
}
add_action( 'wp_enqueue_scripts', 'register_styles' );

フロントエンドでは wp_enqueue_scripts フックを使う。

関数リファレンス:wp_enqueue_scripts(英語)

// スタイルシートの登録【バックエンド(設定などの管理画面)】
function register_styles() {
	wp_register_style( $handle, $src );
}
add_action( 'admin_enqueue_scripts', 'register_styles' );

バックエンドでは admin_enqueue_scripts フックを使う。

関数リファレンス:admin_enqueue_scripts(英語)

ここを間違うと、なぜかCSSが読み込まれない、フックしない...
と延々と悩むことになる。(私のように 笑)

個別ページにCSSを読み込む

ワードプレスの管理画面内に作る個別の設定画面にCSSを読み込ませるには、wp_register_style() で登録したCSSファイルを 個別ページ用のコードの中でwp_enqueue_style()を使って呼び出せばOK。

Settings APIを使った設定画面の基本形は以下のようになると思いますが...

<?php
//
// 以下Settings APIを使った設定画面
//

// メニュー登録
add_action( 'admin_menu', 'test_menu' );

// メニュー内容
function test_menu(){
	add_options_page(
		'ページタイトル',
		'メニュー名',
		'manage_options',	// メニューが表示されるユーザー権限
		'menu-slug',
		'setting_func'		//設定画面表示の関数
	);
}

// 設定画面の表示
function setting_func(){ ?>
 
	<div class="wrap">
	<h1>設定画面タイトル</h1>
	<form method="post" action="options.php">
	 
	<?php settings_fields( 'field-group' ); ?>
	<?php do_settings_sections( 'menu-slug' ); ?>
	<?php submit_button(); ?>
	 
	</form>
	</div>
 
<?php
};
?>

ここにCSSファイルの読み込むを入れると、以下のような感じになりますね。

<?php
// スタイルシートの登録
// $handle: ワードプレスに登録するスタイルシートの個別ID
// $src:スタイルシートのURL
function register_styles() {
	wp_register_style( $handle, $src );
}
add_action( 'admin_enqueue_scripts', 'register_styles' );

// スタイルシートの読み込み
// register_styles()で設定した $handle を指定して読み込む
function load_test_styles() {
	wp_enqueue_style( $handle );
}

//
// 以下Settings APIを使った設定画面
//

// メニュー登録
add_action( 'admin_menu', 'test_menu' );

// メニュー内容
function test_menu(){
	$page_hook = add_options_page(
		'ページタイトル',
		'メニュー名',
		'manage_options',	// メニューが表示されるユーザー権限
		'menu-slug',
		'setting_func'		//設定画面表示の関数
	);
	add_action( 'admin_print_styles-'.$page_hook , 'load_test_styles');
}

// 
function setting_func(){ ?>
 
	(省略)
 
<?php
};
?>

wp_register_style(5行目~8行目)

function register_styles() {
	wp_register_style( $handle, $src );
}
add_action( 'admin_enqueue_scripts', 'register_styles' );

管理画面なのでadmin_enqueue_scriptsフックで呼び出し、
wp_register_style()でスタイルシートのURL($src)を「あるID」($handle)としてまずはワードプレスに登録。

wp_enqueue_style(12行目~14行目)

function load_test_styles() {
	wp_enqueue_style( $handle );
}

上でワードプレスに登録した $handle(に対するスタイルシート)wp_enqueue_style()によって実際のページに追加する。

これでCSSファイルの読み込みができますが、
個別のページにCSSファイルを追加する場合には、その個別ページが呼び出される時にこのwp_enqueue_style()が実行されるようにすれば良いですね。

admin_print_styles(25行目と32行目)

add_action( 'admin_print_styles-'.$page_hook , 'load_test_styles');

フックの「'admin_print_styles-'.$page_hook」が分かりづらいですが、ここが「個別ページの場合には」としているところ。

まずadmin_print_stylesフックは、ワードプレスの管理画面のHTML ヘッダーでスタイルシートを追加するときに実行されるもの。

関数リファレンス:admin_print_styles(英語)

このフックの最後にハイフン「-」を付けてその後にadd_submenu_page()add_options_page()の戻り値として得られる「ページフック」というものを付けると、その個別ページの場合だけフックされる。

関数リファレンス:admin_print_styles-{$hook_suffix}(英語)
関数リファレンス:add_submenu_page(英語)
関数リファレンス:add_options_page(ワードプレス公式)

ということでここでは25行目の以下。

$page_hook = add_options_page(

ここで add_options_pageの戻り値として $page_hook を得て、この$page_hookをハイフンつけてセットしている、ということになります。

ちなみにこのページフック、
実際に echo で表示させてみると以下のようなものになってます。

  • settings_page_menu-slug

「settings_page」にadd_options_page内で指定しているスラッグ「menu-slug」がついている形

具体例)自作プラグインの設定画面にCSSを読み込む

ではちょっと具体例を見てみましょう。

まずは自作プラグインで設定画面を持つ場合ですが、
以下のように「plugins」フォルダー内にプラグイン「test-plugin」があり、その中にスタイルシートの test.css がある場合。

親テーマフォルダー
images
css
plugins
  ├ test-plugin
    ├ test-plugin.php
    ├ test.css
├ index.php
├ functions.php
├ ・・・・・

<?php
// スタイルシートの登録
// 'test_css_id': ワードプレスに登録するスタイルシートの個別ID
function register_styles() {
	wp_register_style( 'test_css_id', plugins_url('test.css', __FILE__ ) );
}
add_action( 'admin_enqueue_scripts', 'register_styles' );
 
// スタイルシートの読み込み
// register_styles()で設定した 'test_css_id' を指定して読み込む
function load_test_styles() {
	wp_enqueue_style( 'test_css_id' );
}

//
// 以下Settings APIを使った設定画面
//
 
// メニュー登録
add_action( 'admin_menu', 'test_menu' );

// メニュー内容
function test_menu(){
	$page_hook = add_options_page(
		'ページタイトル',
		'メニュー名',
		'manage_options',	// メニューが表示されるユーザー権限
		'menu-slug',
		'setting_func'		//設定画面表示の関数
	);
	add_action( 'admin_print_styles-'.$page_hook , 'load_test_styles');
}

// 
function setting_func(){ ?>
 
	(省略)
 
<?php
};
?>

5行目では $handle を「test_css_id」とかにして、
$src をplugin_url()や マジック定数の __FILE__ を使ってるのが異なるのみ。

12行目は、5行目で指定した $handle(test_css_id)に変えた。

plugin_url, __FILE__ について詳しく

plugin_url() は、プラグインフォルダまでのパスを返し、
plugin_url( 'URLを得たいファイル(のパス)', パスの起点とする親ディレクトリー)
という形で、CSSファイルのURLが得られます。

関数リファレンス/plugins url(ワードプレス公式)

__FILE__ はマジック定数と呼ばれるもので、実行されているファイルのフルパスが入っている定数。

マジック定数(PHPマニュアル)

具体的にどんな文字列が入っているのか調べてみると
以下のようなものが入ってます。
(テーマはcocoonの子テーマ(cocoon-child-master)を使用時)

PC上のローカル環境(XAMPP)で functions.php 内に「echo __FILE__」を記述:
C:\xampp8-0-7\htdocs\jin-test\wp-content\themes\cocoon-child-master\functions.php

ネット上の functions.php で「echo __FILE__」を記述:
/home/xxx/jin-test.com/public_html/wp-content/themes/cocoon-child-master/functions.php

また以下のように
スタイルシートの test.css がフォルダー「test-css」の中にある場合。

親テーマフォルダー
images
css
plugins
  ├ test-plugin
    ├ test-plugin.php
    ├ test-css
      ├ test.css
├ index.php
├ functions.php ├ ・・・・・

CSSファイルのパスが違うだけなので、上の例と異なる点は以下のみ。

// スタイルシートの登録
// 'test_css_id': ワードプレスに登録するスタイルシートの個別ID
function register_styles() {
	wp_register_style( 'test_css_id', plugins_url('/test-css/test.css', __FILE__ ) );
}
add_action( 'admin_enqueue_scripts', 'register_styles' );

plugins_url()の中で、'/test-css/test.css' となっているのが違うだけになりますね。

具定例)自作関数の設定画面にCSSを読み込む

自作の関数の場合も基本同じで、CSSファイルの指定が異なるだけ。

テーマフォルダー
images
css
plugins
├ index.php
├ functions.php
test-func.php
test-func.css
├ ・・・・・

まずこのようにテーマフォルダーの直下に「test-func.css」がある場合を考えてみると、以下のようになりますね。

<?php
// スタイルシートの登録
// test_css_id: ワードプレスに登録するスタイルシートの個別ID
function register_styles() {
	wp_register_style( test_css_id, get_theme_file_uri( 'test-func.css' ) );
}
add_action( 'admin_enqueue_scripts', 'register_styles' );

// スタイルシートの読み込み
// register_styles()で設定した test_css_id を指定して読み込む
function load_test_styles() {
	wp_enqueue_style( test_css_id );
}

//
// 以下Settings APIを使った設定画面
//

// メニュー登録
add_action( 'admin_menu', 'test_menu' );

// メニュー内容
function test_menu(){
	$page_hook = add_options_page(
		'ページタイトル',
		'メニュー名',
		'manage_options',	// メニューが表示されるユーザー権限
		'menu-slug',
		'setting_func'		//設定画面表示の関数
	);
	add_action( 'admin_print_styles-'.$page_hook , 'load_test_styles');
}

// 
function setting_func(){ ?>
 
	(省略)
 
<?php
};
?>

5行目でCSSファイルをワードプレスに登録し、
その登録したCSSファイルを31行目で個別ページのフックで読み込む。

5行目ではCSSファイル(test-func.css)のパスを得るために、
get_template_directory_uri()(親テーマノパスを取得)get_stylesheet_directory_uri()(子テーマのパスを取得)を使うのではなく、親テーマ子テーマ共通で使える便利なget_theme_file_uri()を使ってます。

get_theme_file_uri() について詳しくは以下
親テーマ子テーマのパス(URL)取得!共通で使える関数は?

読み込みたいCSSファイルの場所が変わればパスを変えるだけ。
例えば以下のようにテーマフォルダーの下に「myfunc」というフォルダーがあり、その中に読み込みたいCSSファイル(test-func.css)がある場合。

テーマフォルダー
images
css
plugins
myfunc
  ├ test-func.php
  ├ test-func.css
├ index.php
├ functions.php
├ ・・・・・

CSSファイルの場所が変わっただけなので、1つ上の例の5行目のみの変更でOK.

<?php
// スタイルシートの登録
// test_css_id: ワードプレスに登録するスタイルシートの個別ID
function register_styles() {
	wp_register_style( test_css_id, get_theme_file_uri( '/myfunc/test-func.css' ) );
}
add_action( 'admin_enqueue_scripts', 'register_styles' );

以下のように「myfunc」の中に「test-css」というフォルダーがあり、
その中にある「test-func.css」を読み込む場合。

テーマフォルダー
images
css
plugins
myfunc
  ├ test-func.php
  ├ test-css
    ├ test-func.css
├ index.php
├ functions.php ├ ・・・・・

この場合も単にCSSファイルのパスを以下のよう変えればよいですね。

<?php
// スタイルシートの登録
// test_css_id: ワードプレスに登録するスタイルシートの個別ID
function register_styles() {
	wp_register_style( test_css_id, get_theme_file_uri( '/myfunc/test-css/test-func.css' ) );
}
add_action( 'admin_enqueue_scripts', 'register_styles' );

⇒「Settings APIの使い方まとめ」に戻る

ポイントまとめ

CSSファイルを自作プラグインの設定画面、自作関数の設定画面に読み込むには以下を使う。

  • 1)wp_register_style()でCSSファイルをワードプレスに登録する
    (管理画面の場合には、admin_enqueue_scripts フックを使う)
  • 2)登録したCSSファイルは、wp_enqueue_style()を使って個別画面に追加する
    (そのページのヘッダに CSSファイル追加用のリンクタグが挿入される)
  • 3)個別ページへのCSSファイルの追加では、
    「’admin_print_styles-‘.$page_hook」フックを使って2)のwp_enqueue_style()を実行する
  • 4)ページフック($page_hook)は add_options_page()の返り値としてゲットできる

分かってみればなんてことはないんですが、
分かるようになるまでが一苦労ですね。^-^;)

ネットビジネスに興味がある、ブログの収益化をしてみたい、という場合には、以下のメルマガにも登録してみてくださいね。

早期退職して海外で奮闘する JIN のメールマガジン

時間や場所に縛られず稼いだJINが教える

~ 最短で月収10万円稼げるようになる方法 ~

お名前/ニックネーム

隣のあの人にも、思わず教えたくなる秘密

配信停止は、いつでもできます

迷惑メールは一切配信されませんので、ご安心くださいね

自らの手で未来を変える力を手に入れる!

コメント