+ // Convert taxonomy input to term IDs, to avoid ambiguity.
+ if ( isset( $post_data['tax_input'] ) ) {
+ foreach ( (array) $post_data['tax_input'] as $taxonomy => $terms ) {
+ // Hierarchical taxonomy data is already sent as term IDs, so no conversion is necessary.
+ if ( is_taxonomy_hierarchical( $taxonomy ) ) {
+ continue;
+ }
+
+ /*
+ * Assume that a 'tax_input' string is a comma-separated list of term names.
+ * Some languages may use a character other than a comma as a delimiter, so we standardize on
+ * commas before parsing the list.
+ */
+ if ( ! is_array( $terms ) ) {
+ $comma = _x( ',', 'tag delimiter' );
+ if ( ',' !== $comma ) {
+ $terms = str_replace( $comma, ',', $terms );
+ }
+ $terms = explode( ',', trim( $terms, " \n\t\r\0\x0B," ) );
+ }
+
+ $clean_terms = array();
+ foreach ( $terms as $term ) {
+ // Empty terms are invalid input.
+ if ( empty( $term ) ) {
+ continue;
+ }
+
+ $_term = get_terms( $taxonomy, array(
+ 'name' => $term,
+ 'fields' => 'ids',
+ 'hide_empty' => false,
+ ) );
+
+ if ( ! empty( $_term ) ) {
+ $clean_terms[] = intval( $_term[0] );
+ } else {
+ // No existing term was found, so pass the string. A new term will be created.
+ $clean_terms[] = $term;
+ }
+ }
+
+ $post_data['tax_input'][ $taxonomy ] = $clean_terms;
+ }
+ }
+