From 722930611c51703b1d0c7f9ef1eb1d7f6ed0ce76 Mon Sep 17 00:00:00 2001 From: Scott Taylor Date: Wed, 16 Jul 2014 21:51:40 +0000 Subject: [PATCH] Avoid a race condition when multiple windows are open so that orphaned terms cannot be created by accident. Adds a unit test. Props dlh. Fixes #19205. git-svn-id: https://develop.svn.wordpress.org/trunk@29196 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/taxonomy.php | 6 +++++- tests/phpunit/tests/term.php | 12 ++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/wp-includes/taxonomy.php b/src/wp-includes/taxonomy.php index fb0dcffd42..5c7ce930e1 100644 --- a/src/wp-includes/taxonomy.php +++ b/src/wp-includes/taxonomy.php @@ -2418,7 +2418,11 @@ function wp_insert_term( $term, $taxonomy, $args = array() ) { return new WP_Error('empty_term_name', __('A name is required for this term')); } $defaults = array( 'alias_of' => '', 'description' => '', 'parent' => 0, 'slug' => ''); - $args = wp_parse_args($args, $defaults); + $args = wp_parse_args( $args, $defaults ); + + if ( $args['parent'] > 0 && ! term_exists( (int) $args['parent'] ) ) { + return new WP_Error( 'missing_parent', __( 'The selected parent term no longer exists' ) ); + } $args['name'] = $term; $args['taxonomy'] = $taxonomy; $args = sanitize_term($args, $taxonomy, 'db'); diff --git a/tests/phpunit/tests/term.php b/tests/phpunit/tests/term.php index 8f01469f75..c95cbd41e3 100644 --- a/tests/phpunit/tests/term.php +++ b/tests/phpunit/tests/term.php @@ -690,4 +690,16 @@ class Tests_Term extends WP_UnitTestCase { $this->assertEquals( $tag_id, $terms[0]->term_id ); $this->assertEquals( 'This description is even more amazing!', $terms[0]->description ); } + + /** + * @ticket 19205 + */ + function test_orphan_category() { + $cat_id1 = $this->factory->category->create(); + + wp_delete_category( $cat_id1 ); + + $cat_id2 = $this->factory->category->create( array( 'parent' => $cat_id1 ) ); + $this->assertWPError( $cat_id2 ); + } }