【WordPress】今更だけど、WysiWygエディタ（ビジュアルエディタ）で書いた記事にCSSを適用する方法をまとめてみた話

## はじめに
未だ世界でも日本でもシェアNo.1を誇るWordPress！！
我が社においても、WordPressの案件は多い・・・

WordPressの案件をやっていてよく考えるのが、**相手にどうやって記事を書いてもらうのか！？**です。

WordPressにはデフォルトでWysiWygエディタが搭載されています。
*注）現在の最新WordPressのバージョンでは、WysiWygエディタとBlockエディタの両方が搭載されており、デフォルトはBlockエディタになっています。*

ただ、WysiWygエディタ（特にビジュアルエディタ）は機能が豊富なので、好き勝手使用されると書いた記事にCSSが適用されず、せっかくデザインしたページが台無しになってしまいます。

というわけで、WysiWygエディタ（以降、ビジュアルエディタと呼ぶことにします）でCSSの適用方法をまとめてみようと思います。

## ビジュアルエディタの機能制限を楽にできるプラグインを導入する
上記にも書きましたが、ビジュアルエディタは機能が豊富です。
すべての機能に対してCSSを適用させるのはとても大変なので、『TinyMCE Advanced』というプラグインを導入して機能を（本当に使用する機能だけに）制限します。

![エディタで使用できる機能を制限.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241956/7d19c38b-6b30-933c-8b7d-f6cde3960278.png)

### 注）機能制限は相手に理解されない
**ビジュアルエディタの使用できる機能を制限します**とか言うと大抵の人は、「えぇ〜」とか、「いやだぁ〜」とか言われて拒否されます。:sob:
折角、多くの機能を持っているのに**使えない**となると一定数の人は嫌がりますよね。
そんな時は以下のように実装してみるのはいかがでしょうか。

```php
■ function.php

// WysiWygエディタの1行目に配置する機能ボタンを固定させる関数
function tinymce_fixed_buttons( $buttons ) {
	$buttons = array( 'styleselect', 'bullist', 'numlist', 'table', 'undo', 'redo' );
	return $buttons;
}
add_filter( 'mce_buttons', 'tinymce_fixed_buttons', 1000 );
```

ビジュアルエディタのボタンは４行設定することができます。
1行目は、CSSを適用した固定のボタンを設定しておき、ボタンを追加したい場合は2行目以降に設定してもらう（ただし、2行目以降に置いたボタンのCSSはエディタを使う人が用意する必要がある）という、いわゆる最初からCSSを適用しているボタンと適用していないボタンを分ける方法です。

これで、ビジュアルエディタで使用する機能を絞ることができました。
続いてCSSを適用する方法です。

## 1. ビジュアルエディタから出力される要素に対して直接CSSを適用する
一番、簡単＆楽なのは、ビジュアルエディタから出力される要素に対して直接CSSを適用する方法です。

例えば、以下のようなCSSを作成します。

```css
#hoge h2 {
	color:red
}
```

あとは、テンプレートを以下のように書けば、ビジュアルエディタから出力される要素に対して直接CSSを適用することができます。

![スタイルの当て方1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241956/221e45fd-5016-4739-857b-0b4dd41a415f.png)

## 2. ビジュアルエディタの機能から出力する要素にclassを追加してCSSを適用する
1.の方法だけでは、うまくCSSを適用できない場合に使用します。
ビジュアルエディタのボタンから出力した要素にclassを追加します。そして、その追加したclassに対してCSSを適用します。

こちらは、`h2、p、Table、link`のボタンに対して、classを追加するロジックです。

```php
■ function.php

function tinymce_custom_buttons( $settings ) {
	// h2、pタグ設定時に'hoge'classをつける。
	$invalid_style = array(
		'h2' => array(
			'block' => 'h2',
			'classes' => 'hoge'
		),
		'p' => array(
			'block' => 'p',
			'classes' => 'hoge'
		)
	);
	$settings['formats'] = json_encode( $invalid_style );

	// Tableの設定から'hoge'classをつける。
	$table_class_list = array(
		array( 'title' => 'クラス1', 'value' => 'hoge' ),
	);
	$settings['table_class_list'] = json_encode($table_class_list);

	// Link設定時に'hoge'classをつける。
	$link_class_list = array(
		array( 'title' => 'クラス1', 'value' => 'hoge' ),
	);
	$settings['link_class_list'] = json_encode( $link_class_list );
	// httpsを接頭辞に付与する。
	$settings['link_assume_external_targets'] = 'https';

	return $settings;
}
add_filter('tiny_mce_before_init', 'tinymce_custom_buttons', 10000 );
```

