wordpress-develop/tests/phpunit/tests/term/isObjectInTerm.php
Jonny Harris 4a9f5fe3be Taxonomy: Only store term_ids and object_ids in WP_Term_Query query caches.
The query cache currently implemented in `WP_Term_Query` caches the final output of the query, depending on what fields are requested. This is wasteful, as if a user requests `fields` => `all`, then an unlimited array of `WP_Term` objects could be stored in the object cache. Instead of storing the whole WP_Term object, this change only the term_id is stored. To get an array the full WP_Term objects, the `_prime_term_caches` function is called with an array of ids. In instances where a persistent object cache is not in use, then this will result in another SQL query to be run. After `_prime_term_caches` is called if this term is requested again in the same page load, then it will already be loaded into memory.  If a user runs `WP_Term_Query` with the fields param set to `all_with_object_id`, an array of objects containing both the term_id and object_ids are stored in cache. 

This change also improves the logic to load term meta caches. This change ensures that term meta is always primed for all terms loaded in the term query. 

Props Spacedmonkey, boonebgorges, jbpaul17, peterwilsoncc, flixos90, pbearne.
Fixes #37189.


git-svn-id: https://develop.svn.wordpress.org/trunk@52836 602fd350-edb4-49c9-b593-d223f7449a82
2022-03-10 10:56:09 +00:00

187 lines
5.7 KiB
PHP

