Taxonomy: Better error handling when fetching object terms from cache.

Since [37573], `get_object_term_cache()` has expected term IDs to be
stored in the taxonomy relationship cache. The function would then
reach directly into the 'terms' cache to fetch the data corresponding
to a given term, before returning a `WP_Term` object. This caused
problems when, for one reason or another, term data was cached
inconsistently:

* If the 'terms' cache is empty for a given term ID, despite the earlier call to `_prime_term_caches()`, `get_term()` would return an error object.
* If the array of cached term IDs contains an invalid ID, `get_term()` would return an error object.

We avoid these errors by no longer touching the 'terms' cache directly,
but running term IDs through `get_term()` and allowing that function to
reference the cache (and database, as needed). If `get_term()` returns
an error object for any of the cached term IDs, `get_object_term_cache()`
will return that error object alone. This change ensures that upstream
functions, like `get_the_terms()`, return `WP_Error` objects in a
predictable fashion.

Props dd32, michalzuber.
Fixes #37291.
Built from https://develop.svn.wordpress.org/trunk@38776


git-svn-id: http://core.svn.wordpress.org/trunk@38719 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
Boone Gorges 2016-10-11 01:56:29 +00:00
parent 7c1cb69e7a
commit e97ab5362b
2 changed files with 13 additions and 4 deletions

View File

@ -3010,10 +3010,14 @@ function clean_term_cache($ids, $taxonomy = '', $clean_taxonomy = true) {
* function only fetches relationship data that is already in the cache.
*
* @since 2.3.0
* @since 4.6.2 Returns a WP_Error object if get_term() returns an error for
* any of the matched terms.
*
* @param int $id Term object ID.
* @param string $taxonomy Taxonomy name.
* @return bool|array Array of `WP_Term` objects, if cached False if cache is empty for `$taxonomy` and `$id`.
* @return bool|array|WP_Error Array of `WP_Term` objects, if cached.
* False if cache is empty for `$taxonomy` and `$id`.
* WP_Error if get_term() returns an error object for any term.
*/
function get_object_term_cache( $id, $taxonomy ) {
$_term_ids = wp_cache_get( $id, "{$taxonomy}_relationships" );
@ -3038,10 +3042,15 @@ function get_object_term_cache( $id, $taxonomy ) {
$terms = array();
foreach ( $term_ids as $term_id ) {
$terms[] = wp_cache_get( $term_id, 'terms' );
$term = get_term( $term_id );
if ( is_wp_error( $term ) ) {
return $term;
}
$terms[] = $term;
}
return array_map( 'get_term', $terms );
return $terms;
}
/**

View File

@ -4,7 +4,7 @@
*
* @global string $wp_version
*/
$wp_version = '4.7-alpha-38775';
$wp_version = '4.7-alpha-38776';
/**
* Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.