先说结论
Odoo 博客模块不是“后台写一篇 HTML,前台直接显示”这么简单。
从 website_blog/models/website_blog.py 看,blog.post 同时继承了:
website.seo.metadatawebsite.published.multi.mixinwebsite.page_visibility_options.mixinwebsite.cover_properties.mixinwebsite.searchable.mixin
这几层叠在一起,说明博客在 Odoo 里不是孤立正文模型,而是:
一个同时受发布时间、站点发布状态、封面、搜索、社交分享和访问入口控制的内容对象。
所以“为什么文章已经发布但搜索不到”“为什么写了但前台还不显示”“为什么 URL 已经有了却不能被访客访问”,答案通常都不只在一个字段上。
一、为什么 post_date 比很多人想的更重要
源码里同时有:
published_datepost_datecreate_date
其中 post_date 是真正面向网站可见性的发布时间。
逻辑是:
- 如果设置了
published_date,post_date就取它; - 否则回退到
create_date。
而且在搜索域里,普通访客默认只会看到:
post_date <= now()的文章。
这说明 Odoo 的博客发布时间不是装饰字段,而是前台可见性的一部分。
也就是说:
- “已发布”不等于“立刻对访客可见”;
- 如果
post_date在未来,它更像一篇已排期内容。
这对内容运营特别关键。
二、为什么 website_published 不是唯一发布开关
很多新手只记得一个概念:
- 勾上 published。
但源码里实际是两层共同决定:
website_published/is_published:你是否允许它上站;post_date:它是否到了该给访客看的时间。
这两者组合起来,才形成最终可见性。
所以常见误判是:
- “我已经发布了,为什么页面还没出来?”
很多时候不是缓存,也不是 bug,而是:
post_date还没到。
三、为什么摘要 teaser 不是简单复制前 200 字
_compute_teaser() 的逻辑是:
- 如果有手工
teaser_manual,优先用手工摘要; - 否则从正文 HTML 提取纯文本,再截前 200 字。
看起来很简单,但这里有个很重要的产品思路:
Odoo 认为博客摘要首先是运营字段,其次才是正文自动切片。
也就是说,系统默认给你自动摘要兜底,但并不鼓励你永远靠自动截取。
对真正要做内容站的人来说,这很合理,因为:
- 自动截取通常只解决“有摘要”;
- 手工摘要才能解决“摘要是否真的适合列表页、SEO 和分享场景”。
四、为什么 URL 生成不是一个静态 slug 字段
_compute_website_url() 会把 URL 拼成:
/blog/<blog_slug>/<post_slug>
并且 blog 与 post 都通过 ir.http._slug() 处理。
这说明 Odoo 博客的 URL 不是单纯文章 slug,而是:
- 博客容器 + 文章对象 的双层路径。
这个设计的好处是:
- 同一站点可以有多个 blog 栏目;
- URL 里天然保留内容归属;
- 搜索、导航、栏目化组织更自然。
所以如果你把 blog.post 只当“文章表”,会低估这个模型的栏目化能力。
五、为什么 SEO 元数据是博客模型的内建能力
blog.post 直接继承 website.seo.metadata,并在 _default_website_meta() 里生成:
og:titleog:descriptionog:type=articlearticle:published_timearticle:modified_timearticle:tagog:imagedefault_meta_description
而且默认描述会优先走 subtitle。
这说明 Odoo 的博客不是“正文显示出来就结束”,而是默认把:
- 搜索摘要;
- 社交分享卡片;
- Open Graph / Twitter 元数据;
- 发布时间语义;
一起视为发布对象的一部分。
这点非常像真正 CMS,而不只是一个附属资讯页。
六、为什么访问动作会区分员工与分享用户
_get_access_action() 也很值得注意。
如果是 share user 且文章未发布,系统不会直接跳去前台 public URL,而是保留经典访问动作;如果已发布,才会把访问动作直接导向 website_url。
这说明 Odoo 很清楚:
- 后台编辑访问;
- 外部分享访问;
- 公开网站访问;
不是一回事。
所以博客访问看似都是“点开文章”,但底层其实已经分层处理了访问语义。
七、最容易误解的 5 件事
1. 以为勾 published 就一定立刻对外可见
不对。还要看 post_date 是否已到。
2. 以为摘要只是正文前 200 字
不对。手工摘要优先级更高,自动摘要只是兜底。
3. 以为博客 URL 只是文章 slug
不对。它是 blog + post 的双层结构。
4. 以为 SEO 需要额外插件才有
不对。blog.post 已经内建网站 SEO 元数据体系。
5. 以为后台能打开就说明访客也能打开
不对。访问动作和发布状态会共同决定前台可见性。
八、实战运营最该注意什么
1. 排期发布时,一定同时检查 published 和 post_date
只看其中一个字段,很容易误判。
2. 真正重要的文章,尽量写手工 teaser / subtitle
自动摘要够用,但不够精细。
3. 做 SEO 时,不要只盯标题
博客模型已经把发布时间、描述、图片、标签和分享卡片一起纳入元数据。
一句话记忆
Odoo 博客不是“写完正文点发布”,而是“发布时间、网站发布状态、摘要、URL 和 SEO 元数据一起决定一篇内容何时、以什么方式、向谁可见”。
DISCUSSION
评论区