搜索全站
主题 13 分钟阅读

为什么导入演示数据后还是和主题演示站不一样:原因与修复方法

同样的主题,别人导入后是精致官网,你导入后是配色错乱、菜单不在位。本文讲清演示站依赖的三层数据:演示内容、必需插件、Customizer 全局设置,并给出逐项修复代码。

U
UFO_PF 2021-02-22 · 阅读 13 分钟
为什 主题
阅读提示
本文约 4,846 字,预计阅读 13 分钟。文中命令与配置均经过实测,可直接参考执行。

引言:点完“Import Demo”后,那股熟悉的失落感

几乎每个装过商业主题的人都经历过:在商品页看到的演示站是精致的多屏官网,安装后点一键导入,得到的却是——导航菜单位置空了、首页版式变成了默认博客列表、配色是主题默认的蓝黑、有些区块干脆不显示。

第一反应是“主题有问题”。实际上,演示站是一份完整配置的快照,而一键导入通常只搬运了其中一部分。多数主题的 demo 数据分成三层:

  1. 演示内容(文章、页面、媒体)
  2. 必需插件及其设置
  3. 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

常见踩坑

  1. 以为导入完成就万事大吉。OCDI 只负责导内容,配置必须靠 pt-ocdi/after_import。
  2. 菜单已存在但没分配到菜单位置。这是“导航显示所有页面”的直接原因。
  3. 首页仍是最新文章列表。忘了改 show_on_front 与 page_on_front。
  4. 未刷新固定链接。导入后大量 404 往往只是 rewrite rules 没更新。
  5. 必需插件没装/没启用。表现为特定区块完全不渲染,而不是样式错乱——两者区分很重要。
  6. 重复导入产生双份内容。导入前先清空站点(可用 WordPress Reset 类插件,或命令行 wp site empty),否则菜单/页面会重名冲突。
  7. 案例:某客户导入 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 三件事,把半小时的重复劳动压缩到零。

U
UFO_PF作者

专注 WordPress 生态的实战作者,内容以「可复制、可验证」为第一原则。

留下你的想法

邮箱地址不会被公开。带 * 的为必填项。