本文约 4,846 字,预计阅读 13 分钟。文中命令与配置均经过实测,可直接参考执行。
引言:点完“Import Demo”后,那股熟悉的失落感
几乎每个装过商业主题的人都经历过:在商品页看到的演示站是精致的多屏官网,安装后点一键导入,得到的却是——导航菜单位置空了、首页版式变成了默认博客列表、配色是主题默认的蓝黑、有些区块干脆不显示。
第一反应是“主题有问题”。实际上,演示站是一份完整配置的快照,而一键导入通常只搬运了其中一部分。多数主题的 demo 数据分成三层:
- 演示内容(文章、页面、媒体)
- 必需插件及其设置
- Customizer / 全局样式设置(菜单位置、首页显示方式、配色)
只搬第一层,后两层没跟上,就出现了“同样的主题,不一样的效果”。本文按这三层逐一给出修复方法。若你的问题出在“根本导入不了”或导入中断,请转看主题演示数据导入失败的排查方法。
原理分析:演示站效果的三个来源,以及它们各自的存放位置
| 构成 | 存放位置 | 是否随 demo 走 | 丢了会怎样 |
|---|---|---|---|
| 页面/文章内容 | wp_posts(WXR 导入 / OCDI) |
是(多数情况) | 首页/Sitemap 结构与演示一致,但样式不对 |
| 菜单与菜单位置 | wp_terms + theme_mods_<slug> 的 nav_menu_locations |
部分 | 导航空白或显示默认的所有页面列表 |
| 首页显示方式 | show_on_front / page_on_front option |
否 | 首页仍是最新文章列表 |
| 配色/排版/全局样式 | theme_mods_<slug> 或 wp_global_styles |
部分 | 颜色、字号、间距全部回到默认 |
| 必需插件的设置/自定义 CSS | 各自的 option / custom_css post |
否 | 缺失支付/表单/滑块的定制配置 |
关键点在于:WXR(WordPress eXtended RSS)这种标准导出格式本身不包含 option 和 post meta,而恰恰是 option 里装着“首页用哪个页面”“菜单位置在哪”“主色是什么”。所以依赖 WXR 的导入天生就只能复现内容层。
因此,要完整复现演示站,主题作者必须额外做三件事:用 OCDI 的 after_import 钩子把菜单分配到位置、把 show_on_front 设成静态页、导入 Customizer 的设置文件或直接写明它们需要在 after_import 里写入。
保姆级实操
第一步:确认你的主题用的是哪个导入器。
grep -rn "pt-ocdi/import_files\|One Click Demo Import\|ocdi" wp-content/themes/当前主题/ --include="*.php" | head -10
ls wp-content/plugins/ | grep -i "one-click\|ocdi\|importer"
主流是 One Click Demo Import(OCDI),钩子前缀 pt-ocdi/;也有主题自带 importer(通常钩名前綴自定,见主题文档)。
第二步:补齐菜单三级点心——建菜单 → 加到位置 → 设首页。
这是最常缺的一环。在子主题里写一个一次性的修复脚本:
<?php
// functions.php —— 仅在导入后执行一次,保护 includes 防止重复运行
add_action( 'init', function () {
if ( get_option( 'mangfei_demo_setup_done' ) ) {
return;
}
$locations = get_theme_mod( 'nav_menu_locations' );
$primary = wp_get_nav_menu_object( '主菜单' ); // 演示数据导入的菜单名
if ( $primary && ! isset( $locations['primary'] ) ) {
set_theme_mod( 'nav_menu_locations', array(
'primary' => $primary->term_id,
'footer' => ( wp_get_nav_menu_object( '页脚菜单' ) )->term_id ?? 0,
) );
}
// 关键:把首页设为静态页
$front = get_page_by_path( 'home', OBJECT, 'page' )
?: get_page_by_title( '首页', OBJECT, 'page' );
if ( $front ) {
update_option( 'show_on_front', 'page' );
update_option( 'page_on_front', $front->ID );
}
update_option( 'mangfei_demo_setup_done', 1 );
} );
第三步:用 OCDI 的 after_import 钩子做标准收尾。
add_action( 'pt-ocdi/after_import', function ( $selected_import ) {
// 1) 分配菜单位置
$menus = array( 'primary' => '主菜单', 'footer' => '页脚菜单' );
$locations = array();
foreach ( $menus as $loc => $name ) {
$menu = wp_get_nav_menu_object( $name );
if ( $menu ) {
$locations[ $loc ] = $menu->term_id;
}
}
set_theme_mod( 'nav_menu_locations', $locations );
// 2) 设置静态首页(演示数据里通常含名为 Home/首页 的页面)
$front_page = get_page_by_title( '首页' );
if ( $front_page ) {
update_option( 'show_on_front', 'page' );
update_option( 'page_on_front', $front_page->ID );
}
// 3) 刷新固定链接,避免出现 404
flush_rewrite_rules();
} );
第四步:检查 Customizer 的全局设置是否被搬运。
# 查看当前主题的 theme_mods 里有哪些键(对比导入前后)
wp option get theme_mods_当前主题slug --format=json | python -c "import json,sys; d=json.load(sys.stdin); print(list(d.keys()))"
# 自定义 CSS 通常存在 custom_css post type 里
wp db query "SELECT ID, post_title FROM wp_posts WHERE post_type='custom_css';"
若 theme_mods_<slug> 几乎为空,说明主题的导入流程没有搬运 Customizer 设置。解决办法是从演示站/my 主题的文档里找 .dat 导出文件(Customify/自定义导出导入插件生成),或用 set_theme_mod() 手工写关键项。
第五步:补齐必需插件与它们的设置。
# 确认演示依赖的插件是否都已安装
grep -rn "tgmpa_register" wp-content/themes/当前主题/ -l
wp plugin list --status=active --fields=name,version --format=table
缺插件时,很多区块会直接不渲染(尤其是 Elementor/WPBakery widgets),表现是“首页缺了一大块”。这是最常见的“不一样”场景。
第六步:重建媒体(跨域名图片失效的处理)。
演示站常直接用远程图片,或者反向:本地缺未被真正导入。
wp media regenerate --yes
wp db query "SELECT COUNT(*) FROM wp_posts WHERE post_type='attachment';"
第七步:固定链接刷新与缓存清理。
wp rewrite structure '/%postname%/' --hard
wp rewrite flush --hard
wp cache flush
wp transient delete --all
常见踩坑
- 以为导入完成就万事大吉。OCDI 只负责导内容,配置必须靠
pt-ocdi/after_import。 - 菜单已存在但没分配到菜单位置。这是“导航显示所有页面”的直接原因。
- 首页仍是最新文章列表。忘了改
show_on_front与page_on_front。 - 未刷新固定链接。导入后大量 404 往往只是 rewrite rules 没更新。
- 必需插件没装/没启用。表现为特定区块完全不渲染,而不是样式错乱——两者区分很重要。
- 重复导入产生双份内容。导入前先清空站点(可用 WordPress Reset 类插件,或命令行
wp site empty),否则菜单/页面会重名冲突。 - 案例:某客户导入 demo 后首页出現两列巨型留白、右侧主图完全不显示。排查发现:用了某滑塊插件的 shortcode,而导入时该插件的 pro 版本未激活;同时 demo 里引入的图片是跨域直链、后期失效本地只留下占位的 attachment 记录。解决方式改成:装演示指定的滑塊插件 →
wp media regenerate→wp transient delete --all。演示站好看的前提是“必需插件 + 媒体 + 设置”三样都到位,缺一样都会走样。
总结
快速诊断顺序(依赖插件值不值得保留可对照主题必装插件太多怎么办判断):先查必需插件是否齐全(区块不渲染=缺插件)→ 再看 show_on_front 是否设为静态页(首页变博客列表)→ 接着看 nav_menu_locations(导航不对)→ 最后看 theme_mods_<slug> 与 custom_css(配色/间距不对)。四步覆盖了九成以上的“装完不像演示站”。
长期建议:把 pt-ocdi/after_import 的收尾代码固化进你的子主题模板里。下次再导入任何主题的 demo,跑一遍就能自动补齐菜单、首页、permalink 三件事,把半小时的重复劳动压缩到零。
