WordPress + Elementor oder Craft CMS 5: drei identische Websites auf demselben Server, gemessen an TTFB, SQL-Abfragen und Lighthouse

Drei Firmenwebsites, zuvor auf WordPress mit kostenlosem Elementor neu gebaut, haben wir in Craft CMS 5 von Grund auf nachgebaut: Inhalt, WebP-Dateien und Server identisch, Optik 1:1. Craft liefert 5 statt 97 bis 129 KB JavaScript und braucht bei ähnlicher TTFB weniger als halb so viele SQL-Abfragen. Als typisches WordPress mit 9 bis 21 Plugins hatten die Websites Lighthouse mobil 30 bis 72.

  • 5 KB statt 97 bis 129 KB JavaScript auf Unterseiten mit Elementor
  • 34 bis 54 statt 83 bis 117 SQL-Abfragen, 4,5 bis 5,8 statt 6,9 bis 7,4 MB Speicher
  • TTFB 37 bis 49 ms in Craft, 42 bis 52 ms mit Elementor, 19 bis 28 ms ohne Plugins
Zwei Panels nebeneinander, links WordPress + Elementor, rechts Craft CMS in einem orangen Rahmen. In jedem drei Balken: JS mit 97 bis 129 KB und 5 KB, SQL mit 83 bis 117 und 34 bis 54, PHP-Dateien mit 1057 bis 1290 und 546 bis 558; die Craft-Balken sind kürzer, der JS-Balken verschwindet fast

Drei Firmenwebsites nach dem Umbau auf WordPress 7.1 + Elementor 4.3 (free) + eigenes Tailwind-Theme, verglichen mit Craft CMS 5.11

Ausgangslage

Drei Firmenwebsites hatten wir zuvor von Grund auf in WordPress neu gebaut: der kostenlose Elementor als Bearbeitungswerkzeug für den Kunden, ein eigenes Theme mit Tailwind CSS, keine überflüssigen Plugins, die Optik 1:1 wie bei den alten Websites. Bei der Abnahme kam eine Frage, die wir immer öfter hören: Wäre es nicht besser, gleich auf Craft CMS umzusteigen, mit dem wir B2B-Websites bauen?

Statt einer Meinung haben wir dieselben drei Websites ein zweites Mal gebaut, von Grund auf in Craft CMS 5, und beide Systeme unter denselben Bedingungen gemessen. Die Vorgabe: Der Vergleich muss fair sein, also beide Fassungen von Grund auf mit Tailwind, ohne Plugins oder nur mit den nötigen, derselbe Inhalt, dieselben Bilder, dieselbe Optik.

Im Hauptvergleich steht WordPress mit Elementor, so wie die Websites an den Kunden übergeben wurden, gegen Craft mit einem einzigen Plugin. Elementor übernimmt in diesen Websites dieselbe Rolle wie das Matrix-Feld im Kern von Craft: Damit setzt der Kunde Unterseiten aus Blöcken zusammen.

Lösung

In Craft entstanden ein Inhaltsmodell mit einem Matrix-Feld und Blöcken, die den Widgets des WordPress-Themes entsprechen, Schema und Inhaltsimport aus Code, Twig-Templates und ein Modul, das Formulare, 301-Weiterleitungen, SEO, Sitemap und Suche übernimmt. Das einzige Plugin ist CKEditor, weil der Kern von Craft keinen Texteditor hat.

Beide Systeme liefen auf demselben PHP-8.3-Image mit Apache, mit derselben MariaDB 11.4 und demselben php.ini mit OPcache, ohne Seitencache (Stand: 2026-11). Gemessen haben wir Antwortzeit, PHP-Zeit, Speicher, geladene Dateien und SQL-Abfragen, Gewicht und Zahl der Anfragen im Browser, Lighthouse auf Smartphone und Desktop, die Größe der Installation und die vom Browser erreichbaren PHP-Dateien, dazu separat die Kosten von Elementor allein.

Ergebnisse

JavaScript pro Unterseite
5 KB in Craft, 97 bis 129 KB in WordPress mit Elementor
SQL-Abfragen pro Seite
34 bis 54 in Craft, 83 bis 117 in WordPress
Antwortzeit des Servers (TTFB)
37 bis 49 ms in Craft, 42 bis 52 ms mit Elementor, 19 bis 28 ms ohne Plugins
Vom Browser erreichbare PHP-Dateien
1 in Craft, 3 366 bis 4 109 in WordPress
Galerie mit 82 Bildern auf dem Smartphone
91 Punkte und LCP 3,5 s in Craft, 75 Punkte und LCP 8,7 s in WordPress
Lighthouse mobil bei typischem WordPress
30 bis 72 Punkte vor dem Umbau, 81 bis 100 danach, in Craft 94 bis 98

