In late 2013 I started doing research on content management systems and PHP frameworks. Up to that point I was most familar with Wordpress, and I had a little experience with Drupal. I had also built websites with ModX and Expression Engine.
I became very frustrated with the lack of flexibility of Wordpress when you need to display custom data. I've used many Wordpress templates over the years and some of them use shortcodes to make custom things happen, but it's such a terrible system. Shortcodes are great, but can very easily get messed up with a simple typo in the page editor. Then some of my Wordpress installations kept getting hacked, and I had to install security plugins. I noticed sometimes Wordpress would run very slow because of the number of plugins I installed.
I looked at content management systems and frameworks that were more open and flexible than Wordpress, including Drupal, Symphony, ModX, Expression Engine and others. I was most familiar with Expression Engine out of that group, and had built some freelance websites with that framework. But the problem with EE is that it can be costly, especially all the premium plugins. I really liked how flexible that Symphony was, but I didn't like that it used an XML templating system.
One day I discovered ProcessWire, and it was like I switched on a lightbulb in a dark room and found exactly what I was looking for. It was a breath of fresh air. It wasn't a blogging software by nature like Wordpress, it didn't require a templating system like Symphony and Drupal, and it didn't have a lot of premium plugins like Expression Engine. ProcessWire is free and open source. I could start literally from scratch and build a website however I wanted to, with each page having as many custom fields as I needed.
The beauty of ProcessWire is that it's a content management system AND a framework. You don't have to use the content management portion of it. You could build a web application with it like you would with Laravel or CodeIgniter. You're not limited in what you can do with ProcessWire.
What I enjoy most about ProcessWire
The API of ProcessWire is super simple and straightforward. The database calls for example use "Selectors", which allow you to merge different filters into one line of code. Here's an example API call:
$companies = $pages->find("template=company, locations>5, locations.title%=Finland");
The administration of ProcessWire lists all your pages in a heirarchy. You see all the parent pages, then you can click to see each parent's child pages, and the children's child pages and so on.
I have the freedom to create HTML pages however I want. ProcessWire "pages" can be literal HTML documents, or they can be API web services, or RSS feeds. There is no limitation on what I can do with a page.
One of the field types is called "Repeaters", which allow you to have multiple groups of fields on one page. So let's say you want to add a scrolling slider on your homepage. You can create a Repeater that has an image, a title and a web link. Then you can add as many slider graphics that you want using that Repeater field.
There is a page caching system! You can cache entire templates, or even just cache markup inside your template. That's super helpful when you want to speed up your page download time.
You can create image thumbnails on page render. It's one of my favorite features. Here's an example call to create a thumbnail:
$thumb = $pages->get('/blog')->images->first()->size(640,360)->url;
ProcessWire works on Windows servers, too! You just need a web.config file instead of htaccess.
There's always a roadmap for future iterations of the software with new exciting features like comments, notifications and logs. I can always count on that there is a team of developers working hard to make ProcessWire even better.
So take a moment to check out ProcessWire for yourself. Give it a spin.