post_type !== 'sp_event' ) { return $permalink; } $teams = get_post_meta( $post->ID, 'sp_team', false ); $format = get_post_meta( $post->ID, 'sp_format', true ); sort( $teams ); $seasons = get_the_terms( $post->ID, 'sp_season', true ); if ( $seasons ) { $seasons_slug = implode( '-', array_map( function( $season ) { return $season->slug; }, $seasons ) ); } else { $seasons_slug = 'no-season'; } $team_1 = isset( $teams[0] ) ? get_post( $teams[0] ) : null; $team_2 = isset( $teams[1] ) ? get_post( $teams[1] ) : null; switch ( $format ) { case 'league': case 'tournament': $format_string = 'game'; break; default: $format_string = 'event'; break; } if ( $team_1 && $team_2 ) { $permalink = home_url( $format_string . '/' . $seasons_slug . '/' . $team_1->post_name . '-' . $team_2->post_name . '/' . $post->ID ); } return $permalink; } add_filter( 'post_type_link', 'custom_event_permalink', 10, 2 ); /** * Flush rewrite rules on activation. * * @return void */ function custom_event_rewrite_flush() { custom_event_rewrite_rules(); flush_rewrite_rules(); } register_activation_hook( __FILE__, 'custom_event_rewrite_flush' ); register_deactivation_hook( __FILE__, 'flush_rewrite_rules' ); /** * Allow scheduled events to resolve on the frontend. * * @param WP_Query $query Current query. * @return void */ function custom_event_parse_request( $query ) { if ( ! $query instanceof WP_Query ) { return; } if ( is_admin() || ! $query->is_main_query() ) { return; } if ( 'sp_event' !== $query->get( 'post_type' ) ) { return; } $post_id = absint( $query->get( 'p' ) ); if ( $post_id <= 0 ) { return; } $query->set( 'post_type', 'sp_event' ); $query->set( 'p', $post_id ); $query->set( 'post_status', array( 'publish', 'future' ) ); } add_action( 'pre_get_posts', 'custom_event_parse_request' );