diff --git src/wp-includes/post.php src/wp-includes/post.php
index 500bf54a5b..c6a76082cc 100644
--- src/wp-includes/post.php
+++ src/wp-includes/post.php
@@ -4679,7 +4679,15 @@ function wp_set_post_categories( $post_ID = 0, $post_categories = array(), $appe
 	// If $post_categories isn't already an array, make it one:
 	$post_categories = (array) $post_categories;
 	if ( empty( $post_categories ) ) {
-		if ( 'post' === $post_type && 'auto-draft' !== $post_status ) {
+		/**
+		 * Filters post types (in addition to 'post') where to apply default category taxonomy term.
+		 *
+		 * @since 5.5.0
+		 *
+		 * @param array $post_types An array post types. Default to empty array.
+		 */
+		$default_category_post_types = apply_filters( 'default_category_post_types', array() );
+		if ( in_array( $post_type, array_merge( $default_category_post_types, array( 'post' ) ) ) && 'auto-draft' !== $post_status ) {
 			$post_categories = array( get_option( 'default_category' ) );
 			$append          = false;
 		} else {
diff --git tests/phpunit/tests/post.php tests/phpunit/tests/post.php
index ca18c41b0e..665660c6c9 100644
--- tests/phpunit/tests/post.php
+++ tests/phpunit/tests/post.php
@@ -1466,4 +1466,62 @@ class Tests_Post extends WP_UnitTestCase {
 		$tags = wp_get_post_tags( $post->ID, array( 'fields' => 'ids' ) );
 		$this->assertEqualSets( array( $tag_2['term_id'], $tag_3['term_id'] ), $tags );
 	}
+
+	/**
+	 * Test that setting void category for CPT associated with 'category' taxonomy has default category.
+	 *
+	 * @ticket 43516
+	 */
+	function test_set_post_category_cpt_default_category () {
+		add_filter( 'default_category_post_types', array( $this, 'filter_default_category_post_types' ) );
+
+		$term = wp_insert_term( 'Foo', 'category' );
+
+		$post_id = wp_insert_post( array( 'post_title' => 'Foo', 'post_category' => array( $term['term_id'] ) ) );
+		$post = get_post( $post_id );
+		$this->assertInternalType( 'array', $post->post_category );
+		$this->assertEquals( $term['term_id'], $post->post_category[0] );
+
+		// Reset categories
+		wp_set_post_categories( $post_id, array() );
+		$this->assertEquals( get_option( 'default_category' ), $post->post_category[0] );
+
+		register_post_type( 'cpt', array( 'taxonomies' => array( 'category' ) ) );
+		$post_id = wp_insert_post( array( 'post_title' => 'Foo', 'post_type' => 'cpt', 'post_category' => array( $term['term_id'] ) ) );
+		$post = get_post( $post_id );
+
+		// Reset categories
+		wp_set_post_categories( $post_id, array() );
+		$this->assertInternalType( 'array', $post->post_category );
+		$this->assertEquals( get_option( 'default_category' ), $post->post_category[0] );
+
+		remove_filter( 'default_category_post_types', array( $this, 'filter_default_category_post_types' ) );
+	}
+
+	/**
+	 * Test that new 'post' and CPT associated with 'category' taxonomy has default category.
+	 *
+	 * @ticket 43516
+	 */
+	function test_insert_post_cpt_default_category () {
+		add_filter( 'default_category_post_types', array( $this, 'filter_default_category_post_types' ) );
+
+		$post_id = wp_insert_post( array( 'post_title' => 'Foo' ) );
+		$post = get_post( $post_id );
+		$this->assertInternalType( 'array', $post->post_category );
+		$this->assertEquals( get_option( 'default_category' ), $post->post_category[0] );
+
+		register_post_type( 'cpt', array( 'taxonomies' => array( 'category' ) ) );
+		$post_id = wp_insert_post( array( 'post_title' => 'Foo', 'post_type' => 'cpt' ) );
+		$post = get_post( $post_id );
+		$this->assertInternalType( 'array', $post->post_category );
+		$this->assertEquals( get_option( 'default_category' ), $post->post_category[0] );
+
+		remove_filter( 'default_category_post_types', array( $this, 'filter_default_category_post_types' ) );
+	}
+
+	function filter_default_category_post_types ( $post_types ) {
+		$post_types[] = 'cpt';
+		return $post_types;
+	}
 }
