v0.10.23: 落地页收口(toggle/内嵌模板 27143/posts cards/info-box)+ dev 3311 修复
This commit is contained in:
@@ -0,0 +1,56 @@
|
||||
/**
|
||||
* # 脚本 导入内嵌 Elementor 模板([elementor-template id="N"] 短代码引用的 post)
|
||||
* 背景:落地页/产品页里的 shortcode widget 会引用 elementor_library 模板
|
||||
* (如 smart-gateways 的 a36c301 → [elementor-template id="27143"],含
|
||||
* “Dusun Updates” 标题 + posts 卡片列表)。原导入管线未迁移 elementor_library,
|
||||
* 这些模板在本地缺失,导致内嵌区块为空。
|
||||
* 数据源:legacy/dusuniot-db-20261029.sql 的 (meta_id, <postId>, '_elementor_data', …)。
|
||||
* 写入 contents:type=template,slug=`template-<postId>`,legacy_id=<postId>,
|
||||
* 供路由按 legacy_id 查询后用 ElementorRenderer 递归渲染。
|
||||
* 运行:bun scripts/import-embedded-templates.ts [postId...]
|
||||
*/
|
||||
import { SQL } from "bun";
|
||||
|
||||
const DUMP = "/home/bigcode/data/dev/sites/dusuniot/legacy/dusuniot-db-20261029.sql";
|
||||
const db = new SQL("postgres://dusuniot:dusuniot@127.0.0.1:25432/dusuniot");
|
||||
|
||||
/** # 成员变量 需要导入的模板 post id(默认:落地页 smart-gateways 内嵌的 27143) **/
|
||||
const ids = process.argv.slice(2).map(Number).filter((n) => Number.isFinite(n));
|
||||
const targets = ids.length ? ids : [27143];
|
||||
|
||||
const text = await Bun.file(DUMP).text();
|
||||
|
||||
/** # 函数 从 dump 提取指定 post 的 _elementor_data(同 import-shop-template 的解析方式) */
|
||||
function extract(postId: number): Record<string, unknown>[] | null {
|
||||
const re = new RegExp("\\(\\d+," + postId + ",'_elementor_data','((?:[^'\\\\]|\\\\.)*)'\\)");
|
||||
const m = text.match(re);
|
||||
if (!m) return null;
|
||||
const json = m[1]!.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/\\\\/g, "\\");
|
||||
const data = JSON.parse(json);
|
||||
return Array.isArray(data) ? (data as Record<string, unknown>[]) : null;
|
||||
}
|
||||
|
||||
for (const id of targets) {
|
||||
const elements = extract(id);
|
||||
if (!elements) {
|
||||
console.error(`post ${id} 未找到 _elementor_data,跳过`);
|
||||
continue;
|
||||
}
|
||||
const slug = `template-${id}`;
|
||||
const title = `Elementor Template ${id}`;
|
||||
const meta = JSON.stringify({ elementor: elements });
|
||||
const existing = await db`SELECT id FROM contents WHERE legacy_id=${id} OR (slug=${slug} AND type='template')`;
|
||||
if (existing.length) {
|
||||
await db`UPDATE contents SET meta=${meta}::text::jsonb, status='published', updated_at=now() WHERE id=${existing[0]!.id}`;
|
||||
console.log(`已更新 ${slug},contents.id = ${existing[0]!.id}`);
|
||||
} else {
|
||||
const inserted = await db`
|
||||
INSERT INTO contents (type, slug, title, status, meta, legacy_id, published_at)
|
||||
VALUES ('template', ${slug}, ${title}, 'published', ${meta}::text::jsonb, ${id}, now())
|
||||
RETURNING id`;
|
||||
console.log(`已插入 ${slug},contents.id = ${inserted[0]!.id}`);
|
||||
}
|
||||
const top = elements.map((el) => String(el.id)).join(", ");
|
||||
console.log(` post ${id} 顶层节: ${top}`);
|
||||
}
|
||||
await db.end();
|
||||
@@ -108,12 +108,12 @@ const meta = JSON.stringify({ elementor: elements });
|
||||
// 写入 contents:type=template / slug=footer;已存在则更新
|
||||
const existing = await db`SELECT id FROM contents WHERE slug='footer' AND type='template'`;
|
||||
if (existing.length) {
|
||||
await db`UPDATE contents SET meta=${meta}::jsonb, status='published', updated_at=now() WHERE id=${existing[0]!.id}`;
|
||||
await db`UPDATE contents SET meta=${meta}::text::jsonb, status='published', updated_at=now() WHERE id=${existing[0]!.id}`;
|
||||
console.log("已更新 footer 模板,contents.id =", existing[0]!.id);
|
||||
} else {
|
||||
const inserted = await db`
|
||||
INSERT INTO contents (type, slug, title, status, meta, legacy_id, published_at)
|
||||
VALUES ('template', 'footer', 'Footer', 'published', ${meta}::jsonb, 58, now())
|
||||
VALUES ('template', 'footer', 'Footer', 'published', ${meta}::text::jsonb, 58, now())
|
||||
RETURNING id`;
|
||||
console.log("已插入 footer 模板,contents.id =", inserted[0]!.id);
|
||||
}
|
||||
|
||||
@@ -29,12 +29,12 @@ const elements = await extractTemplate(1398);
|
||||
const meta = JSON.stringify({ elementor: elements });
|
||||
const existing = await db`SELECT id FROM contents WHERE slug='shop-archive' AND type='template'`;
|
||||
if (existing.length) {
|
||||
await db`UPDATE contents SET meta=${meta}::jsonb, status='published', updated_at=now() WHERE id=${existing[0]!.id}`;
|
||||
await db`UPDATE contents SET meta=${meta}::text::jsonb, status='published', updated_at=now() WHERE id=${existing[0]!.id}`;
|
||||
console.log("已更新 shop-archive 模板,contents.id =", existing[0]!.id);
|
||||
} else {
|
||||
const inserted = await db`
|
||||
INSERT INTO contents (type, slug, title, status, meta, legacy_id, published_at)
|
||||
VALUES ('template', 'shop-archive', 'Shop Archive', 'published', ${meta}::jsonb, 1398, now())
|
||||
VALUES ('template', 'shop-archive', 'Shop Archive', 'published', ${meta}::text::jsonb, 1398, now())
|
||||
RETURNING id`;
|
||||
console.log("已插入 shop-archive 模板,contents.id =", inserted[0]!.id);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user