イントロダクション
Odooでは“モデル”がデータの設計図になります。顧客情報、請求書、在庫、そしてウェブサイトの各ページも、すべてモデルという枠組みの中で構造化され、データベースに格納されます。
モデルの仕組みを理解することは、開発者だけでなく機能コンサルタントにとっても必須です。モデルがフィールド、関係性、そしてビジネスロジックの土台を提供し、システム全体のデータ整合性を担保します。
ここでは website.page モデルに焦点を当てます。これは Odoo の静的ページを管理するためのモデルで、ランディングページや会社概要のように手作業で作成・編集するページに関係します。外部システム連携やカスタムページ作成にも深く関わるモデルです。
website.page モデルとは何か
website.page モデルは、Odoo の Website アプリ内で静的ページを表します。通常、About(会社概要)やContact(お問い合わせ)、キャンペーン用のランディングページなど、管理者が手動で作るページがここに保存されます。
このモデルは ir.ui.view を利用して継承関係を持ちます。_inherits の仕組みで ir.ui.view にリンクし、実際のテンプレート(QWeb の arch)や表示メタデータは関連する view 側に格納されます。
一方で、商品一覧やブログのアーカイブのような動的に生成されるページは扱いが異なります。
動的ページは website.page のレコードとして保存されないことが多く、website.page は主にウェブサイトビルダーで直接作成・編集する静的コンテンツ向けです。
モデルの主要フィールド
以下は website.page モデルでよく使う主要フィールドです。これらを把握しておくとページ管理やカスタマイズがスムーズになります。
1. name
タイプ: Char。ページのタイトルを保持します。ブラウザタブ、メニュー、検索結果などに表示されるので、分かりやすく設定しましょう。多くの場合は関連する ir.ui.view から引き継がれます。
2. url
タイプ: Char。ページのURLパスです。先頭はスラッシュで始める必要があります(例: /contactus, /about-us)。訪問者がアクセスする際のパスになります。
3. view_id
タイプ: Many2one (ir.ui.view)。必須フィールドで、ページのコンテンツを保持する QWeb ビューを参照します。ビューに arch(XMLテンプレート)やユニークな key が保存されます。ビューを削除するとページは連鎖的に削除されます。
4. website_id
タイプ: Many2one (website)。そのページが属するウェブサイトを示します。マルチサイト構成ではサイトごとにページを分けるか、空欄にして共有することができます。
5. is_published
タイプ: Boolean。訪問者に公開されているかどうかを示します。非公開にすると 404 を返すかリダイレクトされるため、削除せずに隠す際に便利です。
6. website_indexed
タイプ: Boolean。検索エンジンにインデックスさせるかを制御します。購入確認やサンクスページのように検索結果に出したくないページは False にします。
7. date_publish
タイプ: Datetime。公開日時を保持します。スケジュール公開や公開日に基づく表示制御で利用します。
8. header_visible
タイプ: Boolean。サイトのヘッダーを表示するかどうか。ランディングやフルスクリーン表示でヘッダーを隠したい場合に使います。
9. footer_visible
タイプ: Boolean。フッターを表示するかどうか。header_visible と同様に、標準のフッターを外したいページで利用します。
10. is_homepage
タイプ: Boolean。計算フィールドで、そのページがトップページに設定されているかを示します。サイトごとにトップページは1件だけです。
11. is_visible
タイプ: Boolean。計算フィールドで、公開状態・公開日時・可視性ルールに基づき実際に見えるかを示します。
12. menu_ids
タイプ: One2many (website.menu)。そのページへリンクするメニュー項目群。複数のメニューに同じページを表示させることも可能です。
13. create_date
タイプ: Datetime。レコード作成日時。Odoo が自動で管理するため監査やレポートに便利です。
14. write_date
タイプ: Datetime。最終更新日時。こちらも自動管理で、コンテンツの更新履歴把握に役立ちます。
15. arch
タイプ: Text。QWeb の XML テンプレート。実際のHTML構造や Odoo スニペットが含まれ、ウェブサイトビルダーから編集できます。通常は関連する ir.ui.view に格納されます。
16. key
タイプ: Char。ビューのユニーク識別子。モジュールの XML やビュー継承で使用され、一般的に module.view_name の形式を取ります。
17. type
タイプ: Selection。ビューの種別。ウェブページでは通常 qweb が使われ、フォームやリストなど他のタイプも存在します。
18. active
タイプ: Boolean。ソフトデリート用フラグ。False にするとアーカイブ扱いとなり、配信されなくなります。これは ir.ui.view 側のプロパティです。
19. website_meta_title
タイプ: Char。SEO用のメタタイトル。検索結果で表示されるタイトルを上書きできるため、SEO対策上重要です。
20. website_meta_description
タイプ: Text。検索結果に表示されるメタ説明文。通常150〜160文字程度に収めると検索結果で見切れにくくなります。
21. website_meta_keywords
タイプ: Char。メタキーワード。現在では重要度は低いものの、一部システムで使われるためカンマ区切りで設定できます。
22. header_overlay
タイプ: Boolean。ヘッダーをコンテンツの上に重ねるかを指定します。ヒーローバナーの上にヘッダーを重ねたいデザインで有効です。
23. header_color
タイプ: Selection。ヘッダーのカラースキーム(透明、ライト、ダークなど)。可読性やコントラストに影響します。
24. visibility
タイプ: Selection。アクセス制御を表すフィールド。公開、ログインユーザーのみ、特定グループ限定、パスワード保護などを設定できます。
25. redirect_type
タイプ: Selection。URLを変更した際のリダイレクト方法を指定します(301 永続、302 一時、なし)。SEOや既存リンクの維持に重要です。
業務フローでの使われ方
1. ランディングページとキャンペーン
マーケティングではキャンペーンごとにランディングページを作成します。各ランディングは website.page のレコードとして管理され、URL、コンテンツ、公開日時(date_publish)をコントロールします。スケジュール公開が必要な場合にも対応できます。
2. 企業情報ページ
会社概要、お問い合わせ、利用規約、プライバシーポリシーなどは典型的な website.page レコードです。通常は一度作成して必要に応じて更新し、メニュー表示は menu_ids で制御します。
3. サンクス/確認ページ
問い合わせ送信後の「ありがとうございました」ページやフォーム送信確認ページは website.page にしておき、website_indexed を False にして検索結果に出さないようにします。
4. マルチサイトとローカライズ
マルチウェブサイト構成では website_id によってどのサイトで表示されるかが決まります。サイトごとにローカライズされたページを複製して運用することも可能です。
5. 会員限定や閲覧制限コンテンツ
visibility フィールドでログインユーザー限定や特定グループ限定のページを作れます。会員エリアや社内向けドキュメントに便利です。
開発者による拡張方法
開発者は Odoo の継承パターンを使って website.page を拡張します。モデル継承が基本的な手段です。
モデル継承の考え方
モデルを拡張する際は _inherit = 'website.page' を使います。これで独自フィールド追加、メソッドの上書き、制約追加などが可能になり、変更を別モジュールに分離して保守やアップグレードを容易にします。
フィールド追加
継承モデル側で必要な Odoo フィールドを定義します。Char、Many2one、Boolean、Integer、Text、Selection など適切な型を選び、マルチサイト対応が必要なら website-dependent な設定も検討します。
Pythonによる拡張
create、write、unlink などをオーバーライドして独自ロジックを入れられます。処理の中では super() を呼び出して元の挙動を維持し、view_id の関係や削除時のカスケードに注意してください。
Odoo Studio の活用
コード不要でレイアウトや簡単なカスタマイズを行いたい場合、Odoo Studio は手早く有用です。ただし、API連携や複雑なロジックが必要なケースでは専用モジュールでの実装が長期的に安定します。
運用上のベストプラクティス
- URL はスラッグ化して人と検索エンジンに読みやすくしましょう。空白や特殊文字を避け、可読性のためにハイフンを使うのが一般的です。
- サンクスページなど検索に出したくないページは website_indexed を False に設定してください。
- URLを変更する場合は適切なリダイレクト(301/302)を設定して、SEO評価を維持しリンク切れを防ぎましょう。
- 公開ページには website_meta_title と website_meta_description を必ず設定しましょう。検索結果での露出とクリック率に大きく影響します。
- APIや XML-RPC でページを作る場合は、先に ir.ui.view を作成し、その view_id を指定して website.page を作成してください。view の type は qweb で一意な key を持つことが必要です。
よくある失敗例
- 有効な view_id なしで website.page を作成すること。ビューは存在し、type が qweb である必要があります。
- スラッシュで始まらない URL を使うこと。Odoo は /contactus のようなパスを期待します。
- サンクスページの website_indexed を忘れること。インデックスされると検索結果に表示され、SEOのノイズになります。
- ページのURLを変更してリダイレクトを設定しないこと。古いリンクが無効になり、検索エンジン側の評価も下がります。
- ウェブサイトビルダーで編集したビューの arch を直接変更する際、ir.model.data の noupdate フラグにより XML の差し替えが反映されないケースがあります。必要に応じてフラグを調整してください。
まとめ
website.page モデルは Odoo における静的ページ管理の中核です。ページのメタデータ、URL、公開設定などを保持し、実際のHTMLコンテンツは関連する ir.ui.view に格納されます。
ir.ui.view からの継承や各フィールドの意味を理解すれば、Odoo のウェブサイト構築やカスタマイズ、外部連携がより確実に行えます。コンサルタントでも開発者でも、website.page の仕組みを押さえておくと時間と手戻りを大幅に削減できます。
Odoo導入のサポートが必要ですか?
Dasolo は企業の Odoo 導入、カスタマイズ、最適化を支援します。API 統合や Odoo 開発に強みを持ち、website.page のようなデータモデルに関する深い知見を有しています。
Odoo の導入支援やカスタムページ作成、外部連携でお困りであれば、ぜひご相談ください。 デモを予約する プロジェクトについて相談しましょう。