Opened 9 months ago

Closed 9 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:
Priority: normal Milestone:
Component: General Version: 3.4.1
Severity: normal Keywords:
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 (5)

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

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.

I think the workaround is pretty easy:

$terms = get_the_terms( ... );
$first_term = reset( $terms );
Version 0, edited 9 months ago by scribu (next)

comment:4 follow-up: ↓ 5   JustinSainton9 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 9 months ago by JustinSainton (previous) (diff)

comment:5 in reply to: ↑ 4   nacin9 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.

Note: See TracTickets for help on using tickets.