Docs / 引擎核心

引擎核心

GoPress 的引擎核心提供了所有 CMS 功能赖以运行的基础能力。

内容系统

  • 统一内容模型Content + ContentMeta + ContentType 注册表,一套模型驱动所有内容类型
  • 核心内容类型post(文章)、contact_message(联系留言)、category(分类)、tag(标签)在引擎层注册,主题切换后仍保留,不丢失数据
  • 主题内容类型 — 主题在 theme.toml[[content_types]] 中声明自定义内容类型,core 激活主题时自动注册
  • 配置驱动路由/模板 — 同一个 ContentTypeDef 同时驱动后台导航、CRUD 表单、REST API、Rewrite、Sitemap、分类归档和 BaseTheme 动态归档/详情渲染;rewrite_slug 控制公开 URL,templates = { archive = "...", single = "..." } 可把内容类型映射到指定页面模板
  • 链式查询构建器 — 以主题声明的 product 内容类型为例:ContentQuery.Type("product").Published().Taxonomy("category", "hepa").Paginate(1, 20)
  • 分类法系统 — 支持层级分类和标签,多对多关联,自动计数;主题内容类型通过 theme.tomltaxonomies = ["category", "tag"] 挂载核心分类法
  • 分类归档页/category/{slug}/tag/{slug} 跨内容类型聚合展示,类型标签优先使用当前主题 locale 的 content_type.<name>,缺失时回退到当前注册的 ContentTypeDef.Label
  • 分类法类型过滤 — 归档页自动过滤当前主题未注册的内容类型,主题切换后仅显示有效内容
  • 动态归档过滤 — BaseTheme 动态归档页会识别该内容类型已声明的 taxonomy query,例如 /blog?category=industry-news/blog?tag=cleanroom;未挂载到该内容类型的 taxonomy query 会被忽略

product / service / showcase 是示例主题常用约定,不是 core 必须存在的模型。主题可以声明 moduleprojectcase_study 等任意类型,并获得同样的后台、API、路由和模板渲染能力。

Hook 事件总线

AddAction / DoAction / AddFilter / ApplyFilter,插件可拦截生命周期;主题模板通过 {{renderHook "slot.name" .}} 暴露前台扩展插槽。详见 Hook 系统

多级缓存

  • L1 进程内内存缓存 + L2 Redis — 缓存 Key 自动包含语言维度,按标签批量失效
  • 整页缓存 — 中间件级别缓存完整 HTML 响应,命中时 < 1ms 返回
  • 详见 缓存与 i18n

异步任务

  • Worker Pool — Goroutine 工作池 + Cron 定时调度器,异步处理后台任务

用户与权限

  • 用户系统 — JWT 认证 + Session,RBAC 角色权限(admin/editor/author/subscriber)

媒体库

  • 文件上传 + 响应式变体 — 上传时自动生成 thumb/480w/768w/1024w/1440w,配合 WebP 优先输出
  • 详见 媒体变体管线

导航菜单

  • Menu + Item 树形结构 — 多菜单位置注册(header/footer 等),后台可视化拖拽管理
  • 详见 菜单管理

全局设置

  • 启动时加载到内存Options.Get() 零数据库查询
  • admin「系统设置 > 网站设置」site_name / site_description 是全主题统一的"WordPress blogname / blogdescription"等价物

国际化(i18n)

  • 核心 i18n 系统core/i18n Manager + go-i18n 引擎,T() 模板函数,3 层翻译回退(DB → locale 文件 → message ID)
  • Translatable 注册表core/option 提供 RegisterTranslatable,主题设置项无耦合翻译
  • current_lang 作为 ctx key 由核心统一持有,langPrefixURL / currentLang / T / renderHook 均走 BaseFuncMap 下发,主题和插件对接点只有字符串 key,无类型耦合
  • 详见 缓存与 i18n 中的 i18n 段

Demo 数据

  • DemoDataProvider 接口 — 主题实现该接口,后台一键导入演示数据(含远程图片下载 + 媒体库注册)

数据库表前缀

借鉴 WordPress 的 wp_ 前缀机制,GoPress 内置完整的表前缀系统:

  • 可配置前缀 — 默认 gp_,通过 pg.table_prefix 自定义,Web 安装器中可设置
  • 核心表gp_contentsgp_usersgp_optionsgp_media_variants
  • 插件表 — 带 plgn_ 中缀隔离:gp_plgn_multilang_translations
  • 主题表 — 带 thm_ 中缀隔离:gp_thm_financial-news_tickers
  • 表注册表core.RegisterPluginTable() / core.RegisterThemeTable() 追踪所有表的归属,支持按 Owner 查询
  • 双重保障 — Model TableName() + GORM NamingStrategy 双重机制确保表名正确

详见 数据库表前缀