The filter you’re looking for is called wp_terms_checklist_args
and is used by wp_terms_checklist()
(which is internally called to display the category metabox).
You can use this to pre-selected specific categories (by ID) under certain circumstances as shown in this example
add_filter('wp_terms_checklist_args', 'WPSE_pre_select_categories', 10, 2);
function WPSE_pre_select_categories($args, $post_id) {
$post = get_post($post_id);
// only pre select categories for new posts
if ($post->post_status !== 'auto-draft' || $post->post_type !== 'post')
return $args;
// select categories with ID 4 and 6
$select_categories = [4, 6];
// little hack so array_merge() works if default is NULL
if (empty($args['selected_cats'])) {
$args['selected_cats'] = [];
}
// array_merge() with numerical indices only appends
// so I use array_unique() to remove any duplicates
$args['selected_cats'] = array_unique(array_merge($args['selected_cats'], $select_categories));
return $args;
}