<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[34997] trunk: Introduce `WP_Term`.</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta" style="font-size: 105%">
<dt style="float: left; width: 6em; font-weight: bold">Revision</dt> <dd><a style="font-weight: bold" href="https://core.trac.wordpress.org/changeset/34997">34997</a><script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","description":"Review this Commit","action":{"@type":"ViewAction","url":"https://core.trac.wordpress.org/changeset/34997","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>boonebgorges</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2015-10-10 01:58:37 +0000 (Sat, 10 Oct 2015)</dd>
</dl>

<pre style='padding-left: 1em; margin: 2em 0; border-left: 2px solid #ccc; line-height: 1.25; font-size: 105%; font-family: sans-serif'>Introduce `WP_Term`.

`get_term()` now returns a `WP_Term` object, instead of a `stdClass` object.
Cache support and sanitization filters for individual terms are now more
centralized. For example, `get_term_by()` is able to cast results of its query
to a `WP_Term` object by passing it through `get_term()`.

The `$taxonomy` parameter for `get_term()` is now optional, as terms ought to
be unique to a taxonomy (ie, shared terms no longer exist). In cases where
`get_term()` detects that the term matching the specified term_id is from the
wrong taxonomy, it checks to see if you've requested a shared term, and if so,
it splits the term. This is used only for fallback purposes.

The elimination of shared terms allows the caching strategy for terms to be
simplified. Individual terms are now cached in a single 'terms' bucket.

