I am using the Transients API to cache category loops for a custom taxonomy. All works fine, but if I add a new post or update an existing one, I woud like to compare the taxonomy values and then clear the transients based on the difference in IDs and then clear the others. Transients have the following format, _transient_mouldings_cat_loop_141
where 141
is the ID.
Does anyone have any suggestions on grabbing the tax values before the post is saved (existing terms) (which I thought would be category_save_pre()
, but that only references post categories, and then on-save, use save_post()
to grab the new values, find the difference and then delete the needed transients?
Thanks!
Update
I was able to delete category transients with save_post()
:
function mouldings_delete_transient_teaser($post_id) {
switch (get_post_type()) {
case 'moulding_profiles':
// delete teaser transient
delete_transient('mouldings_moulding_profiles_teaser_'.$post_id);
// delete profile category transient
$post_terms = get_the_terms($post_id, 'profile_categories');
foreach ($post_terms as $post_term) {
delete_transient('mouldings_cat_loop_'.$post_term->term_id);
}
break;
}
}
add_action('save_post','mouldings_delete_transient_teaser');
but I still need to be able to plug into the initial load. I was thinking load_(page)
might do the trick, an I could possibly create a function in there that grabs the posts before an item is saved, but then calling that function in save_post()
would probably just give me the new categories (which I already have). Any suggestions are welcome
Thoughts
I'm wondering if this is more along the lines of storing the category IDs in a session variable - then on save_post()
compare those with get_terms()
(which will have the new ones) and then the unique IDs would be run through the delete_transient()
function --- as I have still yet to come across anything...
Thoughts continued:
It sounds like sessions are not used in WordPress and while you can enable them via wp-config.php
, I'm wondering if there is a simpler way that I'm missing.
Update #2
After more than a few back 'n forths with Tom, I believe this is the correct way to go:
function mouldings_delete_transients ($object_id, $terms, $tt_ids, $taxonomy, $append, $old_tt_ids) {
if (get_post_type() == 'moulding_profiles' || get_post_type() == 'moulding_combination') {
$changed_cats = array_diff($tt_ids, $old_tt_ids);
foreach ($changed_cats as $changed_cat) {
delete_transient('mouldings_cat_loop_'.$changed_cat);
}
}
}
add_action('set_object_terms', 'mouldings_delete_transients', 10, 6);
The only problem I'm having with this is $old_tt_ids
are not being called when a post is saved. So, what I'm trying to do is compare the current categories, $tt_ids
with the old categories, $old_tt_ids
and detect the changes between the two. So, if a new category has been chosen, that would be part of the diff. And, if a category was removed (unchecked), that would also be chosen. It seems to grab the new ones, but not the old ones. Anyone have any ideas? Thanks!
WP_Query
that generates each taxonomy (example). The problem isn't the caching itself, it's more clearing those transients that are attached to each category loop. Each category transient is appended with the cat id, so what I'm trying to do on post-save, is compare the categories it now has to the ones it did have and if there are any differences, delete those transients (whether categories were removed or added). I have 'em set to expire after an hour, but I'd like it to be more seamless. Thanks!