So sind wir vorgegangen

  1. Dieselben Bedingungen

    Dasselbe PHP-8.3-Image mit Apache, dieselbe MariaDB 11.4, dasselbe php.ini mit OPcache, 512 MB pro Container, kein Seitencache in beiden Systemen.

  2. Craft von Grund auf

    Inhaltsmodell mit Matrix-Feld statt Elementor-Widgets, Schema und Inhaltsimport aus Code, Twig-Templates, ein Plugin, der Rest im Modul.

  3. Übereinstimmung 1:1

    Dieselben WebP-Dateien und Bildvarianten (Transforms), dieselben URLs. Screenshots in voller Höhe auf Desktop und Smartphone: 82 Paare, 78 ohne Höhenunterschied, 4 mit 1 px Unterschied.

  4. Messung am Server

    PHP-Zeit, Speicher, geladene Dateien und SQL-Befehle aus jeder Anfrage; Antwortzeit aus 50 Anfragen pro URL nach dem Aufwärmen von OPcache.

  5. Messung im Browser

    Gewicht und Anfragen in Chromium mit leerem Cache, Lighthouse auf Smartphone und Desktop, je drei Durchläufe, Median.

  6. Kosten von Elementor

    WordPress mit deaktivierten Plugins und demselben Theme als Untergrenze dessen, was WordPress allein am Server kostet.

  7. Typisches WordPress

    Vergleich mit unseren Messungen derselben Websites vor dem Umbau, als sie 9, 15 und 21 Plugins hatten.

Messbedingungen: was „fair“ bedeutet

Alle Zahlen stammen aus unserem Labor: eine Maschine, sechs Container mit demselben PHP-Image, eine Datenbank, Messung vom selben Host. Ohne Netzwerklatenz sind die Serverzeiten niedriger als im Internet; Lighthouse auf dem Smartphone simuliert eine langsame 4G-Verbindung und ein schwächeres Gerät.

WebsiteUmfangBesonderheiten
Website 19 Unterseiten, Galerie mit 10 Bildern, Lightboxdas WordPress-Theme schaltet das JavaScript von Elementor auf Seiten ohne Interaktion selbst ab
Website 212 Unterseiten, 5 Projekte mit Kategorien, 2 Formulare, Suche11 eigene Elementor-Widgets: Slider, Tabs, Flip-Karten, Projektfilter
Website 311 Unterseiten, 308 Bilder in Galerien, Formular, Karte nach EinwilligungEinblendanimationen von Elementor, Plugin WP Mail SMTP für den Mailversand

Für beide Systeme gleich (Stand: 2026-11):

  • Image wordpress:php8.3-apache mit pdo_mysql (PHP 8.3.36, Apache 2.4.69, mod_php, prefork),
  • dieselbe Instanz von MariaDB 11.4 mit Standardkonfiguration,
  • dasselbe php.ini: memory_limit 256M, OPcache 128 MB, max_accelerated_files 20000, revalidate_freq 2,
  • Produktivmodus (WP_DEBUG und devMode aus), kein Cache-Plugin, kein persistenter Objektcache, kein {% cache %} in den Templates,
  • 512 MB Speicher pro Container.
FROM wordpress:php8.3-apache
RUN docker-php-ext-install -j2 pdo_mysql \
 && groupmod -o -g 1000 www-data && usermod -o -u 1000 www-data
WordPressCraft CMS
SystemWordPress 7.1.4Craft CMS 5.11.5.1
PluginsElementor 4.3.5 (kostenlos), auf Website 3 zusätzlich WP Mail SMTP 4.10.3CKEditor 5.9.0, das einzige
Code der Websiteeigenes Theme: PHP, Elementor-Widgets, Tailwind CSS 4Twig-Templates, PHP-Modul, Tailwind CSS 4

Den Inhalt hat ein Skript übertragen (Export per WP-CLI nach JSON, Import mit einem Konsolenbefehl von Craft). Die Bilder sind dieselben WebP-Dateien aus wp-content/uploads, die Varianten haben dieselben Maße und dieselbe Qualität wie die Bildgrößen des Themes, dazu srcset, sizes, loading und fetchpriority wie im HTML von WordPress. Die URLs sind gleich, einschließlich Schrägstrich am Ende; alte URLs leiten in beiden Systemen mit 301 weiter. Bei 82 Screenshot-Paaren (1440 × 900 und 390 × 844) beträgt der Höhenunterschied der Seite bei 78 Paaren 0 px und bei 4 Paaren 1 px: Craft berechnet für zwei Bilder eine Variante mit 803 statt 804 px. Menü, Slider, Tabs, Filter, Lightbox, Formulare und die Karte nach Einwilligung funktionieren gleich, und ein neuer Besucher bekommt in beiden Fassungen 0 Cookies und 0 Verbindungen zu fremden Domains.

WordPress mit oder ohne Elementor

