From 46202e3a8fc9add149b40586f8c3d107cbf0fc25 Mon Sep 17 00:00:00 2001 From: leogermani Date: Thu, 2 May 2019 15:09:49 -0300 Subject: [PATCH] fix insert item metadata for terms relying on buggy term_exists #231 --- .../class-tainacan-item-metadata.php | 24 +++- tests/test-taxonomies.php | 126 ++++++++++++++++++ 2 files changed, 148 insertions(+), 2 deletions(-) diff --git a/src/classes/repositories/class-tainacan-item-metadata.php b/src/classes/repositories/class-tainacan-item-metadata.php index 5a136026b..bbba4f980 100644 --- a/src/classes/repositories/class-tainacan-item-metadata.php +++ b/src/classes/repositories/class-tainacan-item-metadata.php @@ -186,8 +186,28 @@ class Item_Metadata extends Repository { ] ); } - $success = wp_set_object_terms( $item_metadata->get_item()->get_id(), $new_terms, $taxonomy->get_db_identifier() ); - + // We can not simply use wp_set_object_terms() because it uses term_exists() which is not reliable + // see https://core.trac.wordpress.org/ticket/45333 and https://core.trac.wordpress.org/ticket/47099 + // $success = wp_set_object_terms( $item_metadata->get_item()->get_id(), $new_terms, $taxonomy->get_db_identifier() ); + + $insert = []; + foreach ( (array) $new_terms as $new_term ) { + $exists = Terms::get_instance()->term_exists($new_term, $taxonomy, null, true); + if ( $exists ) { + $insert[] = $exists->term_id; + } else { + $create_term = new Entities\Term(); + $create_term->set_name($new_term); + $create_term->set_taxonomy( $taxonomy->get_db_identifier() ); + if ($create_term->validate()) { // Item_Metadata Entity was validated before, so this should be fine + $created_term = Terms::get_instance()->insert($create_term); + $insert[] = $created_term->get_id(); + } + } + } + + $success = wp_set_object_terms( $item_metadata->get_item()->get_id(), $insert, $taxonomy->get_db_identifier() ); + if ( $this->use_logs && ! $success instanceof \WP_Error ) { $new = get_terms(array( diff --git a/tests/test-taxonomies.php b/tests/test-taxonomies.php index df7b24627..9c454cd8b 100644 --- a/tests/test-taxonomies.php +++ b/tests/test-taxonomies.php @@ -202,6 +202,9 @@ class Taxonomies extends TAINACAN_UnitTestCase { $test_term = $Tainacan_Terms->term_exists('Parent', $taxonomy->get_id(), null, true); $this->assertEquals($parent->get_id(), $test_term->term_id); + // test brackets + $test_term = $Tainacan_Terms->term_exists('[Rock]', $taxonomy->get_id(), null, true); + $this->assertFalse($test_term); } @@ -290,4 +293,127 @@ class Taxonomies extends TAINACAN_UnitTestCase { $this->assertContains($taxonomy->get_db_identifier(), $pto); $this->assertNotContains($taxonomy->get_db_identifier(), $pages); } + + function test_brackets() { + + $taxonomy = $this->tainacan_entity_factory->create_entity( + 'taxonomy', + array( + 'name' => 'genero', + 'description' => 'tipos de musica', + 'allow_insert' => 'yes', + 'status' => 'publish' + ), + true + ); + + $Tainacan_Taxonomies = \Tainacan\Repositories\Taxonomies::get_instance(); + $Tainacan_Terms = \Tainacan\Repositories\Terms::get_instance(); + + $term = $this->tainacan_entity_factory->create_entity( + 'term', + array( + 'taxonomy' => $taxonomy->get_db_identifier(), + 'name' => 'Rock', + ), + true + ); + + $term2 = $this->tainacan_entity_factory->create_entity( + 'term', + array( + 'taxonomy' => $taxonomy->get_db_identifier(), + 'name' => '[Rock]', + ), + true + ); + + $terms = $Tainacan_Terms->fetch(['hide_empty' => false], $taxonomy); + $this->assertEquals(2, sizeof($terms)); + + } + + function test_brackets_2() { + + $Tainacan_Item_Metadata = \Tainacan\Repositories\Item_Metadata::get_instance(); + + $collection = $this->tainacan_entity_factory->create_entity( + 'collection', + array( + 'name' => 'teste', + 'description' => 'No description', + ), + true + ); + + $taxonomy = $this->tainacan_entity_factory->create_entity( + 'taxonomy', + array( + 'name' => 'genero', + 'description' => 'tipos de musica', + 'allow_insert' => 'yes', + 'status' => 'publish' + ), + true + ); + + $metadatum = $this->tainacan_entity_factory->create_entity( + 'metadatum', + array( + 'name' => 'metadado', + 'description' => 'descricao', + 'collection' => $collection, + 'metadata_type' => 'Tainacan\Metadata_Types\Taxonomy', + 'metadata_type_options' => [ + 'allow_new_terms' => true, + 'taxonomy_id' => $taxonomy->get_id() + ], + ), + true + ); + + $i1 = $this->tainacan_entity_factory->create_entity( + 'item', + array( + 'title' => 'item teste', + 'description' => 'adasdasdsa', + 'collection' => $collection + ), + true + ); + + $i2 = $this->tainacan_entity_factory->create_entity( + 'item', + array( + 'title' => 'item2 teste', + 'description' => 'adasdasdsa', + 'collection' => $collection + ), + true + ); + + $itemMeta1 = new \Tainacan\Entities\Item_Metadata_Entity($i1, $metadatum); + $itemMeta1->set_value('Rock'); + $itemMeta1->validate(); + $Tainacan_Item_Metadata->insert($itemMeta1); + + //$this->assertNotFalse(term_exists( 'Rock', $taxonomy->get_db_identifier() )); + // term_exists() is not to be trusted + //$this->assertFalse(term_exists( '[Rock]', $taxonomy->get_db_identifier() )); + + $itemMeta2 = new \Tainacan\Entities\Item_Metadata_Entity($i2, $metadatum); + $itemMeta2->set_value('[Rock]'); + $itemMeta2->validate(); + $Tainacan_Item_Metadata->insert($itemMeta2); + + $itemMeta1_check = new \Tainacan\Entities\Item_Metadata_Entity($i1, $metadatum); + $this->assertEquals('Rock', $itemMeta1_check->get_value()->get_name()); + + $itemMeta2_check = new \Tainacan\Entities\Item_Metadata_Entity($i2, $metadatum); + $this->assertEquals('[Rock]', $itemMeta2_check->get_value()->get_name()); + + + + } + } \ No newline at end of file