4

When you request posts using WP API's search mechanism, it returns tags as one of the post's properties, but it is an array of tag IDs, not tag names. Is there a way to make the API include the name of the tags without making subsequent requests to the API by tag ID for each one?

tags: [
    188,
    30,
    151,
    189
]

I couldn't find any parameter in the API docs that does this, so I was thinking of creating a custom plugin to maybe filter and substitute the tag ID's for names before the response is sent back to the API caller. In that case, what action should I listen for?

5
  • Please, make more clear from start that you need a solution to implement on the server side.
    – ClemC
    Commented Oct 6, 2016 at 22:05
  • @ClemC Will do next time. But writing plugins is almost always a server side solution, no? Commented Oct 7, 2016 at 1:54
  • I mean in the context of REST API requests, you can have a WP server and a WP client....
    – ClemC
    Commented Oct 7, 2016 at 10:00
  • I ask you this because your good question will be read by futur readers having potentially the same issue as yours and for who you can bring a good solution. So make clear from start (ex: in your title) to help them understand faster your issue. Just a little optimization. :)
    – ClemC
    Commented Oct 7, 2016 at 10:11
  • Okay, I got it thanks! Please feel free to edit my title in a way that makes it easier for future developers. Thanks for the feedback. Commented Oct 8, 2016 at 0:01

2 Answers 2

7

I figured something out based on what I found at this post.

Basically I need a plugin that listens for when the REST response is about to go out. The plugin code would be similar to the following:

function ag_filter_post_json($response, $post, $context) {
    $tags = wp_get_post_tags($post->ID);
    $response->data['tag_names'] = [];

    foreach ($tags as $tag) {
        $response->data['tag_names'][] = $tag->name;
    }

    return $response;
}

add_filter( 'rest_prepare_post', 'ag_filter_post_json', 10, 3 );

It adds the tag names as a new property called tag_names. The rest of the heavy lifting is done by the wp_get_post_tags function.

0
1

The approved answer wasn't working for me in Wordpress 5.9. Changing $tags = wp_get_post_tags($post->ID); to $tags = get_the_tags($post->ID);did the trick.

Also, if you need the slug rather than the name, just update $response->data['tag_names'][] = $tag->name; to $response->data['tag_names'][] = $tag->slug;

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.