modemlooper avatar
About Blog

WordPress Migrate Categories or Tags

2 min read
wordpress php

A couple functions that migrated categories or tags.

// Lets create our tags. We will use wp_insert_term hooked to init
function emg_add_cat_to_tags() {
	// Get all categories
	$categories = get_categories( [ 'hide_empty' => 0 ] );

	// Probably totally unnecessary, but check for empty $categories
	if ( ! $categories ) {
		return;
	}

	// Loop through the categories and create our tags
	foreach ( $categories as $category ) {
		// First make sure that there is no tag that exist with the same name
		if ( term_exists( $category->name, 'post_tag' ) ) {
			continue;
		}

		// Set our arguments for our terms from $category
		$args = [
			'description' => $category->description,
			'parent'      => 0, // We can drop this, default is 0
			'slug'        => $category->slug,
		];
		wp_insert_term( $category->name, 'post_tag', $args );
	}
}
add_action( 'init', 'emg_add_cat_to_tags' );

function emg_add_tags_to_post() {
	// Get all our posts
	$args = [
		'posts_per_page' => -1,
		'fields'         => 'ids', // Make the query lean
		// Add any additional query args here
	];
	$q = new WP_Query( $args );

	if ( ! $q->have_posts() ) {
		return;
	}

	while ( $q->have_posts() ) {
		$q->the_post();

		// Get all the categories attached to the post
		$categories = get_the_category();
		if ( ! $categories ) {
			continue;
		}

		// Get the names from the categories into an array
		$names = wp_list_pluck( $categories, 'name' );
		// Loop through the names and make sure that the post does not already has the tag attached
		foreach ( $names as $key => $name ) {
			if ( has_tag( $name ) ) {
				unset( $names[ $key ] );
			}
		}
		// Make sure we still have a valid $names array
		if ( ! $names ) {
			continue;
		}

		// Finally, attach our tags to the posts
		wp_set_post_terms(
			get_the_ID(), // Post ID
			$names, // Array of tag names to attach
			'post_tag',
			true // Only add the tags, do not override
		);
	}
	wp_reset_postdata();
}
add_action( 'template_redirect', 'emg_add_tags_to_post' );