<?php
/**
* @group taxonomy
*/
class Tests_IsObjectInTerm extends WP_UnitTestCase {
public function test_terms_are_ints() {
register_taxonomy( 'wptests_tax', 'post' );
$t1 = self::factory()->term->create( array( 'taxonomy' => 'wptests_tax' ) );
$t2 = self::factory()->term->create( array( 'taxonomy' => 'wptests_tax' ) );
$posts = self::factory()->post->create_many( 2 );
wp_set_object_terms( $posts[0], array( $t1 ), 'wptests_tax' );
$this->assertTrue( is_object_in_term( $posts[0], 'wptests_tax', array( $t1, $t2 ) ) );
$this->assertFalse( is_object_in_term( $posts[1], 'wptests_tax', array( $t1, $t2 ) ) );
_unregister_taxonomy( 'wptests_tax', 'post' );
}
public function test_terms_are_strings_and_match_term_id() {
register_taxonomy( 'wptests_tax', 'post' );
$t1 = self::factory()->term->create( array( 'taxonomy' => 'wptests_tax' ) );
$t2 = self::factory()->term->create( array( 'taxonomy' => 'wptests_tax' ) );
$posts = self::factory()->post->create_many( 2 );
wp_set_object_terms( $posts[0], array( $t1 ), 'wptests_tax' );
$t1_str = (string) $t1;
$t2_str = (string) $t2;
$this->assertTrue( is_object_in_term( $posts[0], 'wptests_tax', array( $t1_str, $t2_str ) ) );
$this->assertFalse( is_object_in_term( $posts[1], 'wptests_tax', array( $t1_str, $t2_str ) ) );
_unregister_taxonomy( 'wptests_tax', 'post' );
}
public function test_terms_are_strings_and_match_term_name() {
register_taxonomy( 'wptests_tax', 'post' );
$t1 = self::factory()->term->create(
array(
'taxonomy' => 'wptests_tax',
'name' => 'Foo',
)
);
$t2 = self::factory()->term->create(
array(
'taxonomy' => 'wptests_tax',
'name' => 'Bar',
)
);
$posts = self::factory()->post->create_many( 2 );
wp_set_object_terms( $posts[0], array( $t1 ), 'wptests_tax' );
$this->assertTrue( is_object_in_term( $posts[0], 'wptests_tax', array( 'Foo', 'Bar' ) ) );
$this->assertFalse( is_object_in_term( $posts[1], 'wptests_tax', array( 'Foo', 'Bar' ) ) );
_unregister_taxonomy( 'wptests_tax', 'post' );
}
public function test_terms_are_strings_and_match_term_slug() {
register_taxonomy( 'wptests_tax', 'post' );
$t1 = self::factory()->term->create(
array(
'taxonomy' => 'wptests_tax',
'slug' => 'foo',
)
);
$t2 = self::factory()->term->create(
array(
'taxonomy' => 'wptests_tax',
'slug' => 'bar',
)
);
$posts = self::factory()->post->create_many( 2 );
wp_set_object_terms( $posts[0], array( $t1 ), 'wptests_tax' );
$this->assertTrue( is_object_in_term( $posts[0], 'wptests_tax', array( 'foo', 'bar' ) ) );
$this->assertFalse( is_object_in_term( $posts[1], 'wptests_tax', array( 'foo', 'bar' ) ) );
_unregister_taxonomy( 'wptests_tax', 'post' );
}
public function test_terms_contain_strings_and_ints_and_match_term_id_as_int() {
register_taxonomy( 'wptests_tax', 'post' );
$t1 = self::factory()->term->create(
array(
'taxonomy' => 'wptests_tax',
'slug' => 'foo',
)
);
$t2 = self::factory()->term->create(
array(
'taxonomy' => 'wptests_tax',
'slug' => 'bar',
)
);
$posts = self::factory()->post->create_many( 2 );
wp_set_object_terms( $posts[0], array( $t1 ), 'wptests_tax' );
$this->assertTrue( is_object_in_term( $posts[0], 'wptests_tax', array( $t1, 'bar' ) ) );
$this->assertFalse( is_object_in_term( $posts[1], 'wptests_tax', array( $t1, 'bar' ) ) );
_unregister_taxonomy( 'wptests_tax', 'post' );
}
/**
* @ticket 29467
*/
public function test_should_not_return_true_if_term_name_begins_with_existing_term_id() {
register_taxonomy( 'wptests_tax', 'post' );
$t = self::factory()->term->create( array( 'taxonomy' => 'wptests_tax' ) );
$post_ID = self::factory()->post->create();
wp_set_object_terms( $post_ID, $t, 'wptests_tax' );
$int_tax_name = $t . '_term_name';
$this->assertFalse( is_object_in_term( $post_ID, 'wptests_tax', $int_tax_name ) );
// Verify it works properly when the post is actually in the term.
wp_set_object_terms( $post_ID, array( $int_tax_name ), 'wptests_tax' );
$this->assertTrue( is_object_in_term( $post_ID, 'wptests_tax', $int_tax_name ) );
}
/**
* @ticket 32044
*/
public function test_should_populate_and_hit_relationships_cache() {
global $wpdb;
register_taxonomy( 'wptests_tax', 'post' );
$terms = self::factory()->term->create_many( 2, array( 'taxonomy' => 'wptests_tax' ) );
$o = 12345;
wp_set_object_terms( $o, $terms[0], 'wptests_tax' );
$num_queries = $wpdb->num_queries;
$this->assertTrue( is_object_in_term( $o, 'wptests_tax', $terms[0] ) );
$num_queries = $num_queries + 2;
$this->assertSame( $num_queries, $wpdb->num_queries );
$this->assertFalse( is_object_in_term( $o, 'wptests_tax', $terms[1] ) );
$this->assertSame( $num_queries, $wpdb->num_queries );
}
/**
* @ticket 32044
*/
public function test_should_not_be_fooled_by_a_stale_relationship_cache() {
global $wpdb;
register_taxonomy( 'wptests_tax', 'post' );
$terms = self::factory()->term->create_many( 2, array( 'taxonomy' => 'wptests_tax' ) );
$o = 12345;
wp_set_object_terms( $o, $terms[0], 'wptests_tax' );
$num_queries = $wpdb->num_queries;
$this->assertTrue( is_object_in_term( $o, 'wptests_tax', $terms[0] ) );
$num_queries = $num_queries + 2;
$this->assertSame( $num_queries, $wpdb->num_queries );
wp_set_object_terms( $o, $terms[1], 'wptests_tax' );
$num_queries = $wpdb->num_queries;
$this->assertTrue( is_object_in_term( $o, 'wptests_tax', $terms[1] ) );
$num_queries = $num_queries + 2;
$this->assertSame( $num_queries, $wpdb->num_queries );
}
/**
* @ticket 37721
*/
public function test_invalid_taxonomy_should_return_wp_error_object() {
$this->assertWPError( is_object_in_term( 12345, 'foo', 'bar' ) );
}
}