A client needed a corporate portal with a multilingual structure in 12 languages, nested service categories, and access rights for three editor types. WordPress would have required installing ACF, WPML, and Custom Post Types plugins – 2–3 paid solutions. With ProcessWire — a free open-source CMS — we implemented everything using built-in tools: LanguageSupport, FieldtypePage, and template inheritance. In two weeks, the admin panel was ready, editors started populating content. Not a single paid extension — savings up to 40% compared to commercial CMS. We evaluate each project with a fixed estimate — no hidden payments. ProcessWire is an effective alternative to WordPress for projects with custom structure.
How ProcessWire handles non-standard data structures?
ProcessWire is ideal where content structure is unique. A service catalog with 30+ attributes, a multilingual site in 15 languages, a portal with non-linear page hierarchy — here it outshines WP and Drupal. The official ProcessWire documentation notes: "The API is built on the principle of simplicity: every call returns what you expect." In the admin panel, you create fields, group them into templates, and assign them to pages. No rigid content types, only your task.
Practical example: a client managed a network of clinics in 8 countries. Each clinic had its own set of services, prices, and doctors. On WordPress, we'd write custom post types and ACF — dozens of plugins. With ProcessWire, we got by with 4 templates and repeater fields. Content managers mastered the admin panel in an hour.
Why ProcessWire is 7 times faster than WordPress?
In tests with a selection of 1000 pages, ProcessWire returns a response in 20 ms, WordPress — 150 ms. The 7.5x difference is achieved due to the absence of heavy abstractions. ProcessWire does not load the entire engine for each request — only the needed modules.
Project architecture: templates and fields
Each template is a PHP file in /site/templates/. Markup, logic, and data are separated through controllers or _init.php/_main.php. Typical structure:
-
/site/templates/_init.php— global variables, helpers -
/site/templates/_main.php— layout wrapper -
/site/templates/home.php— homepage -
/site/templates/services.php— service list -
/site/templates/service-item.php— details -
/site/templates/partials/nav.php,hero.php -
/site/modules/— custom modules -
/site/config.php
Data access via the $pages API is concise:
$services = $pages->find("template=service-item, status=published, sort=sort, limit=12"); $results = $pages->find("template=service-item, title|body*=$q, limit=20"); $recent = $pages->find("template=news, date>=" . strtotime("-30 days") . ", sort=-date"); foreach ($page->related_cases as $case) { echo "<a href='{$case->url}'>{$case->title}</a>"; } foreach ($page->features as $feature) { echo "<div class='feature'><h3>{$feature->headline}</h3><p>{$feature->text}</p></div>"; } Multilingual out of the box
The modules LanguageSupport, LanguageSupportFields, LanguageSupportPageNames are enabled in the admin panel (documentation). Each text field gets language tabs. Switching in a template is one line:
$user->language = $languages->get("en"); echo $page->title; // English title URLs are translated automatically: /ru/uslugi/ and /en/services/ — the same page.
What we solve?
| Problem | ProcessWire Solution | Typical Alternative |
|---|---|---|
| Complex page hierarchy | Nested pages with field inheritance | Drupal tree structures |
| Multiple languages | LanguageSupport + fields | WPML (paid) |
| Custom fields | Fieldtype: text, image, repeater, page | ACF (paid) |
| Roles and permissions | Granular permissions at template level | Extra plugins |
Performance and caching
Caching via $cache API:
$nav = $cache->get("main-nav"); if (!$nav) { $nav = buildNav($pages); $cache->save("main-nav", $nav, 3600); } ProCache (paid module) generates static HTML and serves it directly via .htaccess — speed comparable to static sites. Invalidation occurs on events: when a page is modified, corresponding HTML files are regenerated. This keeps content up-to-date without performance loss.
Typical development timelines
| Site Type | Templates | Timeline |
|---|---|---|
| Corporate | 6–10 | 3–5 weeks |
| Catalog with filtering | 8–14 | 5–8 weeks |
| Multilingual portal | 10–20 | 7–12 weeks |
| API backend (headless) | 4–8 | 2–4 weeks |
Headless mode
ProcessWire as a headless CMS: the template returns JSON, the frontend (React/Next.js) fetches data via an endpoint. ProcessWire only handles content storage and delivery.
header("Content-Type: application/json"); $data = []; foreach ($pages->find("template=product, limit=50") as $p) { $data[] = [ "id" => $p->id, "title" => $p->title, "slug" => $p->name, "price" => $p->price, "image" => $p->image->httpUrl ?? null, ]; } echo json_encode($data); Development stages
- Analysis — study business processes, collect requirements for fields and templates.
- Design — create template architecture, configure admin panel.
- Implementation — write custom modules, develop templates.
- Testing — check access rights, loading speed, Core Web Vitals.
- Deployment — set up caching, deliver documentation.
Common mistakes and how to avoid them
- Ignoring custom fields for data that doesn't fit the template — always use Fieldtype and Repeater instead of storing data in text fields as JSON.
- Lack of caching for repetitive requests — wrap queries in
$cache->get()with a TTL. - Incorrect permissions — test roles before launch: an editor should not see configuration templates.
What is included in the work
- Design of field and template architecture
- Admin panel setup tailored to business processes
- Writing custom PHP modules
- Integration with external services (1C, CRM, payment gateways)
- Testing and optimization of Core Web Vitals
- Editor training
- Access handover and documentation
- Fixed cost after preliminary analysis
Our experience and guarantees
We have been working with ProcessWire since version 2.x — over 5 years. During this time, we have completed 20+ projects: from simple corporate sites to headless portals with a load of up to a million requests per day. All work comes with a 12-month warranty.
Get a consultation on your project — we will send a commercial offer with a fixed cost within a day. Contact us to discuss details. Order a free preliminary architecture analysis — we will assess the complexity and propose the optimal solution.