結果は以下のように表示されます。ちゃんとclassが付いてますね。
![formats-class.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241956/14efbaf0-2546-7f26-860a-d9122474c279.png)

`tiny_mce_before_init`のFilterHookを使用します。
基本的には、`$settings['formats']`に対して、jsonで要素の情報（`classes`）を追加するだけです。
ただし、特定の機能（リンクやテーブル）に関しては、固有の設定方法があるので、そちらの方法で設定が必要です。

この`class`の追加方法は、以下ドキュメントに記載されています。（JavaScriptで書かれているドキュメントですが、PHPでも書くことができます。）

https://www.tiny.cloud/docs/

`formats`の設定方法は、[Configuration reference] > [content formatting options] > [formats]を参照ください。
特定の機能（リンクやテーブル）に関しては、[Plugins]の方に記載されているので、こちらを参照してください。

*注）なお、この方法を使用するには『TinyMCE Advanced』で以下設定が必要です。*

![TinyMCE_Advanced-setting2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241956/c8129ac6-bf3e-6f50-89df-d1349deebcf5.png)

## 3. ビジュアルエディタのスタイルフォーマットを使ってclassを追加した要素を作成して、CSSを適用する

### スタイルフォーマットとは？
ビジュアルエディタの特定の機能を作成でき、一箇所（ドロップダウンリスト）にまとめる事ができる機能です。
メリットは、ビジュアルエディタのボタンとは別だが、まったく同じ機能が作れること。そして、使う機能がドロップダウンリストに纏まっていることです。
ただし、テーブル等のモダンな機能に対しては、うまく動かないので2.の方法でclassをつけましょう。

![style-formats.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241956/dcf98cd8-8f06-8d94-cefd-752c208182d2.png)

こちらは、`h2、strong、a`に対して、classを追加するロジックです。

```php
■function.php

function tinymce_style_formats( $settings ) {
	// スタイルフォーマットに設定するタグを指定する.
	$style_formats = array(
		array(
			'title'   => '見出し1',
			'block'   => 'h2',
			'classes' => 'hoge'
		),
		array(
			'title'   => '強調',
			'inline'  => 'strong',
			'classes' => 'hoge'
		),
		array(
			'title'      => 'テキストリンク',
			'inline'     => 'a',
			'classes'    => 'hoge',
			'attributes' => array(
				'href' => '#',
			),
		),
	);
	$settings['style_formats'] = wp_json_encode( $style_formats );

	return $settings;
}
add_filter( 'tiny_mce_before_init', 'tinymce_style_formats', 10000 );
```

結果は以下のように表示されます。ちゃんとclassが付いてますね。
![style-formats-class.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241956/0f4ae9a9-5abd-806e-1342-19a5ba2f4153.png)

方法は、2.とほとんど同じです。`$settings['style_formats']`に対して、jsonで要素と`classes`を設定するだけです。

スタイルフォーマットの作り方も、以下ドキュメントに記載しています。  

https://www.tiny.cloud/docs/

[Configuration reference] > [User interface options] > [style_formats]を参照ください。  

## おわりに
というわけで、今更ですが、ビジュアルエディタでで書いた記事にCSSを適用する方法をまとめてみました。
今更というのは、注意書きでも触れましたが、現在WordPressにはGutenberg（グーテンベルグ）と呼ばれるBlockエディタがデフォルトで搭載されています。今後はWysiWygエディタではなく、こちらが主流になるのではないかと思われます。
また、別の機会に今度はBlockエディタのCSS適用方法について書けたらなぁと思います。

[:christmas_tree: FORK Advent Calendar 2019](/advent-calendar/2019/fork)
:arrow_left: 15日目 [「Google Maps API」改め「Google Maps Platform」を使った話](/takaha-farm/items/57bd5d2629dea00826a2) @takaha-farm 
:arrow_right: 17日目 [「Docker入門 ～Dockerfile編～」](/takaday/items/08c8269dc926af8cb661)@takaday