#57894 closed defect (bug) (duplicate)
update_option() still tries to update integers, floats and booleans that have not changed
| Reported by: |
|
Owned by: | |
|---|---|---|---|
| Milestone: | Priority: | normal | |
| Severity: | major | Version: | 4.2 |
| Component: | Options, Meta APIs | Keywords: | |
| Focuses: | performance | Cc: |
Description
On line 485 of /wp-includes/option.php the update_option() function will return false if the new and old value are the same to prevent un-necessary call to $wpdb->update(). Which is great.
However, the condition uses the identical === operator so this check fails because get_option() always returns a string (unless called from memory on the same page load).
This means that the condition fails when $value is an integer, float or boolean and an un-necessary call is then made to $wpdb->update() which then fails and returns false anyway.
The following needs to be inserted before this to make sure that the condition works correctly ...
<?php if ( in_array( gettype($value), array( 'boolean', 'integer', 'double' ), true ) ) { $value = (string) $value; } if ( in_array( gettype($old_value), array( 'boolean', 'integer', 'double' ), true ) ) { $old_value = (string) $old_value; }
The second check is in case update_option() is called on the same page load.
I discovered this whilst trying to get to the bottom of an issue with wp-cron 57271.
Oliver
Hi there, thanks for the ticket!
We're already tracking this issue in #22192.