概要説明
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 など)。
管理画面に出た欄(メモ欄の例)
前の書き方から直したところ
前はこの記事で、値をオプション(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 で段落にしています。