WordPress ohne Page Builder ist eine andere Leistung: Der Kunde würde im Blockeditor arbeiten oder bekäme Templates ohne freie Gestaltung des Layouts. Damit sichtbar wird, was Elementor allein kostet, haben wir auch WordPress mit deaktivierten Plugins gemessen (Kern und dasselbe Theme, Seiten aus der HTML-Kopie, die Elementor in post_content speichert). Diese Variante sieht anders aus und dient nur der Messung am Server. Eine Fassung „WordPress ohne Elementor, mit Templates wie in Craft“ würde praktisch dasselbe HTML, CSS und JS ausliefern wie Craft, deshalb haben wir sie nicht gebaut.

Messung am Server: Eine Datei auto_prepend_file in beiden Systemen, nur bei einem eigenen Messheader aktiv, schreibt PHP-Zeit, Speicherspitze, Zahl der geladenen PHP-Dateien und den Zähler der SQL-Befehle auf der Verbindung der Anwendung selbst:

// WordPress
$sql = (int) $GLOBALS['wpdb']->get_var("SHOW SESSION STATUS LIKE 'Questions'", 1) - 1;
// Craft
$row = \Craft::$app->getDb()->createCommand("SHOW SESSION STATUS LIKE 'Questions'")->queryOne();
$sql = (int) $row['Value'] - 1;

Antwortzeit (TTFB): curl vom selben Host, 20 Anfragen zum Aufwärmen von OPcache, danach 50 gemessene für jede der fünf URLs einer Website. Gewicht und Anfragen: Chromium, leerer Cache, Scrollen über die ganze Seite, 3 Durchläufe. Lighthouse 12.8: Smartphone und Desktop, 3 Durchläufe pro URL, Median.

Links zwei übereinandergelegte Seiten, eine mit durchgehender, die andere mit gestrichelter Linie. Rechts ein Raster aus 82 Quadraten: 78 schwarze mit der Beschriftung 0 px und 4 orange mit der Beschriftung 1 px, darüber 1440 × 900 und 390 × 844

Server: Median aus fünf URLs pro Website (Labor, Stand: 2026-11)

Website und System TTFB, Median und p90 PHP-Speicher PHP-Dateien pro Anfrage SQL-Befehle
Website 1: WordPress + Elementor 42,0 und 44,4 ms 6,9 MB 1 057 83
Website 1: WordPress ohne Plugins 19,0 und 23,7 ms 4,4 MB 502 31
Website 1: Craft 36,9 und 40,3 ms 4,5 MB 546 34
Website 2: WordPress + Elementor 52,4 und 56,7 ms 7,0 MB 1 205 117
Website 2: WordPress ohne Plugins 28,4 und 36,5 ms 4,8 MB 504 46
Website 2: Craft 48,9 und 50,9 ms 5,8 MB 552 54
Website 3: WordPress + Elementor + WP Mail SMTP 48,6 und 54,2 ms 7,4 MB 1 290 98
Website 3: WordPress ohne Plugins 19,6 und 22,1 ms 4,8 MB 504 32
Website 3: Craft 48,1 und 51,2 ms 5,5 MB 558 38

Browser: Summe aus fünf URLs pro Website, leerer Cache

Website und System Anfragen JavaScript und CSS Bilder Ohne Bilder
Website 1: WordPress 75 10 KB und 66 KB 1 064 KB 109 KB
Website 1: Craft 54 10 KB und 25 KB 1 094 KB 46 KB
Website 2: WordPress 129 421 KB und 89 KB 2 359 KB 962 KB
Website 2: Craft 70 25 KB und 45 KB 2 650 KB 508 KB
Website 3: WordPress 219 531 KB und 107 KB 2 633 KB 1 108 KB
Website 3: Craft 132 25 KB und 45 KB 2 787 KB 504 KB

Lighthouse 12.8: Median aus drei Durchläufen auf drei URLs, TBT 0 ms und CLS 0 überall

Website und System Smartphone: Score Smartphone: FCP und LCP Desktop: Score Desktop: FCP und LCP
Website 1: WordPress 98 1 054 und 2 332 ms 100 243 und 404 ms
Website 1: Craft 98 752 und 2 327 ms 100 202 und 483 ms
Website 2: WordPress 95 1 656 und 2 780 ms 100 405 und 749 ms
Website 2: Craft 96 755 und 2 777 ms 100 323 und 643 ms
Website 3: WordPress 89 1 652 und 3 760 ms 99 364 und 765 ms
Website 3: Craft 94 1 054 und 3 079 ms 100 282 und 583 ms

Woher die Unterschiede kommen

Im Browser macht Elementor den Unterschied

