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;
}
}