prefix . self::META; } public static function render(): void { $page = Request::page(); if ( 'abientot' !== $page && 0 !== strpos( $page, 'abientot-' ) ) { return; } if ( ! current_user_can( 'abientot_manage_settings' ) || '' !== (string) get_user_meta( get_current_user_id(), self::meta_key(), true ) || ! self::ready() ) { return; } ?>

403 ) ); } $review = 'review' === $input->key( 'choice' ); update_user_meta( get_current_user_id(), self::meta_key(), $review ? 'reviewed' : 'dismissed' ); if ( $review ) { add_filter( 'allowed_redirect_hosts', static fn( array $hosts ): array => array_merge( $hosts, array( 'wordpress.org' ) ) ); wp_safe_redirect( self::REVIEW_URL ); exit; } wp_safe_redirect( wp_get_referer() ? wp_get_referer() : admin_url( 'admin.php?page=abientot' ) ); exit; } /** Ten past, non-cancelled bookings; checked at most twice a day until reached. */ private static function ready(): bool { if ( '1' === get_option( self::READY ) ) { return true; } if ( false !== get_transient( self::READY ) ) { return false; } global $wpdb; try { $count = (int) Db::value( $wpdb->suppress_errors( true ), $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM {$wpdb->prefix}abientot_appointments a LEFT JOIN {$wpdb->prefix}abientot_booking_statuses s ON s.id=a.status_id WHERE a.end_utc<%s AND a.cancelled_at IS NULL AND COALESCE(s.slug,'') NOT IN ('cancelled','no_show')", gmdate( 'Y-m-d H:i:s' ) ) ), 'review_request_count_unavailable' ); } catch ( \RuntimeException $e ) { $count = 0; } if ( $count >= self::MIN_BOOKINGS ) { update_option( self::READY, '1', false ); return true; } set_transient( self::READY, '0', 12 * HOUR_IN_SECONDS ); return false; } }