Auf den Unterseiten der Websites 2 und 3 liefert WordPress 97 bis 129 KB JavaScript aus (jQuery 3.7.1, jQuery Migrate, das Frontend von Elementor, die webpack-Runtime, bei Animationen auch deren Module), Craft 5 KB. In der Summe der fünf URLs machen Elementor und jQuery 44, 442 und 581 KB aus. Website 1 schaltet das JavaScript von Elementor schon im Theme ab, dort beschränkt sich der Unterschied auf CSS und 4 bis 5 Anfragen weniger pro Unterseite. Die Schriften sind in beiden Fassungen dieselben, und der DOM-Baum in Craft hat 4 bis 14 % weniger Knoten, ohne die Wrapper elementor-element.

Stylesheets und Skripte von Elementor laden im <head> und blockieren die Anzeige der Seite. Bei langsamer Verbindung verlängert jede dieser Dateien die Zeit bis zum ersten Inhalt (FCP), auf dem Smartphone um 0,3 bis 0,9 s. Die Einblendanimationen von Elementor verstecken Elemente, bis die Skripte laufen, deshalb wartet in der Galerie mit 82 Bildern das größte Element (LCP) fast 7 s. Die Aufschlüsselung des LCP in Lighthouse für WordPress: TTFB 451 ms, Ladeverzögerung 1 238 ms, Ladezeit 82 ms, Renderverzögerung 6 961 ms, acht render-blockierende Ressourcen. Craft: eine blockierende Ressource und 3 229 ms Renderverzögerung bei derselben Einblendanimation, nur ohne Warten auf jQuery.

Am Server verdoppelt Elementor die Zeit von WordPress

WordPress ohne Plugins mit demselben Theme: 502 bis 504 PHP-Dateien, 31 bis 46 SQL-Befehle, 19 bis 28 ms. Mit Elementor: 1 057 bis 1 290 Dateien, 83 bis 117 Befehle, 42 bis 52 ms. Im Abfragelog von MariaDB (general_log, ein Aufruf der Startseite von Website 1) hat WordPress 71 Befehle gesendet, davon fragten 25 nach Optionen, die es in der Datenbank gar nicht gibt (Standardwerte der Elementor-Experimente; ohne persistenten Objektcache fragt WordPress bei jeder Anfrage danach):

SELECT option_value FROM wp_options WHERE option_name = 'elementor_…' LIMIT 1

Craft kostet am Server ungefähr so viel wie WordPress mit Elementor

Das Framework Yii 2, Twig und die Elementschicht ergeben rund 550 PHP-Dateien pro Anfrage und 30 bis 55 SQL-Befehle, also 37 bis 49 ms. Von den 29 Befehlen auf der Startseite von Website 1 betrifft der Großteil die Konfiguration (Bereiche, Eintragstypen, Feldlayouts, Volumes, Bildvarianten), der Rest sind Abfragen nach Elementen. Der geringere Speicherverbrauch (4,5 bis 5,8 MB) kommt vor allem von der kleineren Zahl geladener Dateien. Craft ist also nicht „schneller als WordPress“: WordPress ohne Plugins bereitet die Seite doppelt so schnell vor wie beide verglichenen Systeme.

Bilder wiegen in jedem System anders

Auf den Websites 2 und 3 hat Craft mehr Bildbytes, aber weniger von allem anderen. Deshalb vergleichen wir das Gewicht getrennt mit und ohne Bilder; den Grund beschreibt die zweite Falle weiter unten.

Balkendiagramm der TTFB in Millisekunden für die Websites 1, 2 und 3. In jeder Gruppe drei Balken: WordPress core, also ohne Plugins, gestrichelt mit 19, 28 und 20 ms, WordPress + Elementor schwarz mit 42, 52 und 49 ms, Craft CMS orange mit 37, 49 und 48 ms

Herausforderungen, die wir gelöst haben

Galerie in Craft: 439 SQL-Abfragen für eine Seite

Die Galerieseite mit 82 Bildern, jedes mit srcset aus vier Varianten, hatte in der ersten Fassung 439 SQL-Befehle und eine TTFB von 106 ms, mehr als WordPress mit Elementor. .eagerly() lädt die Assets mit einer Abfrage, aber $asset->getUrl('transform') sucht die fertige Variante in der Tabelle imagetransformindex mit einer eigenen Abfrage für jedes Bild und jede Variante. Eine Zeile im Template lädt den Variantenindex für die ganze Galerie auf einmal:

{%- set images = block.images.eagerly().all() -%}
{%- do craft.app.imageTransforms.eagerLoadTransforms(images, ['medium', 'large', 'thumbnail', 'mlarge']) -%}

WordPress hat in derselben Galerie seine eigene Form des N+1-Problems: zwei Abfragen pro Bild (SELECT * FROM wp_posts WHERE ID = … und eine Abfrage der Metadaten). Ein Vorladen der Galeriebilder senkt sie im Test, ohne das Theme des Kunden zu ändern:

