wp_set_post_terms( int $post_id, string|array $tags = '', string $taxonomy = 'post_tag', bool $append = false )

Set the terms for a post.

Description Description

See also See also

Top ↑

Parameters Parameters


(int) (Optional) The Post ID. Does not default to the ID of the global $post.


(string|array) (Optional) An array of terms to set for the post, or a string of terms separated by commas.

Default value: ''


(string) (Optional) Taxonomy name.

Default value: 'post_tag'


(bool) (Optional) If true, don't delete existing terms, just add on. If false, replace the terms with the new terms.

Default value: false

Top ↑

Return Return

(array|false|WP_Error) Array of term taxonomy IDs of affected terms. WP_Error or false on failure.

Top ↑

Source Source

File: wp-includes/post.php

function wp_set_post_terms( $post_id = 0, $tags = '', $taxonomy = 'post_tag', $append = false ) {
	$post_id = (int) $post_id;

	if ( !$post_id )
		return false;

	if ( empty($tags) )
		$tags = array();

	if ( ! is_array( $tags ) ) {
		$comma = _x( ',', 'tag delimiter' );
		if ( ',' !== $comma )
			$tags = str_replace( $comma, ',', $tags );
		$tags = explode( ',', trim( $tags, " \n\t\r\0\x0B," ) );

	 * Hierarchical taxonomies must always pass IDs rather than names so that
	 * children with the same names but different parents aren't confused.
	if ( is_taxonomy_hierarchical( $taxonomy ) ) {
		$tags = array_unique( array_map( 'intval', $tags ) );

	return wp_set_object_terms( $post_id, $tags, $taxonomy, $append );

Top ↑

Changelog Changelog

Version Description
2.8.0 Introduced.

Top ↑

User Contributed Notes User Contributed Notes

  1. Skip to note 1 content
    Contributed by Codex

    Non hierarchical term example

    For non-hierarchical terms (such as tags), you can pass either the term name or id. If you pass the id there is only one caveat: You must pass it as an integer, and it must be in an array. This is necessary because any non-array value passed will be converted to a string, which will be interpreted as a term name.

    $tag = '5'; // Wrong. This will add the tag with the *name* '5'.
    $tag = 5; // Wrong. This will also add the tag with the name '5'.
    $tag = array( '5' ); // Wrong. Again, this will be interpreted as a term name rather than an id.
    $tag = array( 5 ); // Correct. This will add the tag with the id 5.
    wp_set_post_terms( $post_id, $tag, $taxonomy );

    This function will only work on the native post type. For a taxonomy on a custom post type use wp_set_object_terms()

  2. Skip to note 2 content
    Contributed by Codex

    Hierarchical term example

    For hierarchical terms (such as categories), you must always pass the id rather than the term name to avoid confusion where there may be another child with the same name.

    To get the term id you can use:

    $term_id = term_exists( $term, $taxonomy, $parent );

    You may also need to pass by reference:

    wp_set_post_terms( $post_id, $term, &$taxonomy );

You must log in before being able to contribute a note or feedback.