网站博客

Odoo 博客为什么不是“写完点发布”这么简单:post_date、website_published 与 SEO 元数据主链路讲透

很多人把 Odoo 博客理解成一个轻量 CMS,但 website_blog 实际把发布时间、站点可见性、摘要生成、访问动作和社交 SEO 元数据串成了一套完整发布链路。

网站
进阶 开发者 1 分钟阅读
0 评论 0 点赞 0 收藏 5 阅读

先说结论

Odoo 博客模块不是“后台写一篇 HTML,前台直接显示”这么简单。

website_blog/models/website_blog.py 看,blog.post 同时继承了:

  • website.seo.metadata
  • website.published.multi.mixin
  • website.page_visibility_options.mixin
  • website.cover_properties.mixin
  • website.searchable.mixin

这几层叠在一起,说明博客在 Odoo 里不是孤立正文模型,而是:

一个同时受发布时间、站点发布状态、封面、搜索、社交分享和访问入口控制的内容对象。

所以“为什么文章已经发布但搜索不到”“为什么写了但前台还不显示”“为什么 URL 已经有了却不能被访客访问”,答案通常都不只在一个字段上。


一、为什么 post_date 比很多人想的更重要

源码里同时有:

  • published_date
  • post_date
  • create_date

其中 post_date 是真正面向网站可见性的发布时间。

逻辑是:

  • 如果设置了 published_datepost_date 就取它;
  • 否则回退到 create_date

而且在搜索域里,普通访客默认只会看到:

  • post_date <= now() 的文章。

这说明 Odoo 的博客发布时间不是装饰字段,而是前台可见性的一部分。

也就是说:

  • “已发布”不等于“立刻对访客可见”;
  • 如果 post_date 在未来,它更像一篇已排期内容。

这对内容运营特别关键。


二、为什么 website_published 不是唯一发布开关

很多新手只记得一个概念:

  • 勾上 published。

但源码里实际是两层共同决定:

  1. website_published / is_published:你是否允许它上站;
  2. 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,而是:

  • 博客容器 + 文章对象 的双层路径。

这个设计的好处是:

  1. 同一站点可以有多个 blog 栏目;
  2. URL 里天然保留内容归属;
  3. 搜索、导航、栏目化组织更自然。

所以如果你把 blog.post 只当“文章表”,会低估这个模型的栏目化能力。


五、为什么 SEO 元数据是博客模型的内建能力

blog.post 直接继承 website.seo.metadata,并在 _default_website_meta() 里生成:

  • og:title
  • og:description
  • og:type=article
  • article:published_time
  • article:modified_time
  • article:tag
  • og:image
  • default_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

评论区

想参与讨论?先 登录 再发表评论。
还没有评论,你可以成为第一个留言的人。