add_action( 'elementor/frontend/widget/before_render', function ( $widget ) {
    if ( 'theme-gallery' === $widget->get_name() ) {   // Name des Galerie-Widgets im Theme
        _prime_post_caches( wp_list_pluck( (array) $widget->get_settings( 'gallery' ), 'id' ), false, true );
    }
} );
Galerie mit 82 Bildern (Website 3)TTFBSQL-Befehle
WordPress + Elementor, wie übergeben66,8 ms260
WordPress, Bilder vorgeladen (Test)61,7 ms98
Craft, erste Fassung des Templates106,0 ms439
Craft, Varianten mit einer Abfrage58,2 ms33

Auf Website 1 dasselbe: die Projektliste von 67 auf 34 Befehle, die Galerie von 62 auf 33. Das Template „funktioniert“ in beiden Systemen auch ohne das.

Dieselbe Qualität, andere Bytes

Varianten aus denselben WebP-Originalen, in denselben Maßen und mit derselben Qualität (80 und 82), sind in Craft 8 bis 11 % größer (Website 1: 4,3 und 4,8 MB für alle Varianten, Website 3: 47,8 und 51,6 MB). WordPress verkleinert mit dem Filter Triangle und leichtem Nachschärfen, Craft (Bibliothek Imagine) mit dem Standardfilter von Imagick. Dazu komprimiert Craft eine Datei, die nicht über das Control Panel hochgeladen wird, standardmäßig neu: Alle 32 Originale von Website 1 hatten nach dem Import andere Bytes als in WordPress, bis wir das abgeschaltet haben:

$asset->sanitizeOnUpload = false;   // Dateien aus WordPress sind bereits bereinigt; sonst schreibt Craft das WebP neu

Imagick passt nicht ins memory_limit

Der Speicher von ImageMagick zählt nicht zum PHP-Limit und wird in einem Prozess zwischen den Bildern nicht freigegeben. Der Import von 308 Bildern und der erste Aufruf der Galerie (Varianten beim Anzeigen erzeugt, Option generateTransformsBeforePageLoad) endeten im Container mit 512 MB mit einem hart beendeten Prozess, ohne Antwort an curl:

exit 137

Bei rund 1 100 Varianten in einem Prozess meldete ImageMagick:

cache resources exhausted ... @ error/cache.c/OpenPixelCache/3931

WordPress erzeugt die Bildgrößen beim Hochladen, ein Bild pro Anfrage. In Craft erzeugen wir die Varianten vorab mit einem eigenen Befehl in einem einmaligen CLI-Container mit höherem Limit:

docker run --rm -m 2g ... cs-cms-php:8.3 craft site/import/transforms   # einmaliger CLI-Container, dasselbe Image

WordPress-Theme ohne Elementor: fataler Fehler

Bei der Messung „WordPress ohne Plugins“ lieferte Website 1 den Status 500:

PHP Fatal error:  Uncaught Error: Class "Elementor\Plugin" not found in /var/www/html/wp-content/themes/<theme>/inc/elementor.php:161

Schuld war der Hook wp_print_footer_scripts, der das JavaScript von Elementor auf Seiten ohne Interaktion abschaltet. Ein Theme, das für einen Page Builder gebaut ist, hängt enger an ihm, als das Backend erkennen lässt; für die Messung haben wir diesen einen Hook mit einer temporären Datei in mu-plugins entfernt.

Erneutes schema/apply in Craft 5 löschte den Inhalt

Craft 5 speichert Feldwerte in der JSON-Spalte elements_sites.content unter der UID des Feldlayout-Elements, nicht des Feldes selbst. Ein Schemaskript, das bei jedem Lauf neue Layout-Elemente anlegte, „verlor“ nach dem zweiten Durchlauf alle Texte: Sie waren in der Datenbank, aber unter den alten UIDs, und resave/entries machte den Verlust dauerhaft. Die Korrektur: die UIDs der vorhandenen Layout-Elemente übernehmen. Wichtig für alle, die das Schema von Craft im Code halten.

Text aus Elementor ist nicht der Text auf der Seite

Elementor speichert rohes HTML, und WordPress schickt es bei der Ausgabe durch wptexturize: Ein Bindestrich zwischen Wörtern wird zum Halbgeviertstrich (–), gerade Anführungszeichen werden zu typografischen. Ein Import aus den Elementor-Daten hätte andere Zeichen ergeben als auf der Live-Website, deshalb haben wir Texte und Titel von Website 2 aus dem gerenderten HTML übernommen.

Die Suche liefert bei gleichem Inhalt andere Ergebnisse

WordPress sucht per LIKE in post_content, wo Elementor eine HTML-Kopie der Seite samt Alternativtexten und Dateinamen der Bilder ablegt. Craft sucht in einem Wortindex der Felder, die als durchsuchbar markiert sind, und in Craft 5 ist ein Feld standardmäßig nicht durchsuchbar: Die Suche fand nur Titel. Nach dem Einschalten des Index liefert WordPress für dasselbe Wort 6 Seiten, Craft 4; in zwei davon stand das Wort nur in Dateinamen von Bildern.

