Hey! Thanks for searching.
I’m able to stick/unstick posts on a vanilla WordPress installation. Is this maybe a conflict from another plugin?
Thread Starter
net
(@krstarica)
After further investigation, it seems the issue is related to menu_order field of sticky posts and not about making posts (un)sticky.
We do have plugin to change menu_order field of sticky posts. That field is changed using $wpdb->update calls.
This works fine until Redis cache is full.
But even when it is not full, noticed that values shown in “Order” column (i.e. menu_order) do not correspond to values in database when viewing /wp-admin/edit.php?post_type=post&show_sticky=1
“Order” column is displayed using the following code:
add_filter('manage_posts_columns', 'posts_columns_order', 5);
add_action('manage_posts_custom_column', 'posts_custom_columns_order', 5, 2);
function posts_columns_order($defaults){
$defaults['menu_order'] = __('Order');
return $defaults;
}
function posts_custom_columns_order($column_name, $id){
global $post;
if($column_name === 'menu_order'){
$order = $post->menu_order;
echo $order;
}
}
Even when editing post using /wp-admin/post.php?post=…&action=edit, Order field displays different value than the one in the database. How’s that even possible?
Using the following code to display it:
add_action( 'admin_init', 'posts_order_wpse_91866' );
function posts_order_wpse_91866()
{
add_post_type_support( 'post', 'page-attributes' );
}
Aha, who exactly is performing the $wpdb->update() calls?
Thread Starter
net
(@krstarica)
Plugin for changing sticky posts order via ajax.
Database gets updated, but Redis seems to be unaware of that.
The author of that plugin (link?) must use normal WordPress API functions to handle sticky changes, so that WordPress can inform the object cache to update itself.
Thread Starter
net
(@krstarica)
It’s a custom plugin and menu_order field is updated using:
$wpdb->update($wpdb->posts, array( 'menu_order' => $start ), array( 'ID' => $post->ID) );
You have to use wp_update_post() instead, otherwise the object cache won’t know about it.
Thread Starter
net
(@krstarica)
Where’s the catch?
Noticed similar calls in some popular plugins, too. Will they work properly with Redis or not?
Yoast SEO
$result = $this->database->update( $this->get_table_name(), $data, $where, $format, $where_format );
WP REST Cache
$wpdb->update(
$this->db_table_caches,
[
'expiration' => $expiration,
'deleted' => 0,
'cleaned' => (int) $cleaned,
],
[ 'cache_id' => $cache_id ],
[ '%s', '%d', '%d' ],
[ '%d' ]
);
WP Media Category Management
$wpdb->update( $wpdb->term_taxonomy, array(
'count' => $rowCount->total,
), array(
'term_taxonomy_id' => $rowCount->term_taxonomy_id,
) );
There is no catch to using WordPress API functions. If you update the tables directly then the object cache will be out of date.
You can call clean_post_cache() after running a query: https://developer.ww.wp.xz.cn/reference/functions/clean_post_cache/
Thread Starter
net
(@krstarica)
After replacing $wpdb->update with wp_update_post() the issue is solved.
Many thanks for your help Till.
Maybe to add explanation to FAQ: https://github.com/rhubarbgroup/redis-cache/blob/develop/FAQ.md