WordPress.org

Make WordPress Core

Opened 20 months ago

Closed 20 months ago

Last modified 7 months ago

#21608 closed defect (bug) (invalid)

get_the_terms() returns an array with keys that are not starting from 0

Reported by: boryanka Owned by:
Milestone: Priority: normal
Severity: normal Version: 3.4.1
Component: Taxonomy Keywords:
Focuses: Cc:

Description

This is easy to reproduce. You need a custom post type (in my case 'events') and a custom taxonomy (in my case 'eventtype').

When I try to retrieve the names of the eventtypes associated with the current event it gives back an array. The issue is that the key of each array line is the ID of the term. Instead of starting from 0.

The code:

$terms = get_the_terms( $post->ID, 'eventtype' );

The output:

array(1) {
  [6]=>
  object(stdClass)#249 (10) {
    ["term_id"]=>
    string(1) "6"
    ["name"]=>
    string(5) "Event"
    ["slug"]=>
    string(5) "event"
    ["term_group"]=>
    string(1) "0"
    ["term_taxonomy_id"]=>
    string(1) "6"
    ["taxonomy"]=>
    string(9) "eventtype"
    ["description"]=>
    string(0) ""
    ["parent"]=>
    string(1) "0"
    ["count"]=>
    string(1) "1"
    ["object_id"]=>
    string(3) "182"
  }
}

Change History (9)

comment:1 markoheijnen20 months ago

As far as I can tell that is default behaviour. As you can see the number is the term_id

comment:2 boryanka20 months ago

Yes, maybe it is, but what would you do if you had let's say 5 terms for this post and you only wanted to list the first or last one?

There are ways to do it, of course - workarounds.

comment:3 scribu20 months ago

I think the workaround is pretty easy:

$terms = get_the_terms( ... );
$first_term = reset( $terms );
$last_term = end( $terms );
Last edited 20 months ago by scribu (previous) (diff)

comment:4 follow-up: JustinSainton20 months ago

Or use array_values(). Surely the benefits of having the $term_id listed far outweigh the issues of indexing you're describing. Not only that, but changing the behavior would undoubtedly break countless plugins that rely on the current behavior.

Last edited 20 months ago by JustinSainton (previous) (diff)

comment:5 in reply to: ↑ 4 nacin20 months ago

  • Milestone Awaiting Review deleted
  • Resolution set to invalid
  • Status changed from new to closed

Replying to JustinSainton:

Or use array_values(). Surely the benefits of having the $term_id listed far outweigh the issues of indexing you're describing. Not only that, but changing the behavior would undoubtedly break countless plugins that rely on the current behavior.

Indeed.

comment:6 SergeyBiryukov10 months ago

#24562 was marked as a duplicate.

comment:7 SergeyBiryukov10 months ago

  • Component changed from General to Taxonomy

comment:8 leedo10 months ago

Perhaps the docs should be updated to reflect this?

comment:9 dcavins7 months ago

I noticed the behavior mentioned in this ticket, but only on the front end. When I use get_the_terms in the WP admin area, the array looks like this:

Array
(
    [0] => stdClass Object
        (
            [term_id] => 1660
            [name] => Bonner County
            [slug] => bonner-county-idaho
            [term_group] => 0
            [term_taxonomy_id] => 1755
            [taxonomy] => geographies
            [description] => 05000US16017
            [parent] => 841
            [count] => 0
        )
)

I don't know if there are disadvantages, but wp_get_object_terms returns an array with keys of 0, 1, and so on, in both the front end and admin area, if that's the preferred behavior.

Last edited 7 months ago by dcavins (previous) (diff)
Note: See TracTickets for help on using tickets.