21 KiB
CodePress CMS Handleiding
Inhoudsopgave
Overzicht
CodePress CMS is een lichtgewicht, file-based content management systeem gebouwd met PHP (>=8.0). Werkt zonder database.
Installatie
- Upload bestanden naar webserver
- Stel permissies in voor webserver
- Voer
composer installuit voor CommonMark dependency - Configureer
config.jsonindien nodig - Toegang tot website via browser
- PHP ontwikkelserver:
php -S localhost:8080 -t public(gebruiktcms/router.php)
Projectstructuur
codepress/
├── cms/ # Core CMS engine
│ ├── core/
│ │ ├── class/
│ │ │ ├── CodePressCMS.php # Hoofd CMS class (content, navigatie, search)
│ │ │ ├── Logger.php # Gestructureerd logging systeem
│ │ │ ├── SimpleTemplate.php # Mustache-style template engine
│ │ │ ├── Analytics.php # Bezoekersstatistieken
│ │ │ ├── BotGuard.php # Bot/AI/scraper detectie
│ │ │ ├── GeoIP.php # Landbepaling op basis van IP
│ │ │ ├── Cache.php # File-based caching
│ │ │ └── RateLimiter.php # Snelheidsbeperking per IP
│ │ ├── plugin/
│ │ │ ├── PluginManager.php # Plugin lader en beheer
│ │ │ └── CMSAPI.php # API voor plugin developers
│ │ ├── config.php # Configuratie lader (merge met config.json)
│ │ └── index.php # Bootstrap (autoloader, requires)
│ ├── lang/ # Taalbestanden
│ │ ├── nl.php # Nederlandse vertalingen
│ │ └── en.php # Engelse vertalingen
│ ├── templates/ # Mustache templates
│ │ ├── layout.mustache # Hoofd layout (CSS, structuur)
│ │ ├── assets/ # Header, navigation, footer partials
│ │ ├── markdown_content.mustache
│ │ ├── php_content.mustache
│ │ └── html_content.mustache
│ └── router.php # PHP dev server router
├── admin/ # Admin paneel
│ ├── config/
│ │ ├── app.php # Admin app configuratie (paden, timezone)
│ │ └── admin.json # Gebruikers & security (bcrypt hashes)
│ ├── src/
│ │ └── AdminAuth.php # Authenticatie (sessies, bcrypt, CSRF, lockout)
│ ├── templates/
│ │ ├── login.php # Login pagina
│ │ ├── layout.php # Admin layout met sidebar navigatie
│ │ └── pages/
│ │ ├── dashboard.php # Dashboard met statistieken
│ │ ├── content.php # Content overzicht met bestanden uploaden
│ │ ├── content-edit.php # CodeMirror editor met toolbar en rename
│ │ ├── content-new.php # Nieuwe content aanmaken
│ │ ├── content-dir-form.php # Map aanmaken/bewerken
│ │ ├── content-move-form.php # Content verplaatsen
│ │ ├── config.php # Configuratie editor
│ │ ├── security.php # Beveiligingsinstellingen
│ │ ├── statistics.php # Statistieken dashboard
│ │ ├── plugins.php # Plugin overzicht
│ │ ├── plugins-edit.php # Plugin PHP broncode editor
│ │ ├── plugins-new.php # Nieuwe plugin aanmaken
│ │ ├── plugin-config.php # Plugin configuratie editor
│ │ ├── theme.php # Thema beheer
│ │ ├── users.php # Gebruikersbeheer
│ │ ├── logs.php # Log viewer
│ │ ├── update.php # Systeem update
│ │ └── guide.php # Handleiding
│ └── storage/logs/ # Admin logs
├── cli/ # CLI scripts & tests
├── content/ # Content bestanden
│ ├── -assets/ # Geuploade mediabestanden
│ ├── index.md # Standaard homepage
│ └── ... # Overige content
├── plugins/ # CMS plugins
│ ├── HTMLBlock/ # Custom HTML blokken in sidebar
│ └── MQTTTracker/ # Real-time analytics en tracking
├── public/ # Web root
│ ├── index.php # Website entry point (media serving + CMS)
│ ├── admin.php # Admin entry point + routing
│ ├── .htaccess # Apache rewrite/security rules
│ ├── assets/ # CSS, JS, favicons
│ │ ├── codemirror/ # CodeMirror editor (minified JS/CSS)
│ │ └── css/js/ # Bootstrap, icons, app CSS/JS
│ ├── themes/ # Geuploade theme achtergronden
│ └── manifest.json / sw.js # PWA ondersteuning
├── themes/ # Thema definities
│ ├── default/ # Standaard thema
│ │ └── theme.json # Kleuren, hoogtes, achtergrond
│ └── ... # Andere thema's
├── config.json # Site configuratie
├── version.php # Versie informatie
└── vendor/ # Composer dependencies
Content
Content Structuur
Bestandsstructuur
content/
├── map1/
│ ├── submap1/
│ │ ├── nl.pagina1.md
│ │ └── en.pagina1.md
│ └── pagina3.html
├── map2/
│ └── pagina4.md
├── index.md
└── -assets/
├── afbeelding.jpg
└── document.pdf
Bestandsnamen
- Gebruik lowercase bestandsnamen
- Geen spaties - gebruik
-of_ - Logische extensies -
.md,.php,.html - Unieke namen - geen duplicaten
- Language prefixes -
nl.bestand.mdenen.bestand.md
Media Bestanden
Media bestanden (afbeeldingen, PDFs, video, audio) kunnen in elke content/ subdirectory worden geplaatst en worden geserveerd via:
/-media/pad/bestand.jpg- Media uit elke content subdirectory/-assets/bestand.jpg- Backward compatibility (oude URLs)- Uploads via het admin paneel gaan naar
content/-assets/
Content API (voor PHP content bestanden)
PHP content bestanden (.php in de content/ map) hebben toegang tot een $api variabele met de volgende methodes:
Pagina's opvragen
// Alle pagina's met titels ophalen
$pages = $api->getAllPages();
// Resultaat: ['index' => 'Home', 'over-ons' => 'Over ons', ...]
// specifieke pagina inhoud ophalen
$page = $api->getPage('over-ons');
// $page['title'], $page['content'], $page['path'], $page['layout'], $page['metadata']
// Controleren of een pagina bestaat
if ($api->pageExists('contact')) {
// ...
}
Navigatie
// Menu structuur ophalen
$menu = $api->getMenu();
// Bevat geneste array met 'title', 'path', 'url', 'children'
Configuratie
// Configuratie waarde opvragen (punt-notatie)
$title = $api->getConfig('site_title');
$lang = $api->getConfig('language.default');
$seoDesc = $api->getConfig('seo.description', 'Standaard beschrijving');
Huidige pagina
// Huidige pagina titel
$pageTitle = $api->getCurrentPageTitle();
// Huidige pagina pad
$pagePath = $api->getCurrentPagePath();
// Check of dit de homepage is
if ($api->isHomepage()) {
echo 'Welkom!';
}
URLs en taal
// URL bouwen voor een pagina
$url = $api->buildUrl('over-ons', 'nl');
// Huidige taal
$lang = $api->getCurrentLanguage();
// Beschikbare talen
$languages = $api->getAvailableLanguages();
// Site titel
$title = $api->getSiteTitle();
Vertalingen en zoeken
// Vertaling ophalen
$label = $api->t('home');
// Zoekresultaten (als er gezocht wordt)
if ($api->isSearching()) {
$results = $api->getSearchResults();
}
Voorbeeld PHP content bestand
---
title: Pagina Overzicht
layout: content
---
<h1>Alle Pagina's</h1>
<ul>
<?php foreach ($api->getAllPages() as $path => $title): ?>
<li><a href="<?= $api->buildUrl($path) ?>"><?= htmlspecialchars($title) ?></a></li>
<?php endforeach; ?>
</ul>
Instellingen
Configuratie
De site configuratie wordt beheerd via het admin paneel op /admin/config. Het formulier bevat de volgende secties:
- Algemene instellingen - Site titel en startpagina (dropdown met beschikbare pagina's)
- Taal - Standaard taal en beschikbare talen
- SEO - Meta beschrijving en keywords
- Auteur - Naam en website
- Features - Auto-link pagina's, zoekfunctie, breadcrumbs, versie tonen
- IP Uitsluitingen - IP-adressen uitsluiten van statistieken en beveiligingscontroles
De configuratie wordt opgeslagen in config.json. Je kunt dit bestand ook handmatig bewerken voor geavanceerde opties.
IP Uitsluitingen
Onder Configuratie in het admin paneel vind je het veld "IP-adressen uitsluiten". IP's die hier worden ingevuld worden:
- Niet opgenomen in de bezoekersstatistieken
- Overgeslagen bij alle beveiligingscontroles (bot-detectie, rate limiting, IP blocklist)
Dit is handig voor je eigen IP-adres of dat van interne monitoring tools.
Voorbeeld config.json
{
"site_title": "CodePress",
"content_dir": "content",
"templates_dir": "cms\/templates",
"default_page": "index",
"active_theme": "default",
"language": {
"default": "nl",
"available": ["nl", "en"]
},
"seo": {
"description": "CodePress CMS - Lightweight file-based content management system",
"keywords": "cms, php, content management, file-based"
},
"author": {
"name": "E. Noorlander",
"website": "https:\/\/noorlander.info"
},
"features": {
"auto_link_pages": true,
"search_enabled": true,
"breadcrumbs_enabled": true
},
"analytics": {
"enabled": true,
"excluded_ips": ["127.0.0.1", "::1"]
},
"security": {
"block_ai_bots": true,
"block_scrapers": true,
"block_empty_user_agent": true,
"rate_limit_enabled": true
}
}
Thema's
Thema's worden beheerd via het admin paneel op /admin/theme. Je kunt thema's aanmaken, activeren, kleuren aanpassen, achtergrondafbeeldingen uploaden en verwijderen.
Thema Configuratie (themes/<naam>/theme.json)
{
"name": "Standaard",
"header_color": "#0a369d",
"header_font_color": "#ffffff",
"header_height": "56",
"navigation_color": "#2754b4",
"navigation_font_color": "#ffffff",
"nav_height": "42",
"sidebar_background": "#f8f9fa",
"sidebar_border": "#dee2e6",
"background_image": "",
"background_image_opacity": "100"
}
Een nieuw thema maken
- Ga naar
/admin/theme - Voer een naam in en klik "Aanmaken"
- Pas kleuren, hoogtes en achtergrond aan
- Activeer het thema
Beveiliging
Beveiligingsinstellingen worden beheerd via /admin/security. Hier vind je:
Bot, AI & Scraper Blokkering
Bij binnenkomende requests detecteert het systeem bekende bots en AI-crawlers op basis van de User-Agent header. Gedetecteerde bots krijgen een 403 Forbidden.
| Categorie | Voorbeelden |
|---|---|
| AI Crawlers | GPTBot, ChatGPT-User, Claude-Web, ClaudeBot, Google-Extended, CCBot, PerplexityBot |
| Search Engines | Googlebot, Bingbot, BingPreview, DuckDuckBot, YandexBot, Baiduspider |
| Scrapers | HTTrack, Scrapy, PhantomJS |
Snelheidsbeperking (Rate Limiting)
Voorkomt dat IP's de site overbelasten. Bij overschrijding wordt HTTP 429 geretourneerd.
IP Lijsten
- IP Whitelist - IP's op de whitelist worden nooit geblokkeerd
- IP Blocklist - IP's op de blocklist krijgen altijd een 403 Forbidden
Dynamische robots.txt
Het systeem genereert automatisch een robots.txt op basis van je beveiligingsinstellingen, beschikbaar op /robots.txt.
Gegevens
Statistieken & Analytics
Het statistieken dashboard is beschikbaar op /admin/statistics en biedt:
- KPI-kaarten - Paginaweergaven, unieke bezoekers, mens/bot verhouding, geblokkeerde verzoeken
- Wereldkaart - Visuele weergave van bezoekers per land met kleurintensiteit
- Landenlijst - Top 25 landen met percentage
- Meest gelezen pagina's - Top 25 pagina's
- Dagelijkse grafiek - Staafdiagram van bezoekers per dag
- Verwijzende sites - Top 15 referrers
Periodes en export
Filter op 7, 30, 90 dagen of alles. Exporteer data als CSV of JSON.
GeoIP
Landbepaling kan via drie bronnen:
- Lokaal (DB-IP Lite) - Offline, privacy-vriendelijk, automatisch bijgewerkt
- MaxMind database (.mmdb) - Eigen MMDB bestand
- Externe API - Eigen API URL en sleutel
Logging
De admin console houdt twee logs bij, te bekijken via /admin/logs:
- Activiteiten log (
admin/storage/logs/admin.log) — admin acties zoals pagina's aanmaken, bewerken, verwijderen, plugin in/uitschakelen, configuratie wijzigen. - Requests log (
admin/storage/logs/requests.log) — elke pageview op de website, met IP, pagina, domein, taal, user-agent en referrer.
Het dashboard toont de laatste 20 entries van elk log. Klik "Bekijk alle →" voor de volledige lijst, waar je ook kunt downloaden of wissen.
Systeem
Plugin Systeem
Plugin Structuur
plugins/
├── HTMLBlock/
│ ├── HTMLBlock.php # Plugin class (verplicht)
│ ├── config.json # Configuratie (optioneel)
│ └── README.md # Documentatie (optioneel)
├── MQTTTracker/
│ ├── MQTTTracker.php
│ ├── config.json
│ └── README.md
Plugin Ontwikkeling
- API toegang via
CMSAPIclass - geeft toegang tot CMS configuratie, templates, menu - Sidebar content met
getSidebarContent()- retourneert HTML voor sidebar - Metadata toegang uit YAML frontmatter via
CMSAPI - Configuratie via
config.json- bewerkbaar via admin paneel - viewable veld in config.json bepaalt of plugin zichtbaar is in sidebar
- Per-page zichtbaarheid - via de editor plugin selector per pagina
Plugin Boilerplate
<?php
class MijnPlugin
{
private ?CMSAPI $api = null;
private array $config;
public function __construct()
{
$this->config = [
'viewable' => true,
];
}
public function setAPI(CMSAPI $api): void
{
$this->api = $api;
}
public function getSidebarContent(): string
{
return '';
}
public function getConfig(): array
{
return $this->config;
}
public function setConfig(array $config): void
{
$this->config = array_merge($this->config, $config);
}
}
Bekende Issue: MQTTTracker Credentials
De MQTTTracker plugin slaat broker_host, broker_port, client_id, username en password op in plain text in plugins/MQTTTracker/config.json. Dit is een bekend openstaand security punt - bij een productieomgeving wordt aangeraden deze gegevens te externaliseren naar omgevingsvariabelen of een aparte credentials manager.
Gebruikersbeheer
Gebruikers worden beheerd via /admin/users. Functionaliteiten:
- Gebruiker toevoegen met gebruikersnaam, wachtwoord en rol
- Gebruiker verwijderen
- Wachtwoord wijzigen voor andere gebruikers (admin)
- Eigen wachtwoord wijzigen (vereist huidig wachtwoord)
Wachtwoorden worden opgeslagen als bcrypt-hashes in admin/config/admin.json.
Update
Via /admin/update kan het systeem in één klik worden bijgewerkt via Git pull. De pagina toont de huidige versie en git branch, en voert na bevestiging git pull origin <branch> uit.
Handleiding (in Admin)
Deze handleiding is ook ingebouwd in het admin paneel via /admin/guide, met ondersteuning voor Nederlands en Engels.
Overig
Templates
Template Variabelen
Site Info - site_title, author_name, author_website, author_git
Page Info - page_title, content, file_info, is_homepage
Navigation - menu, breadcrumb, homepage
Theme (uit theme.json) - header_color, header_font_color, header_height, navigation_color, navigation_font_color, nav_height, sidebar_background, sidebar_border, background_image_css, background_image_opacity
Language - current_lang, current_lang_upper, t_* (vertaalde strings)
Layout Opties
Gebruik YAML frontmatter om layout te selecteren:
---
title: Mijn Pagina
layout: sidebar-content
plugins: HTMLBlock
---
Beschikbare Layouts
sidebar-content- Sidebar links, content rechts (standaard)content- Alleen content (volle breedte)sidebar- Alleen sidebarcontent-sidebar- Content links, sidebar rechtscontent-sidebar-reverse- Content rechts, sidebar links
Meta Data
---
title: Pagina Titel
layout: content-sidebar
description: Pagina beschrijving
author: Auteur Naam
date: 2025-11-26
plugins: HTMLBlock, MQTTTracker
---
URL Structuur
Frontend Pagina URLs
- Home:
/of/nl/ - Pagina:
/nl/map/pagina - Zoeken:
?search=zoekterm(via zoekformulier)
Media URLs
- Media:
/-media/pad/naar/bestand.jpg(uit elke content subdirectory) - Assets:
/-assets/bestand.jpg(uit content/-assets/, backward compatible)
Admin URLs
- Admin:
/admin - Dashboard:
/admin/dashboard - Content:
/admin/content - Configuratie:
/admin/config - Beveiliging:
/admin/security - Statistieken:
/admin/statistics - Thema:
/admin/theme - Plugins:
/admin/plugins - Gebruikers:
/admin/users - Logs:
/admin/logs - Update:
/admin/update - Handleiding:
/admin/guide
SEO Optimalisatie
Meta Tags
De CMS voegt automatisch meta tags toe:
<meta name="generator" content="CodePress CMS">
<meta name="author" content="E. Noorlander">
<meta name="description" content="...">
<meta name="keywords" content="...">
Security Headers
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
Referrer-Policy: strict-origin-when-cross-origin
Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline'; ...
Veelgestelde Vragen
Hoe stel ik de homepage in?
- Ga naar Configuratie in het admin paneel (
/admin/config) - Selecteer de gewenste pagina in het Standaard/startpagina dropdown
- Klik op Configuratie opslaan
Hoe werkt de navigatie?
- Mappen worden dropdown menus
- Bestanden worden directe links
- Sub-mappen worden geneste dropdowns
- Alleen bestanden zonder taalprefix tonen in het menu
Hoe voeg ik nieuwe content toe?
- Via het admin paneel:
/admin/content-new - Of upload bestanden naar de
content/map - Organiseer in logische mappen
- Gebruik juiste bestandsnamen en extensies
Hoe verplaats ik een bestand of map?
- Ga naar
/admin/content - Klik op "Verplaatsen" naast het item
- Selecteer de doelmap
- Bevestig de verplaatsing
Hoe sluit ik mijn eigen IP uit van statistieken?
- Ga naar Configuratie in het admin paneel (
/admin/config) - Scroll naar het veld "IP-adressen uitsluiten"
- Voer je IP-adres in (één per regel)
- Klik op Configuratie opslaan
Troubleshooting
Pagina niet gevonden (404)
- Controleer bestandsnaam en pad
- Controleer bestandsextensie (.md, .php, .html)
- Controleer permissies van bestanden
- Controleer of het bestand de juiste taalprefix heeft (
nl.ofen.)
Navigatie niet bijgewerkt
- Herlaad de pagina
- Controleer content map structuur
- Controleer bestandsnamen (geen spaties)
- Bestanden met taalprefix worden alleen getoond in de juiste taalmodus
Admin paneel niet toegankelijk
- Controleer of de sessie nog geldig is
- Bij lockout: wacht 15 minuten of wis
admin/config/admin.jsonlockout data - Controleer CSRF token (herlaad de pagina)
Versie
Huidige versie: 1.9.1 Release datum: 2026-07-29
Ondersteuning
Voor technische ondersteuning:
- Git: https://git.noorlander.info/E.Noorlander/CodePress
- Website: https://noorlander.info
- Issues: Rapporteer problemen via Git issues
Licentie
CodePress CMS is open-source software onder dual-license: AGPL v3 voor open-source gebruik, commerciële licentie voor proprietary gebruik.