$value) { if ( $value instanceof ToJsonSerialize) { $result[$key] = evavel_json($value->toJsonSerialize()); } else if (is_array($value)) { $result[$key] = evavel_json($value); } else { $result[$key] = $value; } } return $result; } } if (! function_exists('evavel_with')) { function evavel_with($value, ?callable $callback = null) { return is_null($callback) ? $value : $callback($value); } } if (! function_exists('evavel_make')) { function evavel_make($name) { return \Evavel\Container\EvaContainer::singleton()->resolve($name); } } if (! function_exists('evavel_listen')) { function evavel_listen( ...$args ) { return evavel_make('events')->listen(...$args); } } if (! function_exists('evavel_event')) { function evavel_event( ...$args ) { return evavel_make('events')->dispatch(...$args); } } if (! function_exists('evavel_send_json')) { function evavel_send_json($response, $code) { wp_send_json($response, $code); } } if (! function_exists('evavel_403')) { function evavel_403() { wp_send_json([], 403); } } if (! function_exists('evavel_404')) { function evavel_404() { wp_send_json([], 404); } } if (! function_exists('evavel_tenant_create_nonce')) { function evavel_tenant_create_nonce($tenant_id) { return evavel_create_nonce('booking-ajax-tenant-'.$tenant_id); } } if (! function_exists('evavel_tenant_verify_nonce')) { function evavel_tenant_verify_nonce($nonce, $tenant_id) { return evavel_verify_nonce($nonce, 'booking-ajax-tenant-'.$tenant_id); } } function evavel_create_nonce( $term = EVAVEL_NONCE) { return wp_create_nonce($term); } function evavel_verify_nonce($nonce, $term = EVAVEL_NONCE) { return wp_verify_nonce($nonce, $term); } function evavel_ajaxurl() { $url = admin_url('admin-ajax.php'); if (!$url) { $url = '/wp-admin/admin-ajax.php'; } return $url; } if (! function_exists('evavel_site_url')) { function evavel_site_url() { if (is_multisite()){ return get_bloginfo('url'); } return site_url(); } } if (! function_exists('evavel_site_name')) { function evavel_site_name() { if (is_multisite()){ return get_bloginfo('name'); } return get_bloginfo('name'); } } if (! function_exists('evavel_view_booking_url')) { function evavel_view_booking_url($uuid) { return add_query_arg([ EVAVEL_GET_VIEW_BOOKING => $uuid], evavel_site_url()); } } if (! function_exists('evavel_action_book_now')) { /** * Generate a short URL for the book-now widget page. * * @param int $restaurant_id * @param int|null $widget_id * @param array $extra_params Optional extra params: customer, missed_call, etc. * @return string Short URL like https://site.com?arx=TOKEN or full URL as fallback */ function evavel_action_book_now($restaurant_id, $widget_id = null, $extra_params = []) { ray([ 'action' => 'evavel_action_book_now', 'restaurant_id' => $restaurant_id, 'widget_id' => $widget_id, 'extra_params' => $extra_params, ]); // Build the full original URL with all params // utm_source and type can be overridden via $extra_params $params = [ ALEXR_BOOK_NOW_VIEW => $restaurant_id, 'widget_id' => $widget_id, 'utm_source' => $extra_params['utm_source'] ?? 'whatsapp', 'type' => $extra_params['type'] ?? 'whatsapp', ]; // Merge extra params without duplicating utm_source/type unset($extra_params['utm_source'], $extra_params['type']); $params = array_merge($params, $extra_params); // Remove null/empty values $params = array_filter($params, function($value) { return $value !== null && $value !== ''; }); $original_url = evavel_site_url() . '?' . http_build_query($params); ray('original_url: ' . $original_url); // Try to shorten the URL try { $service = new \Alexr\Services\UrlShortener\UrlShortenerService(); $short_code = $service->createShortUrl($restaurant_id, $original_url); ray('short_code: ' . $short_code); if ($short_code) { return evavel_site_url() . '?' . ALEXR_SHORT_URL_PARAM . '=' . $short_code; } } catch (\Exception $e) { error_log('evavel_action_book_now shortener error: ' . $e->getMessage()); } // Fallback: return the full URL if shortener fails return $original_url; } } function evavel_edit_booking_url($uuid, $status = false) { $args = [ EVAVEL_EDIT_VIEW_BOOKING => $uuid ]; if ($status) { $args['status'] = $status; } return add_query_arg($args, evavel_site_url()); } if (! function_exists('evavel_create_wp_user')) { function evavel_create_wp_user($attrs) { $user_id = wp_insert_user($attrs); if (is_wp_error($user_id)){ return null; } if (is_multisite()) { $blogs = get_sites(); foreach( $blogs as $b ){ $blog_id = $b->blog_id; add_user_to_blog( $b->blog_id, $user_id, 'subscriber' ); } } return $user_id; } } if (! function_exists('evavel_delete_wp_user')) { function evavel_delete_wp_user($id) { require_once(ABSPATH.'wp-admin/includes/user.php'); if (is_multisite()) { require_once ABSPATH . 'wp-admin/includes/ms.php'; wpmu_delete_user(intval($id)); } else { wp_delete_user(intval($id)); } } } if (! function_exists('evavel_singular')) { function evavel_singular($name) { return \Evavel\Support\Str::singular($name); } } if (! function_exists('evavel_plural')) { function evavel_plural($name) { return \Evavel\Support\Str::plural($name); } }