Most blogs show their most recent posts at the top. It’s a sensible thing to do; readers want to see what’s new. Muddled Ramblings and Half-Baked Ideas mostly works that way, but there are a couple of exceptions. There are two bits of serial fiction that should be read beginning-to-hypothetical-end.
A while back I set up custom page templates for those two stories. I made a WordPress category for each one, and essentially copied the default template and added query_posts($query_string.'&order=ASC')
; and hey-presto the two fiction-based archive pages looked just right.
Until infinite scrolling came along. Infinite scrolling is a neat little feature that means that more episodes load up automagically as you scroll down the page. Unfortunately, the infinite scrolling code knew noting about the custom page template with its tweaked query.
The infinite scrolling is provided by a big, “official” package of WordPress enhancements called Jetpack. The module did have a setting to reverse the order for the entire site, but that was definitely a non-starter. I dug through the code and the Jetpack documentation and found just the place to apply my custom code, a filter called infinite_scroll_query_args
. The example even showed changing the sort order.
I dug some more to figure out how to tell which requests needed the order changed, and implemented my code.
It didn’t work. I could demonstrate that my code was being called and that I was changing the query argument properly, but it had no effect on the return data. Grrr.
There is another hook, in WordPress itself, that is called before any query to get posts is executed. It’s a blunt instrument for a case like this, where I only need to change behavior in very specific circumstances (ajax call from the infinite scrolling javascript for specific category archive pages), but I decided to give it a try.
Success! It is now possible to read all episodes of Feeding the Eels and Allison in Animeland from top to bottom, the way God intended.
I could put some sort of of settings UI on this and share it with the world, but I’m not going to. But if you came here with the same problem I had, here’s some code, free for your use:
/** * reverses the order of posts for listed categories, specifically for infinite Jetpack scrolling */ function muddled_reverse_category_post_order_pre_get_posts( $query ) { if (isset($_REQUEST['query_args']['category_name'])) { $ascCategories = [ 'feeding-the-eels', 'allison-in-animeland', ]; if (in_array($_REQUEST['query_args']['category_name'], $ascCategories)) { $query->set( 'order', 'ASC' ); } } } add_filter( 'pre_get_posts', 'muddled_reverse_category_post_order_pre_get_posts' ); |
In the meantime, feel free to try the silly serial fiction! It will NOT change your life!
Feeding the Eels
Allison in Animeland
A couple of notes on the code style, for anyone who might care. In WordPress all function names are global, so they need to be namespaced (“muddled_”) as well as descriptive. If someone else made a plugin named “muddled” and I installed it, it could lead to trouble. WordPress style also suggests that a filter function name include the name of the filter it implements, thus the “_pre_get_posts”. It leads to long function names, but that’s better than mysterious ones.
I followed the WordPress style guide for function names, hence the underscores. I realize now I used camel-case variable names, though. So, not overwhelmingly consistent on my part.
And, I included a comment. I could have contrived my code to use a variable named isJetpackInfiniteScrollAjaxRequest, but the variable would have served no function other than as a comment, so I bit the bullet and just made a note to my future self.