⌘K

Theme Customizations

Editing a theme's files directly works, until that theme gets updated — the update overwrites every file it ships, including the ones you hand-edited. theme/child_theme/ solves this: a reserved folder, under theme/ but never itself treated as a theme, that holds only the files you want to change. No theme install or update ever writes to it, because every install/update only ever touches the specific theme folder it's installing — theme/child_theme/ is never that folder.

How it works

Create theme/child_theme/{active-theme-slug}/ and add only the files you want to override — same filenames as in the theme itself. Everything else keeps loading from theme/{active-theme-slug}/ as usual.

theme/
├── ink/                              ← a theme update overwrites everything here
│   ├── header.php
│   ├── content-articles.php
│   └── css/style.css
└── child_theme/
    └── ink/                          ← never touched by any update
        ├── content-articles.php      ← replaces the theme's version entirely
        └── css/style.css             ← loads in addition to the theme's own, after it
  • Template files (header.php, footer.php, home.php, content-articles.php, 404.php, content-list.php, partials/*.php, page-templates/*.php, etc.): a file present in theme/child_theme/{slug}/ replaces the theme's version entirely — the theme's own copy of that file is never loaded.
  • css/style.css: both load — the theme's own stylesheet first, then yours. Normal CSS cascade means your rules win when they target the same selector, without needing to copy the whole file.
  • js/script.js: both load, theme's own first, deferred, in source order.
  • functions.php: both load — this one is additive, not a replacement, so it's the right place for new helper functions rather than edits to existing ones.

Example: restructuring a template

Say you want every article on the Ink theme to show a reading-time badge above the title, with the featured image moved to the very top of the page instead of below the title — a structural change, not just a color tweak. Copy theme/ink/content-articles.php to theme/child_theme/ink/content-articles.php and rearrange it freely:

<?php
$settings = loadConfig();
$tags     = $item['tags'] ?? [];
$date     = (!empty($item['date']) && !empty($item['show_date'])) ? format_date($item['date']) : '';
$wordCount = str_word_count(strip_tags($item['content'] ?? ''));
$readingMinutes = max(1, (int) round($wordCount / 200));
?>
<article class="ink-single">
    <?php if (!empty($item['image']) && !empty($item['show_featured_image'])): ?>
    <figure class="ink-featured-image">
        <img src="<?php echo getBaseUrl() . htmlspecialchars($item['image']); ?>" alt="<?php echo htmlspecialchars($item['title']); ?>">
    </figure>
    <?php endif; ?>

    <div class="reading-time-badge"><?php echo $readingMinutes; ?> min read</div>

    <h1 class="ink-single-title"><?php echo htmlspecialchars($item['title']); ?></h1>
    <?php // ...rest of the original file, reordered or trimmed as you like ?>
</article>

Nothing beyond this one file needs to change — loadThemeTemplate() checks theme/child_theme/ink/content-articles.php before theme/ink/content-articles.php, finds it, and uses it instead. Every render_*() helper (render_content_html(), render_related_items(), etc.) is available exactly as in any other theme template, since this file is loaded the same way.

What this doesn't cover

Only override files whose loading already goes through the theme's normal file lookup. If you're duplicating a whole template just to change one line, that's expected — Synaptik CMS themes are plain PHP files, not partial-diff patches.

Folder naming

The folder under theme/child_theme/ must match your active theme's own folder name exactly (config.json's active_theme value) — that's how the CMS knows which override belongs to which theme. Switching themes means your override folder for the old theme simply stops being read; it isn't deleted.