From e97ab5362bdff70ea200eb71895a29068a1dd668 Mon Sep 17 00:00:00 2001 From: Boone Gorges Date: Tue, 11 Oct 2016 01:56:29 +0000 Subject: [PATCH] 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 --- wp-includes/taxonomy.php | 15 ++++++++++++--- wp-includes/version.php | 2 +- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/wp-includes/taxonomy.php b/wp-includes/taxonomy.php index 12efa5a995..1995c3b321 100644 --- a/wp-includes/taxonomy.php +++ b/wp-includes/taxonomy.php @@ -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; } /** diff --git a/wp-includes/version.php b/wp-includes/version.php index 72dff8e6a3..35dfc2f240 100644 --- a/wp-includes/version.php +++ b/wp-includes/version.php @@ -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.