Skip to content

Commit 199b172

Browse files
committed
Taxonomy: Ensure term_exists respects $parent_term when $term is an integer.
This change updates `term_exists` by ensuring that any numeric value passed as the `$parent_term` argument is passed to the subsequent `get_terms` call when the `$term` argument is an integer. This change includes unit tests to validate the fix. Props spacedmonkey, lopo, lgadzhev, hugod, thehercules, nickbrazilian, audrasjb, vijendrajat, sachinrajcp123, bobbyleenoblestudios. Fixes #55358. git-svn-id: https://develop.svn.wordpress.org/trunk@60676 602fd350-edb4-49c9-b593-d223f7449a82
1 parent 1b9152a commit 199b172

File tree

2 files changed

+153
-4
lines changed

2 files changed

+153
-4
lines changed

src/wp-includes/taxonomy.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1630,6 +1630,10 @@ function term_exists( $term, $taxonomy = '', $parent_term = null ) {
16301630
*/
16311631
$defaults = apply_filters( 'term_exists_default_query_args', $defaults, $term, $taxonomy, $parent_term );
16321632

1633+
if ( ! empty( $taxonomy ) && is_numeric( $parent_term ) ) {
1634+
$defaults['parent'] = (int) $parent_term;
1635+
}
1636+
16331637
if ( is_int( $term ) ) {
16341638
if ( 0 === $term ) {
16351639
return 0;
@@ -1642,10 +1646,6 @@ function term_exists( $term, $taxonomy = '', $parent_term = null ) {
16421646
return null;
16431647
}
16441648

1645-
if ( ! empty( $taxonomy ) && is_numeric( $parent_term ) ) {
1646-
$defaults['parent'] = (int) $parent_term;
1647-
}
1648-
16491649
$args = wp_parse_args( array( 'slug' => sanitize_title( $term ) ), $defaults );
16501650
$terms = get_terms( $args );
16511651
if ( empty( $terms ) || is_wp_error( $terms ) ) {

tests/phpunit/tests/term/termExists.php

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,4 +401,153 @@ public function test_term_exists_unknown() {
401401
$this->assertNull( term_exists( '' ) );
402402
$this->assertNull( term_exists( null ) );
403403
}
404+
405+
/**
406+
* @ticket 55358
407+
* @covers ::term_exists()
408+
*/
409+
public function test_term_exists_with_numeric_parent_term() {
410+
register_taxonomy(
411+
'foo',
412+
'post',
413+
array(
414+
'hierarchical' => true,
415+
)
416+
);
417+
418+
$parent_term = self::factory()->term->create(
419+
array(
420+
'taxonomy' => 'foo',
421+
)
422+
);
423+
424+
$child_term = self::factory()->term->create(
425+
array(
426+
'taxonomy' => 'foo',
427+
'parent' => $parent_term,
428+
'slug' => 'child-term',
429+
)
430+
);
431+
432+
// Test with numeric parent_term as integer
433+
$found = term_exists( 'child-term', 'foo', $parent_term );
434+
$this->assertIsArray( $found );
435+
$this->assertEquals( $child_term, $found['term_id'] );
436+
437+
// Test with numeric parent_term as string
438+
$found = term_exists( 'child-term', 'foo', (string) $parent_term );
439+
$this->assertIsArray( $found );
440+
$this->assertEquals( $child_term, $found['term_id'] );
441+
442+
_unregister_taxonomy( 'foo' );
443+
}
444+
445+
/**
446+
* @ticket 55358
447+
* @covers ::term_exists()
448+
*/
449+
public function test_term_exists_with_non_numeric_parent_term() {
450+
register_taxonomy(
451+
'foo',
452+
'post',
453+
array(
454+
'hierarchical' => true,
455+
)
456+
);
457+
458+
$parent_term = self::factory()->term->create(
459+
array(
460+
'taxonomy' => 'foo',
461+
)
462+
);
463+
464+
$child_term = self::factory()->term->create(
465+
array(
466+
'taxonomy' => 'foo',
467+
'parent' => $parent_term,
468+
'slug' => 'child-term',
469+
)
470+
);
471+
472+
// Test with non-numeric parent_term (should not set parent filter)
473+
$found = term_exists( 'child-term', 'foo', 'not-numeric' );
474+
$this->assertIsArray( $found );
475+
$this->assertEquals( $child_term, $found['term_id'] );
476+
477+
// Test with null parent_term (should not set parent filter)
478+
$found = term_exists( 'child-term', 'foo', null );
479+
$this->assertIsArray( $found );
480+
$this->assertEquals( $child_term, $found['term_id'] );
481+
482+
_unregister_taxonomy( 'foo' );
483+
}
484+
485+
/**
486+
* @ticket 55358
487+
* @covers ::term_exists()
488+
*/
489+
public function test_term_exists_with_empty_taxonomy_and_numeric_parent() {
490+
register_taxonomy(
491+
'foo',
492+
'post',
493+
array(
494+
'hierarchical' => true,
495+
)
496+
);
497+
498+
$parent_term = self::factory()->term->create(
499+
array(
500+
'taxonomy' => 'foo',
501+
)
502+
);
503+
504+
$child_term = self::factory()->term->create(
505+
array(
506+
'taxonomy' => 'foo',
507+
'parent' => $parent_term,
508+
'slug' => 'child-term',
509+
)
510+
);
511+
512+
// Test with empty taxonomy and numeric parent_term (should not set parent filter)
513+
$found = term_exists( 'child-term', '', $parent_term );
514+
$this->assertIsString( $found );
515+
$this->assertEquals( $child_term, $found );
516+
517+
_unregister_taxonomy( 'foo' );
518+
}
519+
520+
/**
521+
* @ticket 55358
522+
* @covers ::term_exists()
523+
*/
524+
public function test_term_exists_with_wordpress_categories() {
525+
// Create a parent category
526+
$parent_cat = self::factory()->term->create(
527+
array(
528+
'taxonomy' => 'category',
529+
'name' => 'Parent Category',
530+
'slug' => 'parent-category',
531+
)
532+
);
533+
534+
// Create a child category
535+
$child_cat = self::factory()->term->create(
536+
array(
537+
'taxonomy' => 'category',
538+
'name' => 'Child Category',
539+
'slug' => 'child-category',
540+
'parent' => $parent_cat,
541+
)
542+
);
543+
544+
// Test finding child category with numeric parent
545+
$found = term_exists( 'child-category', 'category', $parent_cat );
546+
$this->assertIsArray( $found );
547+
$this->assertEquals( $child_cat, $found['term_id'] );
548+
549+
// Test finding child category with wrong parent
550+
$found = term_exists( 'child-category', 'category', 999 );
551+
$this->assertNull( $found );
552+
}
404553
}

0 commit comments

Comments
 (0)