页面标题、SEO 与微信分享统一方案(2026-07-10)
页面标题、SEO 与微信分享统一方案(2026-07-10)
一、问题根因
WAP 公共头模板 themes/default/Wap/public/header.html 原先写死为「城市名 + 站点名」,未读取 Action 设置的 $mobile_title。
因此即使 ShopAction::initShopWechatShare() 已设置商家名,浏览器 <title> 仍显示「合肥市法律服务网」等站点名。
微信分享 JS(static/default/wap/js/wechat-share.js)在服务端未传标题时会回退到 document.title,页面标题错误会导致分享标题一并错误。
二、统一规则
1. 页面标题 = 微信分享标题
- 每个 Action 设置
$this->mobile_title CommonAction::seo()在输出前强制wechatShare.title = mobile_title- 所有 WAP header 的
<title>统一为:<{$mobile_title|default=$CONFIG['site']['sitename']}>
2. 商家版块(shop / company)
| 页面 | 标题格式 | 示例 |
|---|---|---|
商家主页 detail | 商家名称 | 安徽中特(六安)律师事务所 |
| 商家子版块 | 商家名称(版块名) | 安徽中特(六安)律师事务所(地址) |
商家资讯列表 news | 商家名称(资讯页) | 同上 |
商家资讯详情 news_detail | 文章标题 | 普法宣传进社区 反诈护民暖人心 |
活动详情 activity/detail | 活动标题 | 活动名称 |
员工详情 workerDetail | 员工名 - 商家名 | 张三 - XX律所 |
辅助函数:wap_shop_section_title($shopName, $sectionLabel) → 商家名(版块名)
3. 全站版块
| 页面 | 标题格式 |
|---|---|
| 列表页 | 网站名 + 版块名(wap_site_section_title) |
| 详情页 | 内容标题(文章/招标/分类信息标题等) |
涉及:资讯 News、招标 Tender、招聘 Recruit、分类信息 Life、活动 Activity、首页 Index。
4. 无图分享规则
沿用 help/article/slug/wechat-share.html 与 wechat-share.js:
- Action 有图 →
config_weixin_img()传给imgUrl - 无图 → 不传
imgUrl - 前端:页面第一张有效
<img>→/wap/api/sharethumb裁剪 → 仍无图则/attachs/wx.jpg
三、代码改动摘要
模板层
themes/default/Wap/public/header.html及headernews、headernewsdetail、headerlife等:统一读$mobile_title
CommonAction
- 移除
_initialize()中空的setWechatShare(),避免先用站点默认覆盖 seo():有mobile_title时强制同步微信分享标题与描述
ShopAction
- 各子版块调用
applyShopSectionShare($shop_id, '版块名')或initShopWechatShare() - 已覆盖:detail、gps、评价、预约、活动、相册、介绍、资讯、优惠券、商城、分类信息、招标、二维码、团购、商品、外卖、优惠买单、认领、分店等
全站 Action
NewsAction、TenderAction、RecruitAction、ActivityAction、LifeAction、IndexAction设置列表/详情标题
四、SEO 后台整合
优先级
- Action 显式
mobile_title(商家名、文章标题等动态页) by_seo表模板(module_action键,如news_index)- 站点默认
site.sitename
数据清理
执行迁移 docs/sql/migrations/V20260710_002_seo_prune_invalid.sql:
- 删除空
seo_key、空seo_title - 删除重复
seo_key(保留seo_id最小的一条)
后台 backstage/seo/index 列表已按 seo_key asc 排序,便于分页管理。
五、验证清单
| URL | 期望标题 |
|---|---|
/wap/shop/detail/shop_id/8.html | 商家名称 |
/wap/shop/gps/shop_id/8.html | 商家名(地址) |
/wap/shop/news/shop_id/810.html | 商家名(资讯页) |
/wap/shop/news_detail/article_id/1938.html | 文章标题 |
/wap/news/index.html | 网站名+资讯 |
/wap/tender/index.html | 网站名+招标采购 |
刷新方式:浏览器 Ctrl+F5 强刷;微信内可重新打开链接测试分享卡片。
六、保安站 ba 同步说明
逻辑与模板两端一致;保安站数据库 mybaoanfuwuw 需单独执行上述 SQL 迁移。文案示例按保安站用语,代码路径相同。
操作说明(管理员/运维):见帮助 页面标题、SEO 与微信分享操作说明(slug: page-title-seo-wechat-share-ops)。
七、第二轮补全(2026-07-10 续)
新增 CommonAction 辅助方法
applySiteSectionShare($sectionLabel, $linkParams, $route):全站列表页「网站名+版块名」applyContentDetailShare($title, $link, $desc, $imgUrl):详情页标题即分享标题
已补全模块
| 模块 | 列表 | 详情 |
|---|---|---|
附近招聘 Nearwork | 网站名+附近招聘 | 职位标题 |
职业人才 Career | 网站名+职业人才 | 职业名 - 昵称 |
分类信息 Life/channel | 网站名+频道名 | (沿用 detail) |
商家列表 Shop/index | 网站名+商家 | — |
AI助手 Ai | 商家名(AI助手)或全站 AI | — |
SEO 后台
backstage/seo/index 增加「清理无效模板」按钮,调用 SeoAction::pruneInvalid(),等价于迁移 V20260710_002 的清理逻辑。
模板
life/detail.html去掉手写$mobile_title,统一走 Action + header
