编辑文件:deployment-checklist.md
# yinbomfg 上线部署清单(Deployment Checklist) > 配合 2026-07-21 全站审计 + 代码层修复使用。本文档覆盖**部署代码 → 线上 WP 后台配置 → 验证**全流程。 > 代码层修复已在本地仓库完成并通过 `php -l`;本清单是**部署后必须在线上做的操作**。 > 本目录是本地 phpstudy 副本——所有后台/DB 操作请在 **线上 www.yinbomfg.com** 执行,本地改 SQL 无意义。 --- ## 阶段 0:部署前准备(本地 / 你自己) - [ ] **0.1 重新生成 salts**(当前 salts 在 git 历史中已泄露) - 访问 https://api.wordpress.org/secret-key/1.1/salt/ 获取 8 个新值 - 替换 `wp-config-local.php` 里的 `AUTH_KEY` … `NONCE_SALT`(共 8 个;`WP_CACHE_KEY_SALT` 可选) - [ ] **0.2 确认 `wp-config-local.php` 的 DB 凭证**(当前是本地 phpstudy 的;线上的 DB_USER/DB_PASSWORD 可能不同) - 若线上 DB 凭证不同,把 `DB_NAME`/`DB_USER`/`DB_PASSWORD`/`DB_HOST` 也放进 `wp-config-local.php` 并在 `wp-config.php` 用 `defined()` 回退(当前 DB 凭证仍写死在 wp-config.php,按需调整) - [ ] **0.3 注意:`.htaccess` 被 gitignore** - 通过 git 部署时 `.htaccess` **不会传输**;请用 FTP/rsync/面板单独上传本地的 `.htaccess`(含新的 readme/license 屏蔽规则) - [ ] **0.4 决定 `DISALLOW_FILE_MODS`** - `wp-config.php` 里 `define('DISALLOW_FILE_MODS', true);` 当前**注释**(因为装语言包需要后台写文件) - **完成阶段 2 全部后台操作(尤其语言包)后**,取消注释以加固 --- ## 阶段 1:部署代码 - [ ] **1.1 部署以下文件到线上**(覆盖同名文件) - `wp-config.php` - `wp-config-local.php`(**新生成,勿提交 git**) - `.htaccess`(手动上传,见 0.3) - `wp-content/mu-plugins/clothb2b-catalog.php` - `wp-content/themes/astra-child/functions.php` - `wp-content/themes/astra-child/front-page.php` - `wp-content/themes/astra-child/style.css` - `wp-content/themes/astra-child/inc/*.php`(product-images / woocommerce / homepage / header-footer / **carousel**) - `wp-content/themes/astra-child/template-parts/home/*.php`(cb-carousel **新** / cb-hero / cb-categories / cb-fitting / cb-new-arrivals / cb-product-card / cb-stats / cb-about / cb-testimonials / cb-cta) - `wp-content/themes/astra-child/page-templates/*.php`(who-we-are / faq / inquiry / full-width) - `wp-content/themes/astra-child/assets/css/*.css`(tokens / base / components / woocommerce / rtl —— 旧的 theme.css 已删除) - `wp-content/themes/astra-child/assets/js/lang-switcher.js` - `wp-content/themes/astra-child/assets/js/hero-carousel.js`(**新**,首页轮播) - `wp-content/themes/astra-child/assets/data/testimonials.json` - `wp-content/themes/astra-child/assets/images/categories/*.svg`(women / man / kids) - `wp-content/themes/astra-child/languages/*.mo`(9 个:ar/de_DE/es_ES/fr_FR/id_ID/pt_BR/tr_TR/vi/zh_CN) - `wp-content/themes/astra-child/languages/*.po`(9 个,可选,便于后台 Poedit 再编辑) - `wp-content/themes/astra-child/languages/clothb2b.pot` - `wp-content/themes/astra-child/languages/.seed-locales.php`、`.make-pot.php`、`.build-all.php`、`.compile-mo.php`(可选,维护用) - [ ] **1.2 清缓存**:服务器/CDN/对象缓存(WP Rocket/LiteSpeed/Cloudflare 等)全清一次 --- ## 阶段 2:线上 WP 后台配置(部署代码后,按此顺序) ### 🔴 阻断项(先做) - [ ] **2.1 [A1] 配通 SMTP + 改真实邮箱** —— 最关键,否则询盘邮件全丢 - ⚠️ **顺序很重要:先配通 SMTP(让 wp_mail 能发出),再改 admin_email(否则改邮箱的确认邮件发不出)。** - **① 装 WP Mail SMTP 插件**:后台 → 插件 → 安装插件 → 搜「WP Mail SMTP」→ 安装并启用 - **② 配置 SMTP**:后台 → WP Mail SMTP → 设置 - Mailer = `Other SMTP`(腾讯企业邮 / 阿里云 / 网易 / Zoho 等通用;Gmail 用 Gmail mailer + OAuth) - SMTP Host / Port / Encryption 按服务商填(见下表);Authentication = 开 - Username = `sales@yinbomfg.com`;Password = **授权码**(**非 Web 登录密码**,多数服务商需单独生成) - From Email = `sales@yinbomfg.com`;**Force From Email = 开** ✅(确保过 SPF;询盘 Reply-To 仍指向访客邮箱);From Name = `yinbo` - **③ 测试**:WP Mail SMTP → 工具 → Send a Test Email → 收件人 `sales@yinbomfg.com` → 到信箱确认收到 - **④ 改 admin_email(SMTP 已通后)**:后台 → 设置 → 常规 → 管理员电子邮件 → `sales@yinbomfg.com` → 到信箱**点确认链接**(WP 安全机制,不点不生效) - **⑤ WC 发件人**:后台 → WooCommerce → 设置 → 邮件 → 发件人地址 → `sales@yinbomfg.com` - (询价表单收件人自动读 `admin_email`,无需改表单;旧 CF7 form 16 不再使用,可留可删) 服务商 SMTP 参数参考(实际以凭据为准): | 服务商 | SMTP Host | Port | Encryption | |---|---|---|---| | 腾讯企业邮(Exmail) | smtp.exmail.qq.com | 465 | SSL | | 阿里云邮件推送 | smtpdm.aliyun.com | 465 | SSL | | 网易企业邮 | smtp.qiye.163.com | 994 | SSL | | Zoho Mail | smtp.zoho.com | 465 | SSL | | Google Workspace | smtp.gmail.com | 587 | TLS(用 OAuth) | | Resend / SendGrid / Postmark / Brevo | 各自 endpoint | 587 | TLS | - [ ] **2.2 [B5] 启用 HTTPS** - 确保证书已装;后台 → **设置 → 常规** → `WordPress 地址` 与 `站点地址` 改为 `https://www.yinbomfg.com` - 后台 → **WooCommerce → 设置 → 高级** → 勾选 `安全结账`(或在 `wp_options` 设 `woocommerce_force_ssl_checkout = yes`) - 服务器层加 http→https 301 跳转 - [ ] **2.3 [A7] 关闭客户注册 + 移除购物车 widget** - 后台 → **WooCommerce → 设置 → 账户和隐私** → 取消勾选 `允许客户在"我的账户"页面注册账户` - 后台 → **外观 → 小工具** → 检查所有侧边栏/页脚,**移除**任何 `购物车` / `WooCommerce 购物车` widget(mu-plugin 已注销该 widget,这里是清理已挂的实例) - [ ] **2.4 [A2] 激活 8 个语言** - 后台 → **Languages → Languages** → 逐个添加并启用:es(西班牙语) / fr(法语) / de(德语) / tr(土耳其语) / vi(越南语) / ar(阿拉伯语, RTL) / pt(巴西葡语) / id(印尼语) - 后台 → **Languages → 设置**: - **文章类型、分类法和语言**:勾选 `product (products)` 和 `wpcf7_contact_form`(这样商品/表单才能做翻译)—— 修 B16 - 验证:前台点语言切换器 → 各语言首页 Hero/版型/页脚应已本地化(`.mo` 生效) - [ ] **2.5 [A3] 启用 SEO + sitemap** - 后台 → **插件** → 启用 `Rank Math SEO` - 删除线上的物理 `robots.txt`(让 Rank Math/WordPress 虚拟版接管,自动含 `Sitemap:`) - 或手动编辑物理 `robots.txt`,末尾加:`Sitemap: https://www.yinbomfg.com/sitemap_index.xml` - 访问 `https://www.yinbomfg.com/sitemap_index.xml` 确认 200 - [ ] **2.6 [A6] 清理 CatalogX 残留**(确认不再用 CatalogX 后) - 后台 → **插件** → 确认 CatalogX / WooCommerce Catalog Enquiry 未启用且不需要 - 执行 SQL(备份后): ```sql DELETE FROM wp_options WHERE option_name LIKE 'catalogx_%'; DROP TABLE IF EXISTS wp_catalogx_enquiry, wp_catalogx_messages, wp_catalogx_rules; ``` - 同时清 `wp_options` 里 `recently_activated` 中的相关项(可选) ### 🟡 重要项 - [ ] **2.7 [B8] 切换询价表单** - 后台 → **页面** → 编辑 `B2B Entrance` - 把正文里的 `[contact-form-7 id="16" title="B2B Inquiry"]` 替换为 `[clothb2b_inquiry_form]` - 更新页面;前台访问 B2B Entrance 确认新表单渲染 - [ ] **2.8 [B9] 给商品赋版型属性**(让 Shop by Fitting 筛选生效) - 后台 → **商品** → 编辑每个商品 → **属性** → 添加 `Fitting` → 选一个值: - Classic Denim Jacket → Regular / Slim Fit(按实际) - 其余 8 个商品各选一个(slim-fit / regular / relaxed / tailored / oversized / cropped) - `pa_fitting` 属性与 6 个 term 由代码自动注册(首次访问首页即创建);若属性下拉里没出现 `Fitting`,先访问一次前台再回来 - [ ] **2.9 [B4] 修导航菜单**(只补 Home/Shop,**不加** Cart/Checkout/My Account) - 后台 → **外观 → 菜单** → 编辑 Primary Menu - **添加**:Home(首页)、Shop(全部商品) - **确认移除**:Cart、Checkout、My Account(若有) - 为每种激活的语言分配/翻译菜单(或保留兜底:非默认语言会自动用默认语言菜单 + `.mo` 本地化标签) - [ ] **2.10 [B2] 补页面内容** - `News` 页:发布至少 1 篇文章(文章 → 写文章) - `Privacy Policy`(当前草稿):填真实隐私政策文案 → 发布 - `Refund and Returns Policy`(当前草稿):替换 `{email}` / `{physical address}` 占位 → 发布 - [ ] **2.11 [B3] 清理 demo 数据** - 文章 → 删除 `Hello world!`(移至回收站 → 永久删除) - 评论 → 删除示例评论(A WordPress Commenter) - 联系表单 → 删除 `Contact form 1`(ID 10,默认表单,不再使用) - (可选)外观 → 自定义 → 清理旧 `twentytwentyfive` widget 残留 - [ ] **2.12 [C12] 重建商品 lookup 表** - 后台 → **WooCommerce → 状态 → 工具** → 点 `Regenerate product lookup tables` ### 🔧 部署后必做一次性操作 - [ ] **2.13 刷新固定链接**(让 `pa_fitting` 归档页 `fitting/<slug>/` 生效) - 后台 → **设置 → 固定链接** → 不改任何东西,直接点 **保存更改** - [ ] **2.14 (可选)启用 DISALLOW_FILE_MODS** - 完成 2.1–2.13 全部后,编辑线上 `wp-config.php`,取消注释 `define( 'DISALLOW_FILE_MODS', true );` - 注意:此后 WP 自动更新也被禁用,需配套外部更新方案 - [ ] **2.15 首页轮播图(Hero Slides,新功能)** - 部署后后台左侧应出现「Hero Slides / 幻灯片」菜单(CPT `carousel_slide`,由 `inc/carousel.php` 注册) - **Polylang 同步设置**:后台 → Languages → 设置 → 同步 → 勾选「特色图片」「排序 (menu_order)」(让各语言幻灯片自动共用图片与顺序,只译文字) - **建 3~5 张幻灯片**:Hero Slides → 新建 - 标题 = 大标题(如 `2026 春夏新品`) - 摘要 = 副标题 - 特色图片 = 背景图(建议 ≥1920×1080,横向) - 右侧「Slide button (optional)」= 自定义按钮文字 + 链接(**留空** = 默认 `SHOPPING GOODS` → `/shop/`;持久「Inquire Now」按钮始终显示) - 「Order」= 排序数字,小的在前 - **多语言**:每张幻灯片用 Polylang 语言盒建对应语言副本(译标题/摘要;图片可自动同步) - 0 张幻灯片时自动回退到原静态 hero(无需任何操作) - [ ] **2.16 手机端菜单:两行平铺常驻(重点验证)** - 实现:`components.css` 的 `body.ast-header-break-point` 段(基于线上 Astra 4.13.6 **实测 DOM**:隐藏汉堡 `.ast-button-wrap`、让移动菜单 `#ast-hf-mobile-menu` 常驻并横向 wrap 两行、语言开关移右上) - 手机端首页应:菜单**两行平铺常驻**、7 项全可见、无横向滚动、语言开关在右上不重叠 - ⚠ 本地无法验证,**部署后第一时间真机核实**: - 正常 → 完成 - 异常(菜单消失/错位)→ **临时回退**:注释掉 `components.css` 里整段 `body.ast-header-break-point` 规则(恢复 Astra 原生汉堡,菜单立即可见),再排查 - 备选(纯后台、无 CSS 依赖):外观 → 自定义 → Header Builder → Mobile 标签 → 把 Primary Menu 拖进 mobile 行、移除 Toggle → 发布 --- ## 阶段 3:验证(live URL) 逐项 curl / 浏览器检查 `https://www.yinbomfg.com`: ### 安全 - [ ] `curl -sI https://www.yinbomfg.com/readme.html` → `403` - [ ] `curl -sI https://www.yinbomfg.com/wp-config-local.php` → 空白(不泄露 salts) - [ ] `curl -sI https://www.yinbomfg.com/license.txt` → `403` ### 目录站(A7,重点) - [ ] 全站源码无 `加入购物车` / `add.to.cart` / `View Cart` 按钮 - [ ] `/cart/` `/checkout/` `/checkout/order-pay/1/` `/my-account/orders/` `/my-account/downloads/` → 全部重定向首页 - [ ] My Account 页只有 `账户详情` + `退出`,无 `订单`/`下载`/`地址` 标签 - [ ] DevTools → Network → 过滤 `wc-ajax`:无 `get_refreshed_fragments` 请求 - [ ] 访客无法注册账户(注册开关已关) ### 价格 / 询价 - [ ] `curl -s https://www.yinbomfg.com/wp-json/wc/store/products` → 响应中无真实 `price` 字段 - [ ] 商品页点 `Inquire Now` → 跳 B2B Entrance,表单上方预填商品名 - [ ] 提交表单 → `sales@yinbomfg.com` 收到邮件,含 `Product:` 和 `Product ID:` - [ ] 不填必填项提交 → 显示错误提示(`?inquiry=error`);正常提交 → 成功提示(`?inquiry=sent`) ### 版型筛选(B9) - [ ] 首页点 `修身版` 卡 → 跳 `fitting/slim-fit/` 归档页,仅显示该版型商品 - [ ] 6 张卡各点一次,URL 各不相同 ### 多语言(10 语言) - [ ] 语言切换器列出全部 10 语言 - [ ] `/zh/` `/es/` `/fr/` `/de/` `/tr/` `/vi/` `/ar/` `/pt/` `/id/` 各访问,Hero 标题/副标题/CTA、版型卡标签、页脚版权、日期格式均本地化 - [ ] `/ar/` 布局 RTL 镜像(语言切换器在左、文字右起) - [ ] `curl -s https://www.yinbomfg.com/zh/ | grep 'og:locale'` → `zh_CN`(下划线) ### SEO - [ ] `curl -s https://www.yinbomfg.com/sitemap_index.xml` → 200,含商品/分类 - [ ] `curl -s https://www.yinbomfg.com/robots.txt` → 含 `Sitemap:` 行 ### 首页 / 显示 - [ ] New Arrivals 3 张卡显示**商品名**(非 "New Arrivals") - [ ] 无商品时显示 `New arrivals coming soon.` ### 首页轮播图(新功能) - [ ] 桌面:幻灯片淡入淡出、约 5s 自动切换、鼠标悬停暂停、左右箭头 + 底部分页点可点 - [ ] 键盘:焦点在 hero 内按 ←/→ 可切换 - [ ] 切 10 语言:每语言显示对应幻灯片;`/ar/` RTL 下轮播方向与遮罩正确 - [ ] 删空所有幻灯片 → 回退到原静态 hero 正常显示 - [ ] Lighthouse 移动端审计无严重回归 ### 移动端(DevTools 360/375/414 + 真机) - [ ] **主菜单两行平铺常驻**,7 项全可见、无横向滚动、不与右上语言开关重叠(若仍折叠为汉堡 → 执行 2.16 的 Header Builder 兜底) - [ ] hero 触屏左右滑动可切幻灯片、文字清晰、两个 CTA 可点 - [ ] 语言下拉面板不溢出右侧视口(320px 屏) - [ ] 全站无横向滚动条(重点查页头、证言、fitting 卡标签、分页) --- ## 阶段 4:长期内容(多语言铺开) 代码 + `.mo` 已让 UI/模板本地化;以下仍需译者在后台逐语言补**正文**内容: - [ ] 每种语言:Home(用模板自动,无需)/ Shop / B2B Entrance / Who We Are / FAQ / News 页面正文翻译 - [ ] 每种语言:9 个商品名 + 描述翻译 - [ ] 每种语言:建/翻译导航菜单(建好后菜单兜底自动变为 no-op) - [ ] Polylang → Strings Translations:复核 `Inquire`/`Inquire Now`/表单字段译法(`.mo` 已兜底,这里可选覆盖) > 提示:首页 Hero、版型 6 词、新品区块标题、页脚版权、日期格式、"Inquire" 按钮、语言切换器名——已由代码 + `.mo` 自动本地化,**无需**在后台处理。 --- ## 回滚 - 代码:还原部署前的备份文件(mu-plugin / functions.php / theme.css 等) - DB:还原 `wp_options` 的 `siteurl`/`home`/`admin_email`/`active_plugins` 等 - 翻译:`.mo` 删除即回退英文
保存
返回