Don't cache WP_Term objects in wp_get_object_cache().

The data stored in the cache should be raw database query results, not
`WP_Term` objects (which may be modified by plugins, and may contain additional
properties that shouldn't be cached).

If term relationships caches were handled in `wp_get_object_terms()` - where
a database query takes place - it would be straightforward to cache raw data.
See #34239. Since, in fact, `get_the_terms()` caches the value it gets from
`wp_get_object_terms()`, we need a technique that allows us to get raw data
from a `WP_Term` object. Mirroring `WP_User`, we introduce a `data` property
on term objects, which `get_the_terms()` uses to fetch cacheable term info.

Fixes #34262.

git-svn-id: https://develop.svn.wordpress.org/trunk@35032 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
Boone Gorges
2015-10-12 15:12:29 +00:00
parent be5065a3ad
commit ed4eee668e
4 changed files with 76 additions and 3 deletions

View File

@@ -95,6 +95,15 @@ final class WP_Term {
*/
public $count = 0;
/**
* Info about the term, as stored in the database.
*
* @since 4.4.0
* @access protected
* @var array
*/
protected $data = array();
/**
* Stores the term object's sanitization level.
*
@@ -157,6 +166,8 @@ final class WP_Term {
foreach ( get_object_vars( $term ) as $key => $value ) {
$this->$key = $value;
}
$this->data = sanitize_term( $term, $this->taxonomy, $this->filter );
}
/**
@@ -182,4 +193,20 @@ final class WP_Term {
public function to_array() {
return get_object_vars( $this );
}
/**
* Getter.
*
* @since 4.4.0
* @access public
*
* @return mixed
*/
public function __get( $key ) {
switch ( $key ) {
case 'data' :
return sanitize_term( $this->{$key}, $this->data->taxonomy, 'raw' );
break;
}
}
}