diff --git a/src/wp-includes/taxonomy.php b/src/wp-includes/taxonomy.php index 12efa5a995..1995c3b321 100644 --- a/src/wp-includes/taxonomy.php +++ b/src/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/tests/phpunit/tests/term/cache.php b/tests/phpunit/tests/term/cache.php index 1ce755bf3a..fb7a5a84ab 100644 --- a/tests/phpunit/tests/term/cache.php +++ b/tests/phpunit/tests/term/cache.php @@ -390,4 +390,30 @@ class Tests_Term_Cache extends WP_UnitTestCase { $this->assertSame( $term_meta, 'bar' ); $this->assertEquals( $num_queries, $wpdb->num_queries ); } + + /** + * @ticket 37291 + */ + public function test_get_object_term_cache_should_return_error_if_any_term_is_an_error() { + register_taxonomy( 'wptests_tax', 'post' ); + + $t = self::factory()->term->create( array( 'taxonomy' => 'wptests_tax' ) ); + $p = self::factory()->post->create(); + wp_set_object_terms( $p, $t, 'wptests_tax' ); + + // Prime cache. + $terms = get_the_terms( $p, 'wptests_tax' ); + $this->assertEqualSets( array( $t ), wp_list_pluck( $terms, 'term_id' ) ); + + /* + * Modify cached array to insert an empty term ID, + * which will trigger an error in get_term(). + */ + $cached_ids = wp_cache_get( $p, 'wptests_tax_relationships' ); + $cached_ids[] = 0; + wp_cache_set( $p, $cached_ids, 'wptests_tax_relationships' ); + + $terms = get_the_terms( $p, 'wptests_tax' ); + $this->assertWPError( $terms ); + } }