Vier waagerechte Balken der SQL-Befehle für die Galerie mit 82 Bildern: Craft 439, Craft mit eagerLoadTransforms 33 in Orange, WordPress 260, WordPress mit _prime_post_caches 98; neben den Balken die Zeiten 106, 58, 67 und 62 ms

Installation, Sicherheit und Komfort bei der Bearbeitung

Websites 1 bis 3WordPressCraft
Codegröße ohne Bilder173 bis 184 MB: Kern 91 MB, Elementor 77 MB, WP Mail SMTP 10 MB (Website 3), Theme 0,3 bis 0,4 MB192 MB: vendor 191 MB (Craft 42,5 MB, CKEditor 41,2 MB, Bibliotheken), Code der Website 0,2 bis 0,3 MB; nach dem ersten Öffnen des Control Panels 47 MB Ressourcen des Control Panels
PHP-Dateien in der Installation3 366 bis 4 109 (Kern 1 316, Elementor 2 023, WP Mail SMTP 733, Theme 17 bis 33)8 016 bis 8 020 (vendor 8 000, Modul 6 bis 9, Konfiguration 8 bis 9)
Vom Browser erreichbare PHP-Dateien3 366 bis 4 109, die ganze Installation ist öffentlich1 (web/index.php), der Rest ist nicht öffentlich
Pro Anfrage geladene PHP-Dateien1 057 bis 1 290541 bis 560
Datenbank13 Tabellen (Website 3: 17), 1,0 bis 9,3 MB71 bis 72 Tabellen, 5,0 bis 7,0 MB
Updatesaus dem Backend, auch automatisch; Kern und Plugins getrenntComposer und Deployment (auf Produktion sind Änderungen im Control Panel gesperrt), das Control Panel zeigt verfügbare Versionen

Craft hat mehr PHP-Dateien (Bibliotheken von Yii 2, Twig, Guzzle, Symfony), aber im öffentlichen Verzeichnis liegt nur eine, daher lässt sich keine andere per URL aufrufen. Bei WordPress liegt jede PHP-Datei eines Plugins im öffentlichen Verzeichnis; das ist ein typischer Angriffsweg über lückenhafte Plugins.

WordPress + ElementorCraft
Seite zusammenstellenBlöcke in der Vorschau ziehen, Einstellungen in der SeitenleisteFormular mit Matrix-Blöcken, Live-Vorschau daneben
Freiheit im Layoutgroß: Abstände, Farben, Typografie jedes WidgetsFelder des Blocks und die Tabelle „Layout“; die Optik halten die Templates
Risiko, die Optik zu beschädigenhoch, jeder Redakteur kann Stile überschreibengering
VersionenRevisionen von WordPress und Verlauf von ElementorEntwürfe, Revisionen und Zeitplanung im Kern
Mehrere SprachenPlugin, z. B. WPML oder Polylangim Kern
Inhalt als DatenLayout und Inhalt zusammen als JSON in wp_postmeta und HTML-Kopie in post_contentFelder und Blöcke als eigene Elemente, Import und Export ohne HTML-Parsing

Die Tabelle „Layout“ in Craft (Werte für Desktop, Tablet und Smartphone) ist weniger bequem als die Schieberegler von Elementor. In einem normalen Craft-Projekt steckt das Layout in den Templates, und der Redakteur wählt nur Blockvarianten; hier haben wir diese Einstellungen gelassen, um die Websites 1:1 nachzubilden und dem Redakteur eine ähnliche Freiheit wie in Elementor zu geben.

Zwei Raster aus PHP-Dateien. Links WordPress: Der orange Rahmen des öffentlichen Verzeichnisses umfasst das ganze Raster, Beschriftung 3366 bis 4109. Rechts Craft: ein größeres Raster vendor mit 8000 Dateien außerhalb des Rahmens, der orange Rahmen umfasst nur eine Datei web/index.php, Beschriftung 1

Idealbedingungen und eine typische WordPress-Website

Dieser Vergleich zeigt beide Systeme unter Idealbedingungen: beide Fassungen von Grund auf gebaut, mit einem Plugin auf der Seite von Craft und einem Page Builder auf der Seite von WordPress, ohne Fertig-Theme und ohne Plugins „auf Vorrat“. Eine typische WordPress-Website sieht anders aus. Dazu haben wir Daten von denselben drei Websites, die wir vor dem Umbau auf sauberes WordPress gemessen haben (Tabelle unten, dieselbe Nummerierung; Website 3 vor dem Umbau ohne Lighthouse-Messung).

