WordPressでは、投稿の新規作成時ひとまずカテゴリーをセットするデフォルトカテゴリー設定があるのはご存じかと思います。
でも、複数のユーザーで運営するサイトや、複数の店舗のある企業のサイトなどでは、店舗(ユーザー)ごとに投稿のカテゴリーを予め決めておきたい(それ以外のカテゴリーでは投稿しない)ケースがあろうかと思います。
そこで、簡単なコードを追加して、ユーザーごとに投稿カテゴリーを強制(自動セット)する方法を紹介します。
なおこのコードは、デフォルトを指定してユーザーが後に自由に変更できるようにするものではなく、投稿作成時にどのカテゴリーを指定したとしても、編集画面の保存時に必ずそのカテゴリーに紐づくよう強制するものですのでご注意ください。
本ページ掲載のコードを使用するときは
本ページで掲載しているコードは、以下に了承した上で使用ください
- コードは商用・非商用問わず自由に使っていただいて構いませんが、コード追加による不具合やトラブルが発生しても当方では一切責任を負いません
- コードは有効化しているテーマのfunctions.php、style.cssなどへ追加することで機能します。それらのファイルへの変更を行うことに不安のある方は使用しないでください
- コードは本ページの公開日時点で私の環境において動作したものです。WordPressバージョン他環境の違いによって動作しないことがあります
- コードは、セキュリティ、コードの正確さなどにおいて完全なものではありません。中には紹介するコードを簡略化するために省略している部分があるものもありますので、ご自身でコードを十分に検証し、必要な部分の編集を行った上で使用するようにしてください
- 掲載しているのは参考コードです。自身の環境に合わせるための編集はご自身で対応いただく必要があります(コメント欄等から質問いただいても基本回答は致しません)
- 掲載しているコードの転載を禁じます(SNSで紹介いただいたり、本ページへのリンクを張っていただくことは大歓迎です)
ユーザーごとに投稿カテゴリーを強制するコード
有効化しているテーマのfunctions.phpへ以下を追加します
function pwcn_set_category_for_user($post_id) {
// 投稿タイプが「post」のときのみ実行
if (get_post_type($post_id) != 'post') {
return;
}
// 現在のユーザーIDを取得
$current_user_id = get_current_user_id();
// ユーザーごとのカテゴリーIDを設定
$user_categories = array(
1 => array( xx ), // ユーザーID 1 にカテゴリーID xx を設定
2 => array( zz ), // ユーザーID 2 にカテゴリーID zz を設定
);
// 現在のユーザーが設定されている場合
if (array_key_exists($current_user_id, $user_categories)) {
// 投稿にカテゴリーを設定
wp_set_post_categories($post_id, $user_categories[$current_user_id]);
}
}
add_action('save_post', 'pwcn_set_category_for_user');
コードを追加したら、「// ユーザーごとのカテゴリーIDを設定」の部分のコードを自身のサイトに合わせて指定しなおしていけば機能します。
ユーザーID、カテゴリーIDは、各画面のユーザーやカテゴリーをマウスオーバーすると画面左下部に表示されるリンクURL内に「id=〇〇」で表示されますが、一覧上で確認したい方は以下を参考に表示させるようにしてみてください。
結構簡単なコードでカテゴリーの強制ができるんですね。
1点、このコードではsave_postにフックさせて、投稿の保存時(下書き保存や更新、公開をクリックした時)にユーザーIDに対して自動でカテゴリーを紐づけるものですが、保存後にカテゴリー選択パネルを見ると「あれ?変更されないのでは?」と感じるかも知れません。
これは投稿編集画面自体が保存アクションと同時に画面の再読み込みが行われるようになっていないためで、これはWordPressの仕様なのでどうしようもありません。
ただ、自身で画面をリロードしたり、再度編集画面を開いた時にはきちんと設定したカテゴリーに強制されていますので、安心してください(運用上バグでは?と言われそうな場合には、カテゴリーパネル自体を非表示にしてしまうのも手かもしれませんが..)。
後述 どのようなケースでこの機能を使うのか?
WordPressにはマルチサイト(ネットワーク)という機能もありますし、サブディレクトリなどに別のWordPressをインストールすれば、拠点(店舗)ごとのサイトを作り、メインのサイトはメインのサイトで運営するという方法もありますね。
ただ、いずれの場合も、全部のサイトをまとめた一覧って作りにくいんです。
マルチサイトであれば、マルチサイト用の投稿抽出コードを書けば一応すべてのサイトの投稿の一覧を出力することはできるようですがコードの知識が必須となり、単独サイトのようにクエリーループを使って簡単にというわけにはいきません。
また、マルチサイト・サブドメインのいずれの方法でも、RSSフィードをまとめて出力するとか、REST APIを使って取得して出力する方法があるにはあるのですが、前者ではタイムラグが生じますし、後者ではやはりコードをたくさん書いて取得する必要があります。
つまりマルチ(複数)ブログをまとめて..というのはWordPressはちょっと苦手なのです(他のCMSでもこの点は同じでしょう)。
では、これを自由に抽出するには..やはり1つのサイトで運営するのが一番無難で、例えば1つのサイトで複数の店舗の新着情報を持ちつつ、会社自体の情報も載せつつということにしたい場合に何で情報を分けるか..でWordPress標準の分類である「カテゴリー」を使うのが妥当なところでしょう。
その場合に問題となるのが「書き手がきちんと自身の店舗のカテゴリーにしてくれれば..」というところでミスが起こる可能性があることです。
本ページのコードを使うことで、「店舗ごとに1つのユーザーを作る」「各ユーザー(店舗)が投稿を作る時は必ず特定のカテゴリー(店舗のカテゴリー)に自動割り当てされる」ということが実現でき、書く方の設定ミスも、運営側のチェックも不要になり、各段に運営しやすくなると思います。
コメントを残す