WordPressの投稿でカテゴリー必須仕様を回避する方法
WordPressでは投稿を保存する際、必ず1つ以上のカテゴリーが設定される仕様になっています。これはWordPress本体のコード(wp-includes/post.php)に明記されている通りです。今回は、この制約を回避するためのひと工夫として、「カテゴリー未選択」という仮のカテゴリーを利用し、投稿保存後に自動的に削除する方法を解説します。
なぜカテゴリーが必須なのか
WordPressは、投稿をカテゴリーで分類することでサイト内のコンテンツを体系的に整理しています。しかし、運用上、あえて投稿にカテゴリーを設定せずに扱いたいというケースも存在します。公式ではカテゴリー設定が必須ですが、回避策として仮のカテゴリー「カテゴリー未選択」を用意し、保存直後にこのカテゴリーを削除する方法が有効です。
コアコードの動作解説
WordPressの投稿保存処理では、投稿にカテゴリーが設定されていない場合、デフォルトカテゴリーを自動的に割り当てる仕組みがあります。たとえば、wp-includes/post.php 内の wp_insert_post
関数では、以下のようなコードでカテゴリーのチェックが行われています。
// Make sure we set a valid category.
if ( empty( $post_category ) || 0 === count( $post_category ) || ! is_array( $post_category ) ) {
// 'post' requires at least one category.
if ( 'post' === $post_type && 'auto-draft' !== $post_status ) {
$post_category = array( get_option( 'default_category' ) );
} else {
$post_category = array();
}
}
この処理では、投稿のカテゴリーが空(もしくは適切な配列でない)場合、投稿タイプが「post」であり、ステータスが「auto-draft」でなければ、WordPressのオプション default_category
で指定されたカテゴリーが自動的に設定されます。
さらに、以下のコードにより、実際にカテゴリーが投稿に適用されます。
if ( is_object_in_taxonomy( $post_type, 'category' ) ) {
wp_set_post_categories( $post_id, $post_category );
}
この内部で呼ばれる wp_set_post_categories
関数では、投稿タイプが「post」であれば必ずデフォルトカテゴリーを設定するロジックが含まれています。
function wp_set_post_categories( $post_id = 0, $post_categories = array(), $append = false ) {
$post_id = (int) $post_id;
$post_type = get_post_type( $post_id );
$post_status = get_post_status( $post_id );
// If $post_categories isn't already an array, make it one.
$post_categories = (array) $post_categories;
if ( empty( $post_categories ) ) {
/**
* Filters post types (in addition to 'post') that require a default category.
*
* @since 5.5.0
*
* @param string[] $post_types An array of post type names. Default empty array.
*/
$default_category_post_types = apply_filters( 'default_category_post_types', array() );
// Regular posts always require a default category.
$default_category_post_types = array_merge( $default_category_post_types, array( 'post' ) );
if ( in_array( $post_type, $default_category_post_types, true )
&& is_object_in_taxonomy( $post_type, 'category' )
&& 'auto-draft' !== $post_status
) {
$post_categories = array( get_option( 'default_category' ) );
$append = false;
} else {
$post_categories = array();
}
} elseif ( 1 === count( $post_categories ) && '' === reset( $post_categories ) ) {
return true;
}
return wp_set_post_terms( $post_id, $post_categories, 'category', $append );
}
特に、以下の部分がその例です。
// Regular posts always require a default category.
$default_category_post_types = array_merge( $default_category_post_types, array( 'post' ) );
つまり、投稿タイプは必ずカテゴリー設定の対象の投稿タイプになっています。
カテゴリー未設定状態を実現する基本的な流れ
実質的にカテゴリー無しの状態を実現するための方法は、以下の2ステップで構成されます。
-
仮の「カテゴリー未選択」カテゴリーを作成する
→ これにより、WordPressの必須カテゴリー要件を満たすための一時的なカテゴリーが存在します。 -
投稿保存後のフックで仮カテゴリーを削除する
→ 投稿保存時に発火するアクションフックwp_insert_post
を利用し、投稿に「カテゴリー未選択」が設定されていれば自動的に削除します。
実装例
以下は、投稿が保存された後に「カテゴリー未選択」のカテゴリーを削除する具体例です。※コード内のスラッグ(ここでは uncategorized
)は、実際に作成したカテゴリーのスラッグに合わせて変更してください。
add_action(
'wp_insert_post',
function ( $post_id ) {
// 「カテゴリー未選択」のスラッグに合わせて変更してください。
$uncategorized = get_category_by_slug( 'uncategorized' );
// 対象カテゴリーが存在し、投稿に設定されているかを確認
if ( ! $uncategorized || ! has_term( $uncategorized->term_id, 'category', $post_id ) ) {
return;
}
// 投稿から「カテゴリー未選択」を削除
wp_remove_object_terms( $post_id, $uncategorized->term_id, 'category' );
}
);
コード解説
-
get_category_by_slug('uncategorized')
指定したスラッグに基づき、対象のカテゴリー情報を取得します。 -
has_term() 関数
対象の投稿に仮カテゴリー(「カテゴリー未選択」)が設定されているかどうかを判定します。 -
wp_remove_object_terms() 関数
対象の投稿から該当カテゴリーを削除します。
このコードは、投稿保存時に wp_insert_post
アクションが実行される際、もし投稿に「カテゴリー未選択」が設定されていれば即座に除去し、実質的にカテゴリーが設定されていない状態を実現します。
まとめ
WordPressでは投稿保存時に必ずカテゴリーが設定される仕様ですが、仮の「カテゴリー未選択」を利用し、保存後に自動で削除する方法を用いることで、実質的なカテゴリー無しの状態を実現できます。ただし、以下の注意点も併せて考慮する必要があります。
-
カテゴリー一覧からの除外
テーマやウィジェット、ナビゲーションメニューなどで表示されるカテゴリー一覧から、仮の「カテゴリー未選択」を除外するためのカスタマイズが必要です。これにより、サイト訪問者に不要なカテゴリーが表示されないようにできます。 -
カテゴリーアーカイブページの対策
仮のカテゴリーがURLで直接アクセスされた場合、空のアーカイブページが表示されることを避けるため、404エラーページの設定や、別ページへのリダイレクトなどの対策を行うことが推奨されます。これにより、ユーザーが意図しない不自然なページに遷移するのを防げます。 -
プラグインやテーマとの互換性
一部のプラグインやテーマは、デフォルトカテゴリーの存在に依存している場合があります。実装前に、利用中の環境での動作確認を行い、必要に応じてカスタマイズするか、他の代替手法を検討してください。
このような追加対策を講じることで、仮のカテゴリーを使った運用時のトラブルを未然に防ぎ、柔軟かつ安全なコンテンツ管理が実現できます。
Discussion