Nach dem Umbau hat jede Website ein Page-Builder-Plugin, Website 3 zusätzlich ein Plugin für den Mailversand. Zwischen sauberem WordPress und Craft liegen wenige Lighthouse-Punkte und wenige Millisekunden am Server. Das typische WordPress, aus dem diese Websites hervorgingen, liegt Dutzende Punkte und beim LCP bis zu mehrere Dutzend Sekunden hinter beiden.

Der Unterschied liegt nicht im Kern des Systems, sondern darin, was das System zusätzlich zulässt. Craft hat keinen Markt für fertige Themes oder Page Builder: Twig-Templates werden für jedes Projekt neu geschrieben, und auf Produktion, wo Konfigurationsänderungen im Control Panel gesperrt sind, kommen Plugins nur über Composer und Deployment, nicht mit einem Klick eines Redakteurs. Eine Craft-Website entsteht deshalb immer in dem Standard, den wir in diesem Test ideal nennen. WordPress erlaubt eine ebenso saubere Website, wie unsere Umbauten zeigen, erzwingt sie aber nicht: Das Ergebnis hängt von der Disziplin des Dienstleisters ab und davon, was später nachinstalliert wird.

Lighthouse-Skala mobil von 0 bis 100 für die Websites 1 und 2. Website 1: typisches WordPress mit Plugins als gestrichelter Bereich von 67 bis 72, WordPress + Elementor als schwarzer Bereich von 98 bis 100, Craft CMS als oranger Punkt bei 98. Website 2: 30 bis 63, 81 bis 96 und 96

Dieselben drei Websites: vor dem Umbau, nach dem Umbau und in Craft (Lighthouse auf dem Smartphone)

Messung Website 1 Website 2 Website 3
Plugins vor dem Umbau 9 (5 aktiv) 15 21
JavaScript pro Unterseite vorher 65 bis 89 KB 807 bis 810 KB 402 bis 422 KB
Lighthouse vorher, 3 Unterseiten 67, 72, 71 63, 50, 30 keine Messung
LCP der schwersten Unterseite vorher 11,9 s 64,8 s keine Messung
Nach dem Umbau auf sauberes WordPress, also „WordPress“ in diesem Vergleich 100, 99, 98 Punkte, LCP 2,4 s 95, 81, 96 Punkte, LCP 2,8 s 98, 91, 98 Punkte, LCP 3,4 s
Craft in diesem Vergleich, Median aus 3 Unterseiten 98 Punkte 96 Punkte 94 Punkte

Was wir daraus mitnehmen

  • Unter Idealbedingungen liegen Craft und WordPress nah beieinander. Craft überträgt ohne Bilder halb so viele Daten und zeigt Inhalte auf dem Smartphone schneller, weil es keinen Page Builder hat. Am Server liegen beide Systeme wenige Millisekunden auseinander, und WordPress ohne Plugins ist doppelt so schnell wie beide.
  • Craft ist nicht schneller als WordPress an sich. Es erzwingt einen Standard: Templates von Grund auf, keine fertigen Themes und Page Builder, eine öffentliche PHP-Datei. Bei WordPress hängt dieser Standard von der Disziplin des Dienstleisters ab, und eine typische Website mit 9 bis 21 Plugins ist weit davon entfernt (Lighthouse auf dem Smartphone 30 bis 72 statt 81 bis 100).
  • Der Page Builder kostet am meisten. Elementor verdoppelt die Serverzeit von WordPress, bringt jQuery und blockierende Dateien mit, und ein Theme, das für ihn gebaut ist, funktioniert ohne ihn nicht.
  • Das N+1-Problem betrifft beide Systeme. Eine Galerie ohne Vorladen der Bilder und ihrer Varianten erzeugt Hunderte Abfragen in Craft wie in WordPress; über das Ergebnis entscheidet eine Zeile Code, nicht das System.
  • Zwei Fassungen nebeneinander unter identischer Last klären die Frage schneller als eine Diskussion. Genauso haben wir PHP 7.4 und 8.2 im Projekt zur Sitzungssperre nach PHP 8.2 verglichen.

Deshalb wählen wir für eine neue Firmenwebsite, besonders in mehreren Sprachen, Craft CMS, und eine gut gebaute, schlanke Website auf WordPress ziehen wir nicht allein wegen der Geschwindigkeit um. Einen Wechsel des Systems planen wir dann, wenn sich die bestehende Website nicht in diesem Standard halten lässt.

Sie überlegen, ob Sie bei WordPress bleiben oder auf Craft CMS wechseln sollen? Wir messen Ihre bestehende Website und zeigen, was Plugins und Page Builder kosten, bevor die Entscheidung fällt. Der erste Schritt ist ein Erstgespräch.

Quellen

Die Versionen und Zahlen stammen aus unserem Labor, die Beschreibung der Funktionen aus der Dokumentation der Hersteller (Stand: 2026-11):

