ブロックエディタのフォントサイズのプリセットを管理画面からカスタマイズできる機能を作りました。その内容の覚書です。
全体の流れ
全体の流れは次のようになります。
- 文字サイズを入力・保存する管理画面を用意
- プリセットサイズをWordPressに設定する処理
- サイズを反映させるためのインラインCSSの出力
管理画面はあらかじめ用意するということでここでは説明しません。
管理画面の作成
プラグインの管理画面に追加するという前提で、入力フォームのコードを掲載します。管理画面の設定項目はmy_opt
という名前で保存されることを想定していますが、その初期化やデフォルト値の設定などは省略しています。
<?php
$my_opt = get_option('my_opt');
?>
<table>
<tr valign="top">
<th scope="row">フォントサイズ</th>
<td>
<fieldset>
<input type="hidden" name="my_opt[font_size]" value="0" />
<label><input type="checkbox" name="my_opt[font_size]" value="1" <?php checked( $my_opt['font_size'], 1 ); ?>>デフォルトのフォントサイズを置き換える。</label>
</fieldset>
<ol class="font_size_setting">
<?php
for ( $i = 1; $i < 5; $i++ ) {
?>
<li>
<ul>
<li>ラベル: <input type="text" name="my_opt[font_name-<?php echo esc_attr( $i ); ?>]" value="<?php echo esc_attr( $my_opt[ 'font_name-' . $i ] ); ?>"></li>
<li>クラス名:<input type="text" name="my_opt[font_short_name-<?php echo esc_attr( $i ); ?>]" value="<?php echo esc_attr( $my_opt[ 'font_short_name-' . $i ] ); ?>"></li>
<li>サイズ: <input type="number" name="my_opt[font_size-<?php echo esc_attr( $i ); ?>]" value="<?php echo esc_attr( $my_opt[ 'font_size-' . $i ] ); ?>"></li>
<li>スラッグ:<input type="text" name="my_opt[font_slug-<?php echo esc_attr( $i ); ?>]" value="<?php echo esc_attr( $my_opt[ 'font_slug-' . $i ] ); ?>"></li>
</ul>
<?php
}
?>
</ol>
</td>
</tr>
</table>
フォントサイズの設定にはラベル・クラス名・サイズ・スラッグの4つの要素が必要なので、それぞれ設定できるようにしています。サイズは数値、他は文字です。
このコードでは設定できる文字サイズの個数は4個に決め打ちしていますが、アレンジすれば任意の設定数にすることもできます。
あとテーマや他のプラグインとの競合を考え、この機能をオフにするチェックボックスも追加しておきました。これに適当なCSSを用意すると下図のような管理画面ができます。
プリセットサイズの登録
保存したデータからプリセットサイズを登録するコードです。
function my_font_size_setup() {
$my_opt = get_option('my_opt');
// 置きかえない設定になっている場合は処理を抜ける
if ( ! $my_opt['font_size'] ) {
return;
}
$font_sizes = array();
for ( $i = 1; $i < 5; $i++ ) {
$name = my_opt['font_name-' . $i];
$short_name = my_opt['font_short_name-' . $i];
$size = intval( my_opt['font_size-' . $i] ); // 必ず数値形式に変換!
$slug = my_opt['font_slug-' . $i]
if ( '' == $name || '' == $short_name || 0 > $size || '' == $slug ) {
continue;
}
$font_sizes[] = array(
'name' => $name,
'shortName' => $short_name,
'size' => $size,
'slug' => $slug,
);
}
add_theme_support( 'editor-font-sizes', $font_sizes );
}
add_action( 'init', 'my_font_size_setup' );
ここでのポイントは、size
に設定するデータはintval()
などを使って必ず数値形式に変換することです。
最初は$my_opt['font_size-*']
の値をそのまま設定していたのですが、それだとプリセットのリストに名前は表示されるますが正常に動作しません。
色々試した末、intval()
で整数型に変換したら正常に動作するようになりました。数値と文字列の扱いはしっかり意識する必要がありますね。
正常に登録されると下図のように表示されているはず。
今回はプラグインを前提にしているので、この処理はinit
アクションに設定しています。一方でテーマでフォントサイズを登録する場合はafter_setup_theme
に書くことが推奨されています。
WordPressはafter_setup_theme
→init
の順番で処理が進むので、通常はプラグインの設定がテーマの設定を上書きするはずです。もしテーマ側の設定値が優先される場合はinit
の中で読み込み順を後ろにするなど対応が必要かもしれません。
これでブロックエディタ内では文字サイズの変更が反映されるようになりますが、フロントエンドには反映されません。フロントエンドにインラインスタイルの出力が必要です。
インラインスタイルの出力
インラインスタイルを出力するコードは次のようになります。
/**
* インラインCSSを返す
*
* @return string
*/
function my_inline_css() {
ob_start();
for ( $i = 1; $i < 5; $i++ ) {
$name = my_opt['font_name-' . $i];
$short_name = my_opt['font_short_name-' . $i];
$size = intval( my_opt['font_size-' . $i] );
$slug = my_opt['font_slug-' . $i]
if ( '' == $name || '' == $short_name || 0 > $size || '' == $slug ) {
continue;
}
?>
.editor-styles-wrapper .has-<?php echo $slug; ?>-font-size,
.has-<?php echo $slug; ?>-font-size {
font-size:<?php echo $size; ?>px;
}
<?php
}
$css = ob_get_clean();
return $css;
}
/**
* CSSをインラインで追加
*/
function my_echo_inline_style() {
if ( ! my_opt['font_size'] ) {
return;
}
$css = my_inline_css();
$depth = array( 'wp-block-library', 'wp-block-library-theme' );
// CSSスタイルファイルをキューに追加.
wp_register_style( 'my-custom', false, $depth, null );
wp_enqueue_style( 'my-custom' );
// インラインにCSSの内容を出力.
wp_add_inline_style( 'my-custom', $css );
}
add_action( 'wp_enqueue_scripts', ' my_echo_inline_style' );
スラッグが同じ場合にブロックエディターのデフォルトスタイルを必ず上書きしたいのでwp-block-library
とwp-block-library-theme
の後に出力するようにしています。
もしデフォルトのスタイルを読み込まないテーマorカスタマイズをしている場合、このインラインスタイルも読み込まれなくなるので$depth
を修正するかそれを判定する処理が別途必要になります。
以上で終了です。これでフォントサイズを簡単に変更することができるようになります。
コメント
この記事へのコメントはありません。