WordPressでカスタム投稿タイプを運用している際、通常の投稿とは異なり、タクソノミー(カテゴリーやタグ)を選択せずに公開すると、そのまま未選択の状態で記事が公開されてしまうことがあります。これは、特定のタームを必ず紐付けたい場合に不便であり、サイトの構造やコンテンツ管理の一貫性を損なう可能性があります。
この記事では、カスタム投稿記事が公開される際に、もしタームが選択されていなければ、あらかじめ指定したデフォルトのタームを自動的に割り当てる方法について、具体的なコード例と詳細な解説を交えてご紹介します。
なぜカスタム投稿タイプでこの設定が必要なのか?
WordPressの標準的な「投稿」では、カテゴリーが未選択の場合、自動的に「未分類」などのデフォルトカテゴリーが割り当てられます。
しかし、カスタム投稿タイプの場合、この自動割り当ての仕組みはデフォルトでは機能しません。
そのため、ユーザーがタームを選択し忘れたり、意図的に未選択のまま公開したりすると、その記事はどのタームにも属さない状態になってしまいます。
このような状態を防ぎ、コンテンツの分類を徹底するために、今回ご紹介する方法が役立ちます。
解決策:functions.phpにコードを追加する
この問題を解決するには、WordPressテーマのfunctions.phpファイルに数行のPHPコードを追加します。これにより、カスタム投稿が公開される直前にタームの選択状況を確認し、必要に応じてデフォルトタームを割り当てることができます。
基本となるコード
以下は、特定のカスタム投稿タイプ(例: sample)とタクソノミー(例: sample_category)に対して、タームID 1 をデフォルトとして自動設定するコードです。
<?php/** * カスタム投稿でタームが未選択の場合に特定のタームを自動で割り当てる * * @param int $post_ID 投稿ID */function add_default_term_to_custom_post($post_ID) { // タクソノミー名を指定 $taxonomy_name = 'sample_category'; // 現在の投稿に割り当てられているタームを取得 $current_terms = wp_get_object_terms($post_ID, $taxonomy_name); // もしタームが一つも割り当てられていなければ if (empty($current_terms)) { // デフォルトとして割り当てるタームIDを指定(配列で複数指定も可能) $default_term_ids = array(1); // 例: タームIDが1のタームを割り当てる // 投稿にデフォルトタームを割り当てる wp_set_object_terms($post_ID, $default_term_ids, $taxonomy_name); }}// アクションフックを設定// 'publish_{カスタム投稿タイプ名}' にフックするadd_action('publish_sample', 'add_default_term_to_custom_post');?>PHPコードの解説
各行が何をしているのかを詳しく見ていきましょう。
function add_default_term_to_custom_post($post_ID):- この関数は、投稿が公開される際に実行される処理を定義しています。
$post_IDは、公開されようとしている投稿のIDをWordPressが自動的に渡してくれます。
$taxonomy_name = 'sample_category';:- 自動設定の対象となるタクソノミー(カスタム分類)の名前を指定します。ご自身の環境に合わせて変更してください。
$current_terms = wp_get_object_terms($post_ID, $taxonomy_name);:wp_get_object_terms()関数は、指定された投稿($post_ID)に現在割り当てられている、指定されたタクソノミー($taxonomy_name)のターム情報を取得します。- 結果はオブジェクトの配列として
$current_termsに格納されます。
if (empty($current_terms)):empty()関数は、$current_termsが空(つまり、投稿にタームが一つも割り当てられていない)かどうかをチェックします。- この条件が真(true)の場合、タームが未選択であると判断し、次の処理に進みます。
$default_term_ids = array(1);:- ここで、デフォルトとして割り当てたいタームのIDを指定します。
- 重要: タームIDは数値で指定します。複数のタームを割り当てたい場合は、
array(1, 5, 10)のようにカンマ区切りで複数指定できます。
wp_set_object_terms($post_ID, $default_term_ids, $taxonomy_name);:wp_set_object_terms()関数は、指定された投稿($post_ID)に、指定されたタームID($default_term_ids)を、指定されたタクソノミー($taxonomy_name)に割り当てます。- この関数は、既存のタームを上書きするのではなく、指定されたタームを追加します。ただし、このコードのロジックでは
empty($current_terms)の場合にのみ実行されるため、結果的にデフォルトタームが設定されます。
add_action('publish_sample', 'add_default_term_to_custom_post');:add_action()関数は、WordPressの特定のアクション(イベント)が発生したときに、指定した関数を実行するためのフックを設定します。'publish_sample'は、カスタム投稿タイプ「sample」が公開されたときに発火するアクションフックです。publish_の後に続く部分は、ご自身のカスタム投稿タイプのスラッグ(識別子)に置き換えてください。 例えば、カスタム投稿タイプがnewsであれば'publish_news'となります。
'add_default_term_to_custom_post'は、このアクションが発火したときに実行される関数の名前です。
カスタマイズガイド:ご自身の環境に合わせる
上記のコードをあなたのWordPressサイトに適用するために、以下の点をカスタマイズする必要があります。
1. タクソノミー名を確認する
カスタム投稿タイプに紐付けられているタクソノミーの名前(スラッグ)を確認します。これは、カスタム投稿タイプを登録した際のコードや、プラグインの設定画面で確認できます。
例: register_taxonomy() 関数で slug として指定した値です。
2. デフォルトとして割り当てるタームIDを確認する
WordPressの管理画面で、デフォルトとして割り当てたいタームのIDを確認します。
- WordPress管理画面の「投稿」→「カテゴリー」または「カスタム投稿タイプ名」→「設定したタクソノミー名」へ移動します。
- ターム名にカーソルを合わせると、ブラウザのステータスバー(またはリンクを右クリックして「リンクアドレスをコピー」)に表示されるURLの中に
tag_ID=またはterm_id=の後に続く数字がタームIDです。
例:.../wp-admin/edit-tags.php?action=edit&taxonomy=sample_category&tag_ID=1&post_type=sampleの場合、タームIDは1です。
3. カスタム投稿タイプ名を確認する
add_action() のフック名 publish_sample の sample の部分を、あなたのカスタム投稿タイプのスラッグに置き換えます。
例: register_post_type() 関数で slug として指定した値です。
4. 複数のデフォルトタームを割り当てる場合
$default_term_ids = array(1); の部分を、$default_term_ids = array(1, 5, 10); のように、割り当てたいタームIDをカンマ区切りで複数指定します。
コードの設置場所
このコードは、WordPressテーマのfunctions.phpファイルに記述するのが一般的です。
- WordPress管理画面の「外観」→「テーマファイルエディター」へ移動します。
- 右側のファイル一覧から「テーマのための関数 (functions.php)」を選択します。
- ファイルの末尾に上記のコードをコピー&ペーストします。
- 「ファイルを更新」ボタンをクリックして保存します。
注意点:
- 子テーマの使用を強く推奨します。 親テーマの
functions.phpを直接編集すると、テーマのアップデート時に変更が上書きされてしまいます。子テーマを使用すれば、親テーマのアップデートの影響を受けずにカスタマイズを維持できます。 - コードを貼り付ける際は、既存のPHPコードの閉じタグ
?>の前に記述するか、ファイルの一番最後に記述してください。
重要な考慮事項
- テスト環境での確認: 本番環境に適用する前に、必ず開発環境やステージング環境で十分にテストを行ってください。
- エラーハンドリング: このコードは基本的な機能を提供しますが、より堅牢なシステムを構築する場合は、エラーハンドリングやログ記録を追加することも検討してください。
- パフォーマンス: この程度のコードであればパフォーマンスへの影響はほとんどありませんが、大規模なサイトで多数のカスタム投稿を扱う場合は、処理の効率性を考慮することも重要です。
まとめ
WordPressのカスタム投稿タイプでタームの未選択を防ぎ、自動的にデフォルトタームを割り当てる方法は、サイトのコンテンツ管理をより効率的かつ一貫性のあるものにするための強力な手段です。functions.phpに数行のコードを追加するだけで実現でき、サイト運営の利便性を大きく向上させることができます。