Zwei Wege eines Plugins auf den Produktivserver. Oben WordPress: vom Backend wp-admin ein Pfeil direkt auf den Server mit 21 Plugin-Quadraten. Unten Craft CMS: composer require, ein oranges Tor deploy, ein Server mit einem Plugin-Quadrat

Der erste Schritt: CMS-Check für WordPress und Craft CMS

CMS-Check: WordPress und Craft CMS

Für Unternehmen, deren Website auf WordPress oder Craft CMS geschäftlich wichtig ist und deren Agentur oder Betreuer nicht mehr da ist: vor der Übernahme, vor einem großen Update oder nach einem Sicherheitsvorfall.

  • Versionen von CMS, PHP, Datenbank und Server und ihr Support-Stand
  • Plugins und Themes: was gepflegt wird, was verlassen ist und was ersetzt werden sollte
  • Updates: was fehlt und wie riskant das Nachholen ist
  • Sicherungen: was gesichert wird und ob eine Wiederherstellung getestet ist
  • Sicherheit: Zugänge zum Backend, Zwei-Faktor-Anmeldung, Benutzerrechte und bekannte Lücken
  • Lizenzen für das CMS und kommerzielle Plugins: welche es gibt und auf wen sie laufen

In dieser Phase ändern wir nichts an der Website. Eigene Themes und Plugins prüfen wir auf Pflegezustand und bekannte Lücken, nicht Zeile für Zeile. Der Check gilt für eine Website, weitere Websites bepreisen wir einzeln.

Was das Ergebnis enthält

Ein schriftlicher Befund mit den Risiken nach Priorität und ein Plan für Übernahme, Updates und Betreuung. Der Befund gehört Ihnen.

In der Regel 2 Werktage

CMS-Check anfragen

Verwandte Ausgangslagen

  • Google warnt vor Ihrer Website, Besucher landen auf fremden Seiten, oder der Hoster hat das Konto gesperrt? Wir schirmen die Website ab, schließen die Lücke und bereinigen sie innerhalb von 24 Stunden ab Zugang, auch am Wochenende. Danach erhalten Sie einen schriftlichen Bericht.

  • Ihr System läuft, aber niemand kennt es genau. Wir erfassen Anwendung, Datenbank, Server und E-Mail, bewerten Risiken, empfehlen schriftlich den weiteren Weg und übernehmen auf Wunsch den Betrieb.

  • Für PHP 8.2 enden die Sicherheits-Updates am 31.12.2026, für PHP 8.1 und älter sind sie bereits beendet (Stand: 2026-10). Wir bringen gewachsene PHP-Anwendungen, auch mit Smarty-Templates und jQuery-Frontend, auf PHP 8.4 oder 8.5 und testen jede Stufe.

Weitere Projekte

  • Liste von neun nächtlichen Backups mit der Uhrzeit 01:30: zwei mit langem schwarzen Balken und 285 MB, sieben mit kurzer oranger Marke und 751 B

    Das MySQL-Backup hatte 751 Byte: eine beschädigte MyISAM-Tabelle und der Wiederherstellungstest

    Das Cron-Skript schrieb sieben Nächte lang statt rund 280 MB eine Datei mit 751 B: Eine MyISAM-Tabelle war als beschädigt markiert, mysqldump brach bei LOCK TABLES ab, das Skript endete mit Code 0, Cron verwarf die Meldung. Wir haben den Ausfall nachgestellt, die Tabelle repariert, auf InnoDB umgestellt und ein Backup eingeführt, das jede Nacht probeweise zurückspielt und Alarm gibt.

  • Drei Bahnen aus einem Punktfeld enden an einer orangen Mauer mit der Beschriftung WAF; eine Bahn von einem Laptop führt durch die Lücke zu einer Ladenfront

    Ein Shop, überflutet von Bots, die wie Kunden aussahen

    Ein WooCommerce-Shop mit 52 Produkten lud langsam oder gar nicht. Die Ursache war ein bezahltes Netz von Bots: Zehntausende Anfragen pro Stunde, jede von einer anderen Privatadresse, und jeder Bot für sich vorbildlich. Unsere Ingenieure haben den Verkehr am Rand des Netzes gestoppt. Als die Bots einen Monat später die Taktik wechselten, nahm die zweite Regel die Last in zwei Minuten weg.

In 20 Minuten klären wir, welcher erste Schritt zu Ihrem System passt

Sie schildern Ziel und Stand, wir sagen offen, ob und wie wir helfen können. Antwort innerhalb eines Werktags, unverbindlich.

Telefon (Deutsch, Polnisch, Englisch) +48 501 250 220
E-Mail E-Mail

Erreichbar: Montag bis Freitag, 9:00 bis 17:00 Uhr (MEZ); Support und Notfälle rund um die Uhr (24/7)