diff --git a/src/wp-includes/media.php b/src/wp-includes/media.php index bc7a90ced8..4eb2886205 100644 --- a/src/wp-includes/media.php +++ b/src/wp-includes/media.php @@ -2694,11 +2694,15 @@ function adjacent_image_link( $prev = true, $size = 'thumbnail', $text = false ) * Retrieves taxonomies attached to given the attachment. * * @since 2.5.0 + * @since 4.7.0 Introduced the `$output` parameter. * * @param int|array|object $attachment Attachment ID, data array, or data object. + * @param string $output Output type. 'names' to return an array of taxonomy names, + * or 'objects' to return an array of taxonomy objects. + * Default is 'names'. * @return array Empty array on failure. List of taxonomies on success. */ -function get_attachment_taxonomies( $attachment ) { +function get_attachment_taxonomies( $attachment, $output = 'names' ) { if ( is_int( $attachment ) ) { $attachment = get_post( $attachment ); } elseif ( is_array( $attachment ) ) { @@ -2723,9 +2727,11 @@ function get_attachment_taxonomies( $attachment ) { } $taxonomies = array(); - foreach ( $objects as $object ) - if ( $taxes = get_object_taxonomies($object) ) - $taxonomies = array_merge($taxonomies, $taxes); + foreach ( $objects as $object ) { + if ( $taxes = get_object_taxonomies( $object, $output ) ) { + $taxonomies = array_merge( $taxonomies, $taxes ); + } + } return array_unique($taxonomies); } diff --git a/src/wp-includes/taxonomy.php b/src/wp-includes/taxonomy.php index 70af35a326..20ae20f611 100644 --- a/src/wp-includes/taxonomy.php +++ b/src/wp-includes/taxonomy.php @@ -181,7 +181,7 @@ function get_object_taxonomies( $object, $output = 'names' ) { if ( is_object($object) ) { if ( $object->post_type == 'attachment' ) - return get_attachment_taxonomies($object); + return get_attachment_taxonomies( $object, $output ); $object = $object->post_type; } diff --git a/tests/phpunit/tests/media/getAttachmentTaxonomies.php b/tests/phpunit/tests/media/getAttachmentTaxonomies.php index c3c7bf49a7..f94b2f1007 100644 --- a/tests/phpunit/tests/media/getAttachmentTaxonomies.php +++ b/tests/phpunit/tests/media/getAttachmentTaxonomies.php @@ -79,4 +79,23 @@ class Tests_Media_GetAttachmentTaxonomies extends WP_UnitTestCase { $this->assertSame( $expected, $found ); } + + /** + * @ticket 37368 + */ + public function test_should_respect_output_objects() { + register_taxonomy( 'wptests_tax2', 'attachment:image' ); + + $a = self::factory()->attachment->create_object( 'image.jpg', 0, array( + 'post_mime_type' => 'image/jpeg', + 'post_type' => 'attachment' + ) ); + $attachment = get_post( $a ); + + $found = get_attachment_taxonomies( $attachment, 'objects' ); + + $this->assertSame( array( 'wptests_tax2' ), array_keys( $found ) ); + $this->assertInternalType( 'object', $found['wptests_tax2'] ); + $this->assertSame( 'wptests_tax2', $found['wptests_tax2']->name ); + } } diff --git a/tests/phpunit/tests/taxonomy/getObjectTaxonomies.php b/tests/phpunit/tests/taxonomy/getObjectTaxonomies.php index afe5655fd9..2c0710d1bf 100644 --- a/tests/phpunit/tests/taxonomy/getObjectTaxonomies.php +++ b/tests/phpunit/tests/taxonomy/getObjectTaxonomies.php @@ -45,4 +45,40 @@ class Tests_Taxonomy_GetObjectTaxonomies extends WP_UnitTestCase { $this->assertSame( $expected, $found ); } + + /** + * @ticket 37368 + */ + public function test_should_return_all_attachment_taxonomies_for_attachment_object_type() { + register_taxonomy( 'wptests_tax2', 'attachment:image' ); + + $a = self::factory()->attachment->create_object( 'image.jpg', 0, array( + 'post_mime_type' => 'image/jpeg', + 'post_type' => 'attachment' + ) ); + $attachment = get_post( $a ); + + $found = get_object_taxonomies( $attachment, 'names' ); + + $this->assertSame( array( 'wptests_tax2' ), $found ); + } + + /** + * @ticket 37368 + */ + public function test_should_respect_output_objects_when_object_is_attachment() { + register_taxonomy( 'wptests_tax2', 'attachment:image' ); + + $a = self::factory()->attachment->create_object( 'image.jpg', 0, array( + 'post_mime_type' => 'image/jpeg', + 'post_type' => 'attachment' + ) ); + $attachment = get_post( $a ); + + $found = get_object_taxonomies( $attachment, 'objects' ); + + $this->assertSame( array( 'wptests_tax2' ), array_keys( $found ) ); + $this->assertInternalType( 'object', $found['wptests_tax2'] ); + $this->assertSame( 'wptests_tax2', $found['wptests_tax2']->name ); + } }