Props flixos90, boonebgorges, scribu, dipesh.kakadiya.
See <a href="https://core.trac.wordpress.org/ticket/14162">#14162</a>.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunksrcwpincludescategoryfunctionsphp">trunk/src/wp-includes/category-functions.php</a></li>
<li><a href="#trunksrcwpincludestaxonomyfunctionsphp">trunk/src/wp-includes/taxonomy-functions.php</a></li>
<li><a href="#trunksrcwpincludestaxonomyphp">trunk/src/wp-includes/taxonomy.php</a></li>
<li><a href="#trunktestsphpunitteststermcachephp">trunk/tests/phpunit/tests/term/cache.php</a></li>
<li><a href="#trunktestsphpunitteststermgetTermphp">trunk/tests/phpunit/tests/term/getTerm.php</a></li>
<li><a href="#trunktestsphpunitteststermgetTermByphp">trunk/tests/phpunit/tests/term/getTermBy.php</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunksrcwpincludesclasswptermphp">trunk/src/wp-includes/class-wp-term.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunksrcwpincludescategoryfunctionsphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/category-functions.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/category-functions.php      2015-10-10 01:41:43 UTC (rev 34996)
+++ trunk/src/wp-includes/category-functions.php        2015-10-10 01:58:37 UTC (rev 34997)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -319,18 +319,19 @@
</span><span class="cx" style="display: block; padding: 0 10px">  * pass to it. This is one of the features with using pass by reference in PHP.
</span><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * @since 2.3.0
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * @since 4.4.0 The `$category` parameter now also accepts a WP_Term object.
</ins><span class="cx" style="display: block; padding: 0 10px">  * @access private
</span><span class="cx" style="display: block; padding: 0 10px">  *
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- * @param array|object $category Category Row object or array
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * @param array|object|WP_Term $category Category Row object or array
</ins><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="cx" style="display: block; padding: 0 10px"> function _make_cat_compat( &$category ) {
</span><span class="cx" style="display: block; padding: 0 10px">        if ( is_object( $category ) && ! is_wp_error( $category ) ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $category->cat_ID = &$category->term_id;
-               $category->category_count = &$category->count;
-               $category->category_description = &$category->description;
-               $category->cat_name = &$category->name;
-               $category->category_nicename = &$category->slug;
-               $category->category_parent = &$category->parent;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $category->cat_ID = $category->term_id;
+               $category->category_count = $category->count;
+               $category->category_description = $category->description;
+               $category->cat_name = $category->name;
+               $category->category_nicename = $category->slug;
+               $category->category_parent = $category->parent;
</ins><span class="cx" style="display: block; padding: 0 10px">         } elseif ( is_array( $category ) && isset( $category['term_id'] ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                $category['cat_ID'] = &$category['term_id'];
</span><span class="cx" style="display: block; padding: 0 10px">                $category['category_count'] = &$category['count'];
</span></span></pre></div>
<a id="trunksrcwpincludesclasswptermphp"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: trunk/src/wp-includes/class-wp-term.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/class-wp-term.php                           (rev 0)
+++ trunk/src/wp-includes/class-wp-term.php     2015-10-10 01:58:37 UTC (rev 34997)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -0,0 +1,187 @@
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+<?php
+/**
+ * Taxonomy API: WP_Term class
+ *
+ * @package WordPress
+ * @subpackage Taxonomy
+ * @since 4.4.0
+ */
+
+/**
+ * Core class used to implement the WP_Term object.
+ *
+ * @since 4.4.0
+ */
+final class WP_Term {
+
+       /**
+        * Term ID.
+        *
+        * @since 4.4.0
+        * @access public
+        * @var int
+        */
+       public $term_id;
+
+       /**
+        * The term's name.
+        *
+        * @since 4.4.0
+        * @access public
+        * @var string
+        */
+       public $name = '';
+
+       /**
+        * The term's slug.
+        *
+        * @since 4.4.0
+        * @access public
+        * @var string
+        */
+       public $slug = '';
+
+       /**
+        * The term's term_group.
+        *
+        * @since 4.4.0
+        * @access public
+        * @var string
+        */
+       public $term_group = '';
+
+       /**
+        * Term Taxonomy ID.
+        *
+        * @since 4.4.0
+        * @access public
+        * @var int
+        */
+       public $term_taxonomy_id = 0;
+
+       /**
+        * The term's taxonomy name.
+        *
+        * @since 4.4.0
+        * @access public
+        * @var string
+        */
+       public $taxonomy = '';
+
+       /**
+        * The term's description.
+        *
+        * @since 4.4.0
+        * @access public
+        * @var string
+        */
+       public $description = '';
+
+       /**
+        * ID of a term's parent term.
+        *
+        * @since 4.4.0
+        * @access public
+        * @var int
+        */
+       public $parent = 0;
+
+       /**
+        * Cached object count for this term.
+        *
+        * @since 4.4.0
+        * @access public
+        * @var int
+        */
+       public $count = 0;
+
+       /**
+        * Stores the term object's sanitization level.
+        *
+        * Does not correspond to a database field.
+        *
+        * @since 4.4.0
+        * @access public
+        * @var string
+        */
+       public $filter = 'raw';
+
+       /**
+        * Retrieve WP_Term instance.
+        *
+        * @since 4.4.0
+        * @access public
+        * @static
+        *
+        * @global wpdb $wpdb WordPress database abstraction object.
+        *
+        * @param int $term_id Term ID.
+        * @return WP_Term|false Term object, false otherwise.
+        */
+       public static function get_instance( $term_id ) {
+               global $wpdb;
+
+               $term_id = (int) $term_id;
+               if ( ! $term_id ) {
+                       return false;
+               }
+
+               $_term = wp_cache_get( $term_id, 'terms' );
+
+               // If there isn't a cached version, hit the database.
+               if ( ! $_term ) {
+                       $_term = $wpdb->get_row( $wpdb->prepare( "SELECT t.*, tt.* FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id WHERE t.term_id = %d LIMIT 1", $term_id ) );
+                       if ( ! $_term ) {
+                               return false;
+                       }
+
+                       $_term = sanitize_term( $_term, $_term->taxonomy, 'raw' );
+                       wp_cache_add( $term_id, $_term, 'terms' );
+               }
+
+               return new WP_Term( $_term );
+       }
+
+       /**
+        * Constructor.
+        *
+        * @since 4.4.0
+        * @access public
+        *
+        * @param WP_Term|object $term Term object.
+        */
+       public function __construct( $term ) {
+               foreach ( get_object_vars( $term ) as $key => $value ) {
+                       $this->$key = $value;
+               }
+       }
+
+       /**
+        * Sanitizes term fields, according to the filter type provided.
+        *
+        * @since 4.4.0
+        * @access public
+        *
+        * @param string $filter Filter context. Accepts 'edit', 'db', 'display', 'attribute', 'js', 'raw'.
+        */
+       public function filter( $filter ) {
+               // Term has already been filtered - nothing more to do.
+               if ( isset( $this->filter ) && $this->filter === $filter ) {
+                       return;
+               }
+
+               sanitize_term( $this, $this->taxonomy, $filter );
+       }
+
+       /**
+        * Converts an object to array.
+        *
+        * @since 4.4.0
+        * @access public
+        *
+        * @return array Object as array.
+        */
+       public function to_array() {
+               return get_object_vars( $this );
+       }
+}
</ins></span></pre></div>
<a id="trunksrcwpincludestaxonomyfunctionsphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/taxonomy-functions.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/taxonomy-functions.php      2015-10-10 01:41:43 UTC (rev 34996)
+++ trunk/src/wp-includes/taxonomy-functions.php        2015-10-10 01:58:37 UTC (rev 34997)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -708,51 +708,71 @@
</span><span class="cx" style="display: block; padding: 0 10px">  * @todo Better formatting for DocBlock
</span><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * @since 2.3.0
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * @since 4.4.0 Converted to return a WP_Term object if `$output` is `OBJECT`.
+ *              The `$taxonomy` parameter was made optional.
</ins><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * @global wpdb $wpdb WordPress database abstraction object.
</span><span class="cx" style="display: block; padding: 0 10px">  * @see sanitize_term_field() The $context param lists the available values for get_term_by() $filter param.
</span><span class="cx" style="display: block; padding: 0 10px">  *
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- * @param int|object $term     If integer, will get from database. If object will apply filters and return $term.
- * @param string     $taxonomy Taxonomy name that $term is part of.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * @param int|WP_Term|object $term If integer, term data will be fetched from the database, or from the cache if
+ *                                 available. If stdClass object (as in the results of a database query), will apply
+ *                                 filters and return a `WP_Term` object corresponding to the `$term` data. If `WP_Term`,
+ *                                 will return `$term`.
+ * @param string     $taxonomy Optional. Taxonomy name that $term is part of.
</ins><span class="cx" style="display: block; padding: 0 10px">  * @param string     $output   Constant OBJECT, ARRAY_A, or ARRAY_N
</span><span class="cx" style="display: block; padding: 0 10px">  * @param string     $filter   Optional, default is raw or no WordPress defined filter will applied.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- * @return object|array|null|WP_Error Term Row from database. Will return null if $term is empty. If taxonomy does not
- * exist then WP_Error will be returned.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * @return mixed Type corresponding to `$output` on success or null on failure. When `$output` is `OBJECT`,
+ *               a WP_Term instance is returned. If taxonomy does not exist then WP_Error will be returned.
</ins><span class="cx" style="display: block; padding: 0 10px">  */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-function get_term($term, $taxonomy, $output = OBJECT, $filter = 'raw') {
-       global $wpdb;
-
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+function get_term( $term, $taxonomy = '', $output = OBJECT, $filter = 'raw' ) {
</ins><span class="cx" style="display: block; padding: 0 10px">         if ( empty( $term ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                return new WP_Error( 'invalid_term', __( 'Empty Term' ) );
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if ( ! taxonomy_exists( $taxonomy ) ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ if ( $taxonomy && ! taxonomy_exists( $taxonomy ) ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 return new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy' ) );
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if ( is_object($term) && empty($term->filter) ) {
-               wp_cache_add( $term->term_id, $term, $taxonomy );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ if ( $term instanceof WP_Term ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 $_term = $term;
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        } elseif ( is_object( $term ) ) {
+               if ( empty( $term->filter ) || 'raw' === $term->filter ) {
+                       $_term = sanitize_term( $term, $taxonomy, 'raw' );
+                       $_term = new WP_Term( $_term );
+               } else {
+                       $_term = WP_Term::get_instance( $term->term_id );
+               }
</ins><span class="cx" style="display: block; padding: 0 10px">         } else {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                if ( is_object($term) )
-                       $term = $term->term_id;
-               if ( !$term = (int) $term )
-                       return null;
-               if ( ! $_term = wp_cache_get( $term, $taxonomy ) ) {
-                       $_term = $wpdb->get_row( $wpdb->prepare( "SELECT t.*, tt.* FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id WHERE tt.taxonomy = %s AND t.term_id = %d LIMIT 1", $taxonomy, $term) );
-                       if ( ! $_term )
-                               return null;
-                       wp_cache_add( $term, $_term, $taxonomy );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $_term = WP_Term::get_instance( $term );
+       }
+
+       // If `$taxonomy` was provided, make sure it matches the taxonomy of the located term.
+       if ( $_term && $taxonomy && $taxonomy !== $_term->taxonomy ) {
+               // If there are two terms with the same ID, split the other one to a new term.
+               $new_term_id = _split_shared_term( $_term->term_id, $_term->term_taxonomy_id );
+
+               // If no split occurred, this is an invalid request.
+               if ( $new_term_id === $_term->term_id ) {
+                       return new WP_Error( 'invalid_term', __( 'Empty Term' ) );
+
+               // The term has been split. Refetch the term from the proper taxonomy.
+               } else {
+                       return get_term( $_term->term_id, $taxonomy, $output, $filter );
</ins><span class="cx" style="display: block; padding: 0 10px">                 }
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        if ( ! $_term ) {
+               return null;
+       }
+
</ins><span class="cx" style="display: block; padding: 0 10px">         /**
</span><span class="cx" style="display: block; padding: 0 10px">         * Filter a term.
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         * @since 2.3.0
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         * @since 4.4.0 `$_term` can now also be a WP_Term object.
</ins><span class="cx" style="display: block; padding: 0 10px">          *
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-         * @param int|object $_term    Term object or ID.
-        * @param string     $taxonomy The taxonomy slug.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+  * @param int|WP_Term $_term    Term object or ID.
+        * @param string      $taxonomy The taxonomy slug.
</ins><span class="cx" style="display: block; padding: 0 10px">          */
</span><span class="cx" style="display: block; padding: 0 10px">        $_term = apply_filters( 'get_term', $_term, $taxonomy );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -763,24 +783,23 @@
</span><span class="cx" style="display: block; padding: 0 10px">         * to the taxonomy slug.
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         * @since 2.3.0
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         * @since 4.4.0 `$_term` can now also be a WP_Term object.
</ins><span class="cx" style="display: block; padding: 0 10px">          *
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-         * @param int|object $_term    Term object or ID.
-        * @param string     $taxonomy The taxonomy slug.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+  * @param int|WP_Term $_term    Term object or ID.
+        * @param string      $taxonomy The taxonomy slug.
</ins><span class="cx" style="display: block; padding: 0 10px">          */
</span><span class="cx" style="display: block; padding: 0 10px">        $_term = apply_filters( "get_$taxonomy", $_term, $taxonomy );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $_term = sanitize_term($_term, $taxonomy, $filter);
</del><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if ( $output == OBJECT ) {
-               return $_term;
-       } elseif ( $output == ARRAY_A ) {
-               $__term = get_object_vars($_term);
-               return $__term;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ // Sanitize term, according to the specified filter.
+       $_term->filter( $filter );
+
+       if ( $output == ARRAY_A ) {
+               return $_term->to_array();
</ins><span class="cx" style="display: block; padding: 0 10px">         } elseif ( $output == ARRAY_N ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $__term = array_values(get_object_vars($_term));
-               return $__term;
-       } else {
-               return $_term;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         return array_values( $_term->to_array() );
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+       return $_term;
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> /**
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -798,7 +817,8 @@
</span><span class="cx" style="display: block; padding: 0 10px">  * @todo Better formatting for DocBlock.
</span><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * @since 2.3.0
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- * @since 4.4.0 `$taxonomy` is optional if `$field` is 'term_taxonomy_id'.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * @since 4.4.0 `$taxonomy` is optional if `$field` is 'term_taxonomy_id'. Converted to return
+ *              a WP_Term object if `$output` is `OBJECT`.
</ins><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * @global wpdb $wpdb WordPress database abstraction object.
</span><span class="cx" style="display: block; padding: 0 10px">  * @see sanitize_term_field() The $context param lists the available values for get_term_by() $filter param.
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -808,8 +828,8 @@
</span><span class="cx" style="display: block; padding: 0 10px">  * @param string     $taxonomy Taxonomy name. Optional, if `$field` is 'term_taxonomy_id'.
</span><span class="cx" style="display: block; padding: 0 10px">  * @param string     $output   Constant OBJECT, ARRAY_A, or ARRAY_N
</span><span class="cx" style="display: block; padding: 0 10px">  * @param string     $filter   Optional, default is raw or no WordPress defined filter will applied.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- * @return object|array|null|WP_Error|false Term Row from database.
- *                                          Will return false if $taxonomy does not exist or $term was not found.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * @return WP_Term|bool WP_Term instance on success. Will return false if `$taxonomy` does not exist
+ *                      or `$term` was not found.
</ins><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="cx" style="display: block; padding: 0 10px"> function get_term_by( $field, $value, $taxonomy = '', $output = OBJECT, $filter = 'raw' ) {
</span><span class="cx" style="display: block; padding: 0 10px">        global $wpdb;
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -822,17 +842,17 @@
</span><span class="cx" style="display: block; padding: 0 10px">        $tax_clause = $wpdb->prepare( "AND tt.taxonomy = %s", $taxonomy );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        if ( 'slug' == $field ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $field = 't.slug';
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $_field = 't.slug';
</ins><span class="cx" style="display: block; padding: 0 10px">                 $value = sanitize_title($value);
</span><span class="cx" style="display: block; padding: 0 10px">                if ( empty($value) )
</span><span class="cx" style="display: block; padding: 0 10px">                        return false;
</span><span class="cx" style="display: block; padding: 0 10px">        } elseif ( 'name' == $field ) {
</span><span class="cx" style="display: block; padding: 0 10px">                // Assume already escaped
</span><span class="cx" style="display: block; padding: 0 10px">                $value = wp_unslash($value);
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $field = 't.name';
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $_field = 't.name';
</ins><span class="cx" style="display: block; padding: 0 10px">         } elseif ( 'term_taxonomy_id' == $field ) {
</span><span class="cx" style="display: block; padding: 0 10px">                $value = (int) $value;
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $field = 'tt.term_taxonomy_id';
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $_field = 'tt.term_taxonomy_id';
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                // No `taxonomy` clause when searching by 'term_taxonomy_id'.
</span><span class="cx" style="display: block; padding: 0 10px">                $tax_clause = '';
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -844,7 +864,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                return $term;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $term = $wpdb->get_row( $wpdb->prepare( "SELECT t.*, tt.* FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id WHERE $field = %s $tax_clause LIMIT 1", $value ) );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $term = $wpdb->get_row( $wpdb->prepare( "SELECT t.*, tt.* FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id WHERE $_field = %s $tax_clause LIMIT 1", $value ) );
</ins><span class="cx" style="display: block; padding: 0 10px">         if ( ! $term )
</span><span class="cx" style="display: block; padding: 0 10px">                return false;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -853,25 +873,9 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $taxonomy = $term->taxonomy;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        wp_cache_add( $term->term_id, $term, $taxonomy );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ wp_cache_add( $term->term_id, $term, 'terms' );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        /** This filter is documented in wp-includes/taxonomy-functions.php */
-       $term = apply_filters( 'get_term', $term, $taxonomy );
-
-       /** This filter is documented in wp-includes/taxonomy-functions.php */
-       $term = apply_filters( "get_$taxonomy", $term, $taxonomy );
-
-       $term = sanitize_term($term, $taxonomy, $filter);
-
-       if ( $output == OBJECT ) {
-               return $term;
-       } elseif ( $output == ARRAY_A ) {
-               return get_object_vars($term);
-       } elseif ( $output == ARRAY_N ) {
-               return array_values(get_object_vars($term));
-       } else {
-               return $term;
-       }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ return get_term( $term, $taxonomy, $output, $filter );
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> /**
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3422,14 +3426,14 @@
</span><span class="cx" style="display: block; padding: 0 10px">                foreach ( (array) $terms as $term ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        $taxonomies[] = $term->taxonomy;
</span><span class="cx" style="display: block; padding: 0 10px">                        $ids[] = $term->term_id;
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        wp_cache_delete($term->term_id, $term->taxonomy);
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 wp_cache_delete( $term->term_id, 'terms' );
</ins><span class="cx" style="display: block; padding: 0 10px">                 }
</span><span class="cx" style="display: block; padding: 0 10px">                $taxonomies = array_unique($taxonomies);
</span><span class="cx" style="display: block; padding: 0 10px">        } else {
</span><span class="cx" style="display: block; padding: 0 10px">                $taxonomies = array($taxonomy);
</span><span class="cx" style="display: block; padding: 0 10px">                foreach ( $taxonomies as $taxonomy ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        foreach ( $ids as $id ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                wp_cache_delete($id, $taxonomy);
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         wp_cache_delete( $id, 'terms' );
</ins><span class="cx" style="display: block; padding: 0 10px">                         }
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3552,7 +3556,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                if ( empty($term_taxonomy) )
</span><span class="cx" style="display: block; padding: 0 10px">                        $term_taxonomy = $term->taxonomy;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                wp_cache_add( $term->term_id, $term, $term_taxonomy );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         wp_cache_add( $term->term_id, $term, 'terms' );
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span></span></pre></div>
<a id="trunksrcwpincludestaxonomyphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/taxonomy.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/taxonomy.php        2015-10-10 01:41:43 UTC (rev 34996)
+++ trunk/src/wp-includes/taxonomy.php  2015-10-10 01:58:37 UTC (rev 34997)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -10,5 +10,8 @@
</span><span class="cx" style="display: block; padding: 0 10px"> /** Core taxonomy functionality */
</span><span class="cx" style="display: block; padding: 0 10px"> require_once( ABSPATH . WPINC . '/taxonomy-functions.php' );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+/** WP_Term class */
+require_once( ABSPATH . WPINC . '/class-wp-term.php' );
+
</ins><span class="cx" style="display: block; padding: 0 10px"> /** WP_Tax_Query class */
</span><span class="cx" style="display: block; padding: 0 10px"> require_once( ABSPATH . WPINC . '/class-wp-tax-query.php' );
</span></span></pre></div>
<a id="trunktestsphpunitteststermcachephp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/tests/phpunit/tests/term/cache.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/tests/phpunit/tests/term/cache.php  2015-10-10 01:41:43 UTC (rev 34996)
+++ trunk/tests/phpunit/tests/term/cache.php    2015-10-10 01:58:37 UTC (rev 34997)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -103,10 +103,10 @@
</span><span class="cx" style="display: block; padding: 0 10px">                ) );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $term_object = get_term( $term, 'wptests_tax' );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                wp_cache_delete( $term, 'wptests_tax' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         wp_cache_delete( $term, 'terms' );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                // Affirm that the cache is empty.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $this->assertEmpty( wp_cache_get( $term, 'wptests_tax' ) );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $this->assertEmpty( wp_cache_get( $term, 'terms' ) );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $num_queries = $wpdb->num_queries;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -128,16 +128,16 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        'taxonomy' => 'wptests_tax',
</span><span class="cx" style="display: block; padding: 0 10px">                ) );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                wp_cache_delete( $term, 'wptests_tax' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         wp_cache_delete( $term, 'terms' );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                // Affirm that the cache is empty.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $this->assertEmpty( wp_cache_get( $term, 'wptests_tax' ) );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $this->assertEmpty( wp_cache_get( $term, 'terms' ) );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $num_queries = $wpdb->num_queries;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                // Prime cache.
</span><span class="cx" style="display: block; padding: 0 10px">                $term_object = get_term( $term, 'wptests_tax' );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $this->assertNotEmpty( wp_cache_get( $term, 'wptests_tax' ) );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $this->assertNotEmpty( wp_cache_get( $term, 'terms' ) );
</ins><span class="cx" style="display: block; padding: 0 10px">                 $this->assertSame( $num_queries + 1, $wpdb->num_queries );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $term_object_2 = get_term( $term, 'wptests_tax' );
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -155,16 +155,16 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        'taxonomy' => 'wptests_tax',
</span><span class="cx" style="display: block; padding: 0 10px">                ) );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                wp_cache_delete( $term, 'wptests_tax' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         wp_cache_delete( $term, 'terms' );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                // Affirm that the cache is empty.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $this->assertEmpty( wp_cache_get( $term, 'wptests_tax' ) );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $this->assertEmpty( wp_cache_get( $term, 'terms' ) );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $num_queries = $wpdb->num_queries;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                // Prime cache.
</span><span class="cx" style="display: block; padding: 0 10px">                $term_object = get_term_by( 'id', $term, 'wptests_tax' );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $this->assertNotEmpty( wp_cache_get( $term, 'wptests_tax' ) );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $this->assertNotEmpty( wp_cache_get( $term, 'terms' ) );
</ins><span class="cx" style="display: block; padding: 0 10px">                 $this->assertSame( $num_queries + 1, $wpdb->num_queries );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $term_object_2 = get_term( $term, 'wptests_tax' );
</span></span></pre></div>
<a id="trunktestsphpunitteststermgetTermphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/tests/phpunit/tests/term/getTerm.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/tests/phpunit/tests/term/getTerm.php        2015-10-10 01:41:43 UTC (rev 34996)
+++ trunk/tests/phpunit/tests/term/getTerm.php  2015-10-10 01:58:37 UTC (rev 34997)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -35,19 +35,6 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertSame( $num_queries, $wpdb->num_queries );
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        public function test_passing_term_object_should_not_skip_database_query_when_filter_property_is_set() {
-               global $wpdb;
-
-               $term = $this->factory->term->create_and_get( array( 'taxonomy' => 'wptests_tax' ) );
-               clean_term_cache( $term->term_id, 'wptests_tax' );
-
-               $num_queries = $wpdb->num_queries;
-
-               $term_a = get_term( $term, 'wptests_tax' );
-
-               $this->assertSame( $num_queries + 1, $wpdb->num_queries );
-       }
-
</del><span class="cx" style="display: block; padding: 0 10px">         public function test_passing_term_string_that_casts_to_int_0_should_return_null() {
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertSame( null, get_term( 'abc', 'wptests_tax' ) );
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -98,4 +85,25 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $t = $this->factory->term->create( array( 'taxonomy' => 'wptests_tax' ) );
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertInternalType( 'object', get_term( $t, 'wptests_tax', 'foo' ) );
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+       /**
+        * @ticket 14162
+        */
+       public function test_numeric_properties_should_be_cast_to_ints() {
+               global $wpdb;
+
+               $t = $this->factory->term->create( array( 'taxonomy' => 'wptests_tax' ) );
+
+               // Get raw data from the database.
+               $term_data = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->terms t JOIN $wpdb->term_taxonomy tt ON ( t.term_id = tt.term_id ) WHERE t.term_id = %d", $t ) );
+
+               $found = get_term( $term_data );
+
+               $this->assertTrue( $found instanceof WP_Term );
+               $this->assertInternalType( 'int', $found->term_id );
+               $this->assertInternalType( 'int', $found->term_taxonomy_id );
+               $this->assertInternalType( 'int', $found->parent );
+               $this->assertInternalType( 'int', $found->count );
+               $this->assertInternalType( 'int', $found->term_group );
+       }
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span></span></pre></div>
<a id="trunktestsphpunitteststermgetTermByphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/tests/phpunit/tests/term/getTermBy.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/tests/phpunit/tests/term/getTermBy.php      2015-10-10 01:41:43 UTC (rev 34996)
+++ trunk/tests/phpunit/tests/term/getTermBy.php        2015-10-10 01:58:37 UTC (rev 34997)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -59,4 +59,32 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $found = get_term_by( 'term_taxonomy_id', $new_ttid, 'foo' );
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertSame( $t, $found->term_id );
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+       /**
+        * @ticket 14162
+        */
+       public function test_should_prime_term_cache() {
+               global $wpdb;
+
+               register_taxonomy( 'wptests_tax', 'post' );
+               $t = $this->factory->term->create( array(
+                       'taxonomy' => 'wptests_tax',
+                       'slug' => 'foo',
+               ) );
+
+               clean_term_cache( $t, 'wptests_tax' );
+
+               $num_queries = $wpdb->num_queries;
+               $found = get_term_by( 'slug', 'foo', 'wptests_tax' );
+               $num_queries++;
+
+               $this->assertTrue( $found instanceof WP_Term );
+               $this->assertSame( $t, $found->term_id );
+               $this->assertSame( $num_queries, $wpdb->num_queries );
+
+               // Calls to `get_term()` should now hit cache.
+               $found2 = get_term( $t );
+               $this->assertSame( $t, $found->term_id );
+               $this->assertSame( $num_queries, $wpdb->num_queries );
+       }
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span></span></pre>
</div>
</div>

</body>
</html>