At the end of the day, Roots does some innovative stuff with regards to the back end and the development cycle, but Roots-themed WordPress sites appear to struggle with the same issues that most WordPress sites do:
Slow content loading - though this is inherent with WordPress in
general and though Roots has done a great deal towards making things
faster, all of the Roots optimization benefits would be completley
shadowed by the benefits received if content was loaded through AJAX.
Full browser refresh for every request - because of this (even with
cached elements), Roots themes appear to suffer from the harsh blank
page and then often the flash of un-styled content or the sloppy
reflow of content as the page finishes loading. Again, all of this
could be resolved by loading content via AJAX.
Large Images/Multiple Images/Complex Layouts lack preloading and styling and still cause problems with sites that are graphic intensive. Every click is a nightmare even
though Roots has gone to considerable lengths to shorten the
nightmare, it still exists.
No persistent elements - Again, because
of the page-loading mechanism, Most WordPress themes cannot have persistent
elements. Headers that are supposed be the same for every page view suffer
when new content is loaded. Roots helps with this by modularizing the template parts
but (not to beat a dead horse), AJAX would make it a lot better.
Poor state-level management - when clicking a button to load new
content, often I see two buttons with the same āselectedā state for a
good three or four seconds before the screen goes blank and the new page begins to load. Yep, you guessed it, AJAX could solve this too.
If this post sounds like I am complaining about Roots, please understand that Roots is by far my favorite WordPress starter theme and I havenāt even begun to use half of the workflow enhancements. If anything, this post begs the question: āOut of respect for your custom way of handling WordPress theme development and acknowledging your dedication to best practices, what is the reasoning behind the lack of intrinsic support for AJAX content retrieval?ā
I also wanted to be clear that none of these issues that I have mentioned really have anything to do with Roots specifically. That is to say that, if anything, Roots improves each of things in a number of ways. I just wonder if a robust set of Ajax-content loading tools built into the Roots theme wouldnāt solve or at least even more greatly mitigate these and other issues?
Thanks for the amazing theme and the new way of working with WordPress content.
Jase
p.s. Please do not mistake my diction for disapproval. I work with attorneys and often my writing sounds harsh and judgmental when that is the farthest thing from my intentions.
Iām new to Roots, just entered here because I wanted to thank the developers for the good work theyāve done. Roots is, I think, the cleanest approach to create a WordPress theme, starting at the WP hooks and template level.
But while I wanted to write this thank you post, I came across yours and couldnāt resist to respond.
First of all, you make it sound like āAjaxā is some sort of a magical technology or standard that can be put into place at will. This is plainly wrong. The most generic definition of āAjaxā is a system that makes use of asynchronous server calls to retrieve, post or manipulate data on a web server without having to reload the current page.
Your post is on the wrong forum. You should have posted it on the WordPress developers forum instead. Roots is a WordPress theme and therefore bound to the way WordPress works. Of course you can shortcut the WordPress architecture and retrieve data directly, but this is obviously beyond the scope of a theme.
WordPress is not perfect. I have written sites using it, and many others that donāt (My latest favorite technology being Angular JS) but WordPress is a complete CMS and that is sometimes the best tool for the job at hand.
Roots is a theme, a WordPress theme. And the best a WordPress theme can do is try to best use the API that WordPress provides. And that is what I think Roots is doing. Using the latest standards ( e.g. HTML5, Bootstrap) wherever possible. If Roots where to use Ajax to load content then first WordPress would have to expose an Ajax Theme API.
We could obviously be an Ajax oriented theme if we wanted to be but thatās not our goal. The other problem which you donāt mention is the SEO/crawler implication of switching to Ajax. Googleās web crawler might āunderstandā JavaScript but it doesnāt really work in reality.
Using JS to render a site client-side can definitely speed things up, but if youāre seeing response times of 3-4 seconds something is wrong to begin with and Ajax doesnāt magically solve that.
My thought is if you see all Wordpress sites, even using Roots loading as slowly as you describe, you either have a VERY slow internet connection, or youāre looking at WP sites on very slow servers.
Of course, Wordpress isnāt as fast as a static website, or even the majority of PHP frameworks with less bloat, but if you have a decent internet connection, you should not be seeing pages take forever to load, and flashes of styling. Really, you shouldnāt be seeing any flashes of styiing except for perhaps web fonts that take an extra half a second to load. All CSS is generally loaded before the content, so unless there is a ton of Javascript being used, Iām just not exactly sure where the issue is.
Loading everything via Ajax is definitely not the answer though.
If Roots tried to make that decision for the developer then I probably wouldnāt use it. The current WP sanctioned way of handling ajax in themes is less than elegant but there are tons of ways you can show Roots some ajax āloveā with minimal effort. Taking a cue from rails weāve used Turbolinks along with roots on several sites. In terms of time/benefit itās seemed like the easiest way to implement a sudo persistent/maintained state front end without all of the headaches (some still exist). Thereās also history.js, pjax, and many more that offer the same benefits. If and when projects like this make it into core weāll have a lot more options with what we do on the front end.
@k33n How did you implement Turbolinks in Roots since its a RoR app? Iām also intrigued by Pjax, since it gives one more control over what elements are loaded by Ajax functionality. I want to use AJAX for most everything on my site, since I want to have a continues running podcast playlist (like on SoundCloud).
Turbolinks is mostly just JavaScript that could be used on any site, but there is some RoR specific code as well. The above plugin tries to replicate it for WP.
Iāve recently implemented a PJAX (AJAX and pushstate) and roots setup. I was actually put off by the existing Wordpress methodologies for implementing PJAX and the other roots-pjax is a very old version of roots. Additionally I was not used to the template hierarchy imposed by roots.
My suggestion is rolling your own event handlers in using pjax and jquery pjax (if so inclined) and just check for the request type in the base.php template. Block off all parts of the site you donāt want updated in a wrap to check the headers to see if the originating request is from PJAX in base.php (you are going to want to probably hide all of the head and the footer stuff if a pjax request). I can write up a tutorial if anyone is interested. Took me several hours and many dead ends but I have my content updating properly.
Sounds interesting jawshchevyvan, Iāve been thinking of playing with a single-app type theme, so Iād be interested in knowing what issues you ran into using the theme wrapper in Roots.
Are you using a Javascript framework like AngularJS or Backbone?
Not doing any heavy lifting in javascript so no need for Angular or Backbone in my use case.
Seriously it was as simple as dropping in the jquery.pjax and checking the headers as they came into my base.php file and blocking what bits to not render on an Ajax request by checking against the request headers.
I still need to work out a way of changing the title element in the head but that ought to be quick.
If this comment isnāt a good enough starting point let me know and Iāll get around to a full tutorial in the next week or so (and maybe a fork for people to look at).
Hi Jawschevyvan, sure I would be interested in a tutorial or some guidelines about the PJAX implementation youāve done, as it seems to be more flexible and configurable than the one Iāve been trying: for a current project, I was interested in trying to implement history.js with Roots, and Iāve been following this approach: http://wptheming.com/2011/12/ajax-themes/
It really works well for basic pages, posts, etc. but doesnāt work well when loading pages with custom plugin implementations like an Event Calendar or something, than maybe rely on loading his own scripts etc in wp_head for example, that is not reloaded when changing between sections with this approach. Also is not possible to update body classes (for that, I print body classes inside the container I load via AJAX, so I can still fire my scripts with DOM-Routing āputing āUTIL.loadEventsā on document.āajaxCompleteā along with document.readyā¦
But, sure would be better ways of doing it⦠Iām interested in knowing your PJAX approach and sure if anyone interested I can give more details on my implementation with history.js
Keep the good work folks
Hi again jawshchevyvan, finally would you share the approach you followed with PJAX? Would be very useful and I will be very grateful to you, as Iām reading a lot of stuff (included official github docs) about PJAX but canāt get to understand the way to use the headers, and canāt get this to work. I think Iām close! If I get something I would share for sure!
Thank you very much in advance
If someone interested, I share how I have implemented PJAX in roots so far. As jawshchevyvan said, itās really simple. I still need to work some details for whole implementation and work in multilanguage site etc, but, roughly speaking, this will be the process (please jawshchevyvan share your implementation, sure is better than mine)
In lib/extras.php:
function is_pjax_request() {
return (isset($_SERVER['HTTP_X_PJAX']) && $_SERVER['HTTP_X_PJAX'] == 'true');
}
So you can know when a page is being reloaded/visited from first time, or loaded via pjax.
In base.php:
Sorry! I hadnāt received any notifications on this thread!!! exhtml - thank you for your snippet! I hope to do a screencast / full writeup in the next week or so. I will be very pedantic (so as to not confuse people like me, who never used roots before this project) - and go through all the configuration points.
I was having issues with some of the pushState stuff when using back/forward buttons, and updating the title in the header (I now am sending it in the content div as a title tag upon a pjax request and it seems that pjax automagically parses it into the header).