Instead of taking meta values from get_post_meta function take it from $postarr array because when initial publishing of the post there isn’t any values for event_datestart and venue_name in database and it returns empty string.
Updated Code :
function set_event_title( $data , $postarr ) {
if($data['post_type'] == 'event') {
$getdate = $postarr['event_datestart']; // Replace event_datestart with the input field name of event_datestart post meta.
$dateformat = new DateTime($getdate);
$date = $dateformat->format( 'm-d-Y' );
$event_venue = $postarr['venue_name']; // Replace venue_name with the input field name of venue_name post meta.
$event_title = $event_venue . ' - ' . $date;
$post_slug = sanitize_title_with_dashes ($event_title,'','save');
$post_slugsan = sanitize_title($post_slug);
$data['post_title'] = $event_title;
$data['post_name'] = $post_slugsan;
}
return $data;
}
add_filter( 'wp_insert_post_data' , 'set_event_title' , '99', 2 );
For more information see this page.