WordPress のカテゴリーの編集画面に欄を足す:メモ・チェックボックスを term meta に保存する

広告WordPress・PHP を学べる本

Amazonのアソシエイトとして、WordPress functions.phpは適格販売により収入を得ています。

概要説明

WordPress のカテゴリーの追加・編集の画面に、メモの欄やチェックボックスを足して保存する functions.php のコード。ID を決め打ちせずに「このカテゴリーは関連記事から外す」などを決められます。term meta への保存・権限の確かめ・作業環境で試した結果つき。

「このカテゴリーの記事だけ関連記事を出さない」といった処理を、カテゴリーの ID を決め打ちで書くと、カテゴリーを増やすたびにコードを直すことになります。

そこで、カテゴリーの編集画面に欄を足し、管理画面で印を付けられるようにします。値は、カテゴリーごとの保存場所(term meta)に入れます。

functions.php
/**
 * カテゴリーに「メモ」と「関連記事から外す」の欄を足す(term meta に保存)
 */

// 新しく追加する画面
add_action( 'category_add_form_fields', function () {
	?>
	<div class="form-field term-memo-wrap">
		<label for="tag-memo">メモ欄</label>
		<textarea name="tag-memo" id="tag-memo" rows="5" cols="40"></textarea>
		<p>このカテゴリーのメモ(サイトには出しません)</p>
	</div>
	<div class="form-field term-exclusion-wrap">
		<label><input type="checkbox" name="tag-exclusion" value="1"> 関連記事から外す</label>
	</div>
	<?php
} );

// 編集する画面
add_action( 'category_edit_form_fields', function ( $term ) {
	$memo      = get_term_meta( $term->term_id, 'memo', true );
	$exclusion = get_term_meta( $term->term_id, 'exclusion', true );
	?>
	<tr class="form-field term-memo-wrap">
		<th><label for="tag-memo">メモ欄</label></th>
		<td><textarea name="tag-memo" id="tag-memo" rows="5" cols="40"><?php echo esc_textarea( $memo ); ?></textarea>
		<p>このカテゴリーのメモ(サイトには出しません)</p></td>
	</tr>
	<tr class="form-field term-exclusion-wrap">
		<th>関連記事</th>
		<td><label><input type="checkbox" name="tag-exclusion" value="1" <?php checked( $exclusion, '1' ); ?>> 関連記事から外す</label></td>
	</tr>
	<?php
} );

// 保存(カテゴリーを追加したとき・編集したとき)
function my_save_category_fields( $term_id ) {
	if ( ! current_user_can( 'manage_categories' ) ) {
		return;
	}
	if ( isset( $_POST['tag-memo'] ) ) {
		update_term_meta( $term_id, 'memo', sanitize_textarea_field( wp_unslash( $_POST['tag-memo'] ) ) );
	}
	// 印を外したときは送られてこないので、ないときは空にする
	update_term_meta( $term_id, 'exclusion', empty( $_POST['tag-exclusion'] ) ? '' : '1' );
}
add_action( 'created_category', 'my_save_category_fields' );
add_action( 'edited_category', 'my_save_category_fields' );
書き方 役目
category_add_form_fields カテゴリーを新しく追加する画面に欄を出す
category_edit_form_fields カテゴリーを編集する画面に欄を出す(表の 1 行として)
created_category・edited_category カテゴリーを追加・編集して保存したときだけ動く(タグなどでは動かない)
update_term_meta・get_term_meta カテゴリーごとの保存場所(term meta)に書く・読む
current_user_can( 'manage_categories' ) カテゴリーを編集できる人のときだけ保存する

フックの category の部分を、分類の名前に変えます(タグなら post_tag_add_form_fields・edited_post_tag など)。

管理画面に出た欄(メモ欄の例)

WordPress のカテゴリーの編集画面に欄を足す:メモ・チェックボックスを term meta に保存する

前はこの記事で、値をオプション(cat_カテゴリーの ID)にまとめて保存する書き方を紹介していました。次のところを直しています。

前の書き方 今の書き方
保存する場所 カテゴリーごとにオプションを 1 つ作る term meta(カテゴリーを消すと一緒に消える)
保存できる人 確かめていない カテゴリーを編集できる人だけ
保存する前 送られた値をそのまま sanitize_textarea_field でタグなどを取り除く
画面に出すとき そのまま出す esc_textarea・esc_html で文字として出す
動くとき create_term・edited_term(タグなども含む全部の分類) created_category・edited_category(カテゴリーだけ)

確かめた結果

このサイトの作業環境(WordPress 7.1)で、試しのカテゴリーを作って確かめました。

試したこと 結果
メモと印を入れて、カテゴリーを追加 どちらも保存された。メモに入れた script タグは取り除かれた
印を外して編集 印が空になった
ログインしていない状態で保存の処理を動かす 保存されなかった
タグを追加 タグには保存されなかった
編集の画面を出す 保存したメモが欄に入っていた

試しに作ったカテゴリーとタグは、確かめたあと消しました。

登録した値を使う:関連記事から外す

テンプレート(single.php など)
// 関連記事を出す前に、印を付けたカテゴリーの記事なら出さない
$exclude = false;
foreach ( get_the_category() as $cat ) {
	if ( '1' === get_term_meta( $cat->term_id, 'exclusion', true ) ) {
		$exclude = true;
		break;
	}
}
if ( ! $exclude ) {
	// 関連記事を出す処理
}

登録した値を使う:メモを出す

テンプレート(category.php など)
// カテゴリーの一覧のページ(category.php など)で、メモを出す
$memo = get_term_meta( get_queried_object_id(), 'memo', true );
if ( '' !== $memo ) {
	echo wpautop( esc_html( $memo ) );
}

メモは、そのまま出さずに esc_html で文字として出します。改行は wpautop で段落にしています。

参考(WordPress の公式の説明)

関連機能

  1. 特定のページにだけ任意のcssファイルを読み込ませる

  2. WordPress 画像の alt が空・未設定のときに記事タイトルを自動で入れる(functions.php)

  3. アイキャッチ画像の設定機能を追加したい場合

サイドバー

よく使うカスタマイズ

最近の記事

Profile

PAGE TOP