ID; $series = (string) get_post_meta( $id, '_recurkit_series', true ); $rule = get_post_meta( $id, '_recurkit_rule', true ); $rule = is_array( $rule ) ? $rule : array(); if ( '' !== $series ) { echo '

' . esc_html( recurkit_describe_rule( $rule ) ) . '

'; printf( '

%2$s

', esc_url( admin_url( 'edit.php?post_type=tribe_events&page=recurkit-series' ) ), esc_html__( 'Manage this series', 'recurkit' ) ); return; } wp_nonce_field( 'recurkit_repeat', 'recurkit_repeat_nonce' ); $types = (array) apply_filters( 'recurkit_rule_types', array( 'weekly' => __( 'Weekly', 'recurkit' ) ) ); $type = (string) ( $rule['type'] ?? 'weekly' ); if ( $rule && ! isset( $types[ $type ] ) ) { // A rule this site cannot edit right now (a RecurKit Pro rule while Pro is inactive): keep it untouched. printf( '', esc_attr( $type ) ); echo '

' . esc_html__( 'This event has a repeat rule that needs RecurKit Pro to edit. It is kept as it is.', 'recurkit' ) . '

'; return; } $days = array_map( 'intval', (array) ( $rule['days'] ?? array() ) ); $end = $rule['end'] ?? 'count'; $count = isset( $rule['count'] ) ? (int) $rule['count'] : 8; $until = (string) ( $rule['until'] ?? '' ); ?>

1 ) : ?>


$name ) : ?>

', esc_attr( (string) recurkit_max_occurrences() ), esc_attr( (string) $count ), esc_attr__( 'Number of occurrences', 'recurkit' ) ); ?>

', esc_attr( $until ), esc_attr__( 'Last date', 'recurkit' ) ); ?>

post_type || ! function_exists( 'tribe_events' ) ) { return; } if ( wp_is_post_revision( $post_id ) || wp_is_post_autosave( $post_id ) ) { return; } // Block editor: the REST save comes first, with the old stored rule; the Repeat box POST that follows carries what the // user just chose. So a REST save neither stores nor generates. Cron publishing a scheduled event is not REST. if ( wp_is_serving_rest_request() ) { return; } $in_series = '' !== (string) get_post_meta( $post_id, '_recurkit_series', true ); // The form only changes the stored rule; a nonce and edit rights are required for that. if ( ! $in_series && isset( $_POST['recurkit_repeat_nonce'] ) && current_user_can( 'edit_post', $post_id ) && wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['recurkit_repeat_nonce'] ) ), 'recurkit_repeat' ) ) { $raw = isset( $_POST['recurkit'] ) && is_array( $_POST['recurkit'] ) ? wp_unslash( $_POST['recurkit'] ) : array(); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- every field is validated in recurkit_sanitize_rule(). $stored = get_post_meta( $post_id, '_recurkit_rule', true ); $keep = isset( $raw['keep'] ) && is_string( $raw['keep'] ) && is_array( $stored ) && ( $stored['type'] ?? '' ) === $raw['keep']; $rule = $keep ? $stored : recurkit_sanitize_rule( $raw ); if ( $rule ) { update_post_meta( $post_id, '_recurkit_rule', $rule ); } else { delete_post_meta( $post_id, '_recurkit_rule' ); } } $rule = get_post_meta( $post_id, '_recurkit_rule', true ); if ( ! $in_series && is_array( $rule ) && in_array( $post->post_status, array( 'publish', 'private' ), true ) ) { recurkit_generate_series( $post_id, $rule ); } } add_action( 'wp_after_insert_post', 'recurkit_on_save', 20, 2 );