Assign a Category to Crossposted Posts

I was thinking for a long time about adding the settings for it to my plugins, but turns out that there could be a lot of customisations and it would be much better to accomplish it with a filter hook (code snippet). Please check the examples below and also the explanation how to use them.

In case you’re using a multisite version of the plugin:

add_filter( 'rudr_pre_crosspost_terms', function( $terms, $blog_id ) {

	if( 3 === $blog_id ) { // target blog ID

		$terms = array(
			// 'taxonomy name' => array( 'slug1', 'slug2', ... ),
			// in case you do not want any category to be assigned on Site 2
			'category' => array(),
			// custom taxonomy term slugs on Site 2
			'city' => array( 'athens', 'istanbul', 'dubai', 'colombo' ),
		);

	}
	return $terms;

}, 10, 2 );

We can also assign specific categories (or custom terms) depending on what were the categories of the original post.

add_filter( 'rudr_pre_crosspost_terms', function( $terms, $blog_id ) {
	
	// if our post has 'fruits-original' category
	if( in_array( 'fruits-original', $terms[ 'category' ] ) ) {
		// remove 'fruits-original'
		$terms[ 'category' ] = array_filter( $terms[ 'category' ], function( $category_slug ) {
			return $category_slug != 'fruits-original';
		} );
		// add 'fruits-target'
		$terms[ 'category' ][] = 'fruits-target';
	}
	
	// if our post has 'vegetables-original' category
	if( in_array( 'vegetables-original', $terms[ 'category' ] ) ) {
		// remove 'vegetables-original'
		$terms[ 'category' ] = array_filter( $terms[ 'category' ], function( $category_slug ) {
			return $category_slug != 'vegetables-original';
		} );
		// add 'vegetables-target'
		$terms[ 'category' ][] = 'vegetables-target';
	}
	
	return $terms;

}, 10, 2 );

For a non-multisite version of the plugin:

add_filter( 'rudr_swc_pre_crosspost_terms', function( $terms, $blog_url ){

	if( 'https://rudrastyh.com' === $blog_url ) { // target blog URL

		$terms = array(
			// 'taxonomy rest base' => array( 'ID1', 'ID2', ... ),
			// in case you do not want any category to be assigned on Site 2
			'categories' => array(),
			// term IDs on Site 2 (but for wordpress.com sites – also slugs)
			'cities' => array( 5, 15, 125, 127 ),
		);

	}
	return $terms;

}, 10, 2 );

If you don’t know where to use this piece of code, check this guide.

More details in the video below:

You can also replace one category with another one, just following this example:

add_filter( 'rudr_swc_pre_crosspost_terms', function( $terms, $blog_url ){
	
	// if our post has category with ID = 4 (we're using the ID from the target site!)
	if( isset( $terms[ 'categories' ] ) && in_array( 4, $terms[ 'categories' ] ) ) {
		// remove category with ID = 4
		$terms[ 'categories' ] = array_filter( $terms[ 'categories' ], function( $category_ID ) {
			return $category_ID != 4;
		} );
		// add category with ID = 5
		$terms[ 'categories' ][] = 5;
	}
	
	return $terms;

}, 10, 2 );

Need more help?