{"id":330219,"date":"2026-06-23T09:44:21","date_gmt":"2026-06-23T09:44:21","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/jetprayer-islamic-prayer-times\/"},"modified":"2026-06-23T12:17:28","modified_gmt":"2026-06-23T12:17:28","slug":"jetprayer","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/jetprayer\/","author":15913242,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.1","stable_tag":"1.0.1","tested":"7.0","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"JetPrayer - Islamic Prayer Times","header_author":"Mehdi Turan","header_description":"A performance-optimized, secure, and robust WordPress plugin that displays Islamic prayer times using local caching to avoid external API calls. Features gorgeous grids, sliders, tickers, and modals.","assets_banners_color":"576477","last_updated":"2026-06-23 12:17:28","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/mehdituran\/jetprayer","header_author_uri":"https:\/\/www.linkedin.com\/in\/mehdituran\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":34,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"mehdituran","date":"2026-06-23 09:43:44"},"1.0.1":{"tag":"1.0.1","author":"mehdituran","date":"2026-06-23 12:17:28"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3582982,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3582982,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3582982,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3582982,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"jetprayer\/prayer-times":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"jetprayer\/prayer-times","version":"1.0.0","title":"JetPrayer Times","category":"widgets","icon":"clock","description":"Show Islamic prayer times with cached performance and responsive styles.","supports":{"html":false},"attributes":{"layout":{"type":"string","default":"card"},"method":{"type":"string","default":""},"country":{"type":"string","default":""},"city":{"type":"string","default":""}},"textdomain":"jetprayer","editorScript":"file:.\/index.js"}},"tagged_versions":["1.0.0","1.0.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3582982,"resolution":"1","location":"assets","locale":"","width":3220,"height":1612},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3582982,"resolution":"2","location":"assets","locale":"","width":3246,"height":1708},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3582982,"resolution":"3","location":"assets","locale":"","width":1708,"height":891},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3582982,"resolution":"4","location":"assets","locale":"","width":381,"height":489},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3582982,"resolution":"5","location":"assets","locale":"","width":1019,"height":251},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3582982,"resolution":"6","location":"assets","locale":"","width":536,"height":254},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3582982,"resolution":"7","location":"assets","locale":"","width":695,"height":74},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3582982,"resolution":"8","location":"assets","locale":"","width":418,"height":635},"screenshot-9.png":{"filename":"screenshot-9.png","revision":3583236,"resolution":"9","location":"assets","locale":"","width":721,"height":641}},"screenshots":{"1":"Settings &amp; Sync configuration page \u2013 Allows setting the location (City\/Country or Coordinates), choosing calculation methods, and triggering database synchronization.","2":"Timetable CRUD Editor page \u2013 Displays cached database rows month-by-month with options to edit timings, delete entries, and search records.","3":"Layout Display Settings page \u2013 Exposes layout customization options including visibility toggles and advanced CSS controls (max width, text alignment, margins, paddings, ratios, and font families).","4":"Card layout \u2013 Exposes prayer times inside a premium, glassmorphic card design.","5":"Grid layout \u2013 Displays prayer times side-by-side in a responsive grid.","6":"Slider layout \u2013 Slides through individual prayer times in a carousel.","7":"Ticker layout \u2013 Infinite marquee scrolling text displaying today's timings.","8":"Modal layout \u2013 Displays today's summary with a button to toggle the full monthly timetable modal.","9":"Backup page \u2013 Allows downloading a complete or partial JSON backup of the plugin settings, customization values, and timings."}},"plugin_section":[],"plugin_tags":[10544,45141,10521,22598,22604],"plugin_category":[],"plugin_contributors":[268063],"plugin_business_model":[],"class_list":["post-330219","plugin","type-plugin","status-publish","hentry","plugin_tags-adhan","plugin_tags-ezan","plugin_tags-islamic","plugin_tags-namaz","plugin_tags-prayer-times","plugin_contributors-mehdituran","plugin_committers-mehdituran"],"banners":{"banner":"https:\/\/ps.w.org\/jetprayer\/assets\/banner-772x250.png?rev=3582982","banner_2x":"https:\/\/ps.w.org\/jetprayer\/assets\/banner-1544x500.png?rev=3582982","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/jetprayer\/assets\/icon-128x128.png?rev=3582982","icon_2x":"https:\/\/ps.w.org\/jetprayer\/assets\/icon-256x256.png?rev=3582982","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/jetprayer\/assets\/screenshot-1.png?rev=3582982","caption":"Settings &amp; Sync configuration page \u2013 Allows setting the location (City\/Country or Coordinates), choosing calculation methods, and triggering database synchronization."},{"src":"https:\/\/ps.w.org\/jetprayer\/assets\/screenshot-2.png?rev=3582982","caption":"Timetable CRUD Editor page \u2013 Displays cached database rows month-by-month with options to edit timings, delete entries, and search records."},{"src":"https:\/\/ps.w.org\/jetprayer\/assets\/screenshot-3.png?rev=3582982","caption":"Layout Display Settings page \u2013 Exposes layout customization options including visibility toggles and advanced CSS controls (max width, text alignment, margins, paddings, ratios, and font families)."},{"src":"https:\/\/ps.w.org\/jetprayer\/assets\/screenshot-4.png?rev=3582982","caption":"Card layout \u2013 Exposes prayer times inside a premium, glassmorphic card design."},{"src":"https:\/\/ps.w.org\/jetprayer\/assets\/screenshot-5.png?rev=3582982","caption":"Grid layout \u2013 Displays prayer times side-by-side in a responsive grid."},{"src":"https:\/\/ps.w.org\/jetprayer\/assets\/screenshot-6.png?rev=3582982","caption":"Slider layout \u2013 Slides through individual prayer times in a carousel."},{"src":"https:\/\/ps.w.org\/jetprayer\/assets\/screenshot-7.png?rev=3582982","caption":"Ticker layout \u2013 Infinite marquee scrolling text displaying today's timings."},{"src":"https:\/\/ps.w.org\/jetprayer\/assets\/screenshot-8.png?rev=3582982","caption":"Modal layout \u2013 Displays today's summary with a button to toggle the full monthly timetable modal."},{"src":"https:\/\/ps.w.org\/jetprayer\/assets\/screenshot-9.png?rev=3583236","caption":"Backup page \u2013 Allows downloading a complete or partial JSON backup of the plugin settings, customization values, and timings."}],"raw_content":"<!--section=description-->\n<p>JetPrayer is a performance-first, modern, and highly customizable WordPress plugin designed to display Islamic prayer times. Unlike standard prayer time plugins that fetch timings via slow, external API calls on every page load, JetPrayer syncs the entire year's timetable with the AlAdhan API and caches it directly in your local WordPress database. This guarantees a blazing-fast frontend loading speed of 0ms external latency, saving server resources and eliminating API quota limits.<\/p>\n\n<p>JetPrayer includes a beautiful, premium visual style engine with support for five interactive layouts (Cards, Responsive Grid, Dynamic Slider, Ticker, and Trigger Modal) and a complete customization panel.<\/p>\n\n<h3>3rd Party Service Integration<\/h3>\n\n<p>This plugin relies on the external, 3rd party service <strong>AlAdhan API<\/strong> to fetch and synchronize Islamic prayer times for your target locations.\n*   <strong>Service URL<\/strong>: https:\/\/aladhan.com \/ https:\/\/api.aladhan.com\n*   <strong>Terms of Service<\/strong>: https:\/\/aladhan.com\/credits-and-terms\n*   <strong>Data Sent<\/strong>: The plugin makes remote HTTP requests sending only the location credentials (city name\/country name or latitude\/longitude coordinates), calculation method ID, Asr school, and year. No personal user data, IP addresses, or visitor tracking data is transmitted to the external service.<\/p>\n\n<h3>Features<\/h3>\n\n<ul>\n<li><strong>0ms Latency Caching<\/strong>: The plugin works entirely offline on the frontend, retrieving values from a dedicated database table.<\/li>\n<li><strong>5 Gorgeous Layouts<\/strong>: Select between Card, Grid, Slider, Ticker, and Trigger Modal layouts.<\/li>\n<li><strong>Full Customization (Displays Tab)<\/strong>: Dynamically toggle prayer rows and customize layout dimensions, text alignments, padding, margins, ratios, and font-families separately for each layout.<\/li>\n<li><strong>Auto-Detect &amp; Country-Grouped Switcher<\/strong>: Dynamically group synced cities by country in frontend dropdowns. Automatically resolves calculations for identical cities under different timing methods (e.g. Istanbul Diyanet vs. Istanbul MWL) and uses visitor IP geolocation to auto-select the closest synced city based on distance.<\/li>\n<li><strong>Timetable CRUD Editor<\/strong>: Manually view, edit, or customize individual prayer timings day-by-day directly in the database manager.<\/li>\n<li><strong>AlAdhan API Sync<\/strong>: Sync location-based calculation methods (including Diyanet Turkey, Shia Jafari, Makkah, ISNA, and more).<\/li>\n<li><strong>Bulk Add &amp; Sync<\/strong>: Import and synchronize multiple cities and countries in bulk using a simple JSON file format, complete with real-time progress logging and cancellation controls.<\/li>\n<li><strong>Gutenberg Block &amp; Elementor Widget Integration<\/strong>: Drag-and-drop the JetPrayer block (Gutenberg) or the native \"JetPrayer - Prayer Times\" widget (Elementor) into your editor, or use standard shortcodes.<\/li>\n<\/ul>\n\n<h3>Shortcodes<\/h3>\n\n<p>JetPrayer provides a highly flexible shortcode with styling and layout parameters:<\/p>\n\n<ul>\n<li><code>[jetprayer layout=\"card\"]<\/code> - Displays the prayer times inside a premium, centralized card.<\/li>\n<li><code>[jetprayer layout=\"grid\"]<\/code> - Renders the prayer times in a responsive grid layout.<\/li>\n<li><code>[jetprayer layout=\"slider\"]<\/code> - Puts prayer times in a touch-friendly dynamic slider\/carousel.<\/li>\n<li><code>[jetprayer layout=\"ticker\"]<\/code> - Creates an infinite scrolling ticker marquee, perfect for headers or announcements.<\/li>\n<li><code>[jetprayer layout=\"modal\"]<\/code> - Renders today's card layout with a button that triggers a modal popup displaying the full monthly timetable.<\/li>\n<\/ul>\n\n<h3>Attributes<\/h3>\n\n<ul>\n<li><code>layout<\/code>: The layout format. Options: <code>card<\/code> (default), <code>grid<\/code>, <code>slider<\/code>, <code>ticker<\/code>, <code>modal<\/code>.<\/li>\n<li><code>city<\/code>: Specify the city name (e.g. <code>city=\"Istanbul\"<\/code>). You can also specify a comma-separated list of multiple cities (e.g. <code>city=\"Istanbul,Ankara,Izmir\"<\/code>) to limit the frontend city switcher dropdown option list. If omitted, the alphabetically first synced city for the resolved country will be loaded.<\/li>\n<li><code>country<\/code>: Specify the country name (e.g. <code>country=\"Turkey\"<\/code>). If omitted, the globally synced default country or the first synced record in the database will be resolved.<\/li>\n<li><code>method<\/code>: Override the default calculation method (from Settings &amp; Sync) for this shortcode\/widget only. Use the AlAdhan Method ID, e.g. <code>method=\"13\"<\/code> for Diyanet Turkey or <code>method=\"4\"<\/code> for Umm Al-Qura, Makkah. Use <code>method=\"all\"<\/code> or <code>method=\"any\"<\/code> to automatically query and resolve whichever calculation method is synced for the target location in the database. Leave empty\/omit to use the default.<\/li>\n<li><code>date<\/code>: Select the target date. Options: <code>today<\/code> (default), <code>tomorrow<\/code>, or a specific custom date in <code>YYYY-MM-DD<\/code> format (e.g. <code>date=\"2026-06-25\"<\/code>).<\/li>\n<\/ul>\n\n<h3>Gutenberg Block &amp; Elementor Widget<\/h3>\n\n<p>The same <code>layout<\/code>, <code>method<\/code>, and <code>date<\/code> options are available as visual dropdown controls in both the Gutenberg block (\"JetPrayer Times\") and the Elementor widget (\"JetPrayer - Prayer Times\", under the \"JetPrayer\" category) \u2014 no shortcode typing required.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the entire <code>jetprayer<\/code> folder to the <code>\/wp-content\/plugins\/<\/code> directory, or upload the <code>jetprayer.zip<\/code> file via the WordPress plugin uploader.<\/li>\n<li>Activate the plugin through the 'Plugins' menu in WordPress.<\/li>\n<li>Navigate to the <strong>JetPrayer<\/strong> menu in your WordPress dashboard.<\/li>\n<li>Configure your location settings (City\/Country or Latitude\/Longitude) and Calculation Method.<\/li>\n<li>Save settings and click the <strong>Sync Entire Year Now<\/strong> button to populate the database cache.<\/li>\n<li>Insert the shortcode, Gutenberg block, or Elementor widget into any page or widget.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"how%20does%20the%20caching%20mechanism%20work%3F\"><h3>How does the caching mechanism work?<\/h3><\/dt>\n<dd><p>When you configure settings and click \"Sync\", JetPrayer downloads all 365 days of prayer timings for your selected method and location from the AlAdhan API. It stores this data in a custom MySQL table (<code>wp_jetprayer_times<\/code>). The front end queries this local table, resulting in instantaneous page load times without any external HTTP calls.<\/p><\/dd>\n<dt id=\"why%20is%20jafari%20calculation%20method%20id%20saved%20as%200%20in%20the%20database%3F\"><h3>Why is Jafari calculation method ID saved as 0 in the database?<\/h3><\/dt>\n<dd><p>The plugin uses the official calculation method IDs defined by the AlAdhan API. In the API's standard, Shia Ithna-Ashari (Jafari) is mapped to ID <code>0<\/code> (e.g. Diyanet Turkey is <code>13<\/code>, Umm Al-Qura is <code>4<\/code>). Saving as <code>0<\/code> is correct and intended. If you select another method, it will be saved with its respective ID.<\/p><\/dd>\n<dt id=\"why%20do%20i%20get%20a%20429%20too%20many%20requests%20error%20when%20syncing%3F\"><h3>Why do I get a 429 Too Many Requests error when syncing?<\/h3><\/dt>\n<dd><p>The plugin features a 60-second rate limiter transient for the sync action. This is to protect the AlAdhan API and your website server from rate limit bans. Please wait 1 minute before running another synchronization.<\/p><\/dd>\n<dt id=\"are%20custom%20manual%20edits%20preserved%20during%20a%20sync%3F\"><h3>Are custom manual edits preserved during a sync?<\/h3><\/dt>\n<dd><p>Yes! If you manually edit prayer times in the CRUD Database Editor, the row is marked as <code>is_custom = 1<\/code>. During a normal API sync, custom rows are locked and will not be overwritten by AlAdhan API data, preserving your manual adjustments.<\/p><\/dd>\n<dt id=\"what%20is%20the%20default%20location%20and%20how%20do%20i%20change%20it%3F\"><h3>What is the default location and how do I change it?<\/h3><\/dt>\n<dd><p>The default location is the city\/country or coordinates configured and last synced in the \"Settings &amp; Sync\" dashboard. This is saved as the default options values in the database, and the shortcode <code>[jetprayer]<\/code> will display this location by default. If you sync multiple locations, you can change the default location anytime by entering its details in the settings form and clicking \"Sync\".<\/p><\/dd>\n<dt id=\"how%20does%20the%20bulk%20add%20%26%20sync%20feature%20work%3F\"><h3>How does the Bulk Add &amp; Sync feature work?<\/h3><\/dt>\n<dd><p>In the Settings &amp; Sync panel, click the \"Bulk Add &amp; Sync\" button. You can upload a JSON file containing a list of countries and cities. The plugin supports three formats:\n1. <strong>Simple City List<\/strong>: A list of cities (e.g. <code>[\"Istanbul\", \"Ankara\"]<\/code>) which uses the form's default method and year.\n2. <strong>Custom Per-City<\/strong>: Specifying a custom calculation method ID and year immediately following each city.\n3. <strong>Grouped with Single Method\/Year<\/strong>: A list of multiple cities followed by a single method and year at the end, which automatically applies those settings to all preceding cities in the group (e.g. <code>[\"Madrid\", \"Barcelona\", \"3\", \"2026\"]<\/code>).\nThe plugin will download and cache all timings sequentially with real-time progress log output.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Added Backup tab to allow downloading Partial (settings, custom timings, and locations metadata) or Full (all timings cache) JSON backups.<\/li>\n<li>Implemented memory-safe Chunked Streaming architecture for Full Backups to prevent server timeouts and RAM limits.<\/li>\n<li>Added mobile responsive CSS overrides to keep layout width and centering stable on mobile devices, regardless of custom max-width settings.<\/li>\n<li>Added horizontal scroll support to monthly timetable modal on mobile screens.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release. Features Card, Grid, Slider, Ticker, and Modal layouts.<\/li>\n<li>Includes Settings &amp; Sync panel with AlAdhan API sync and 60-second rate limit protection.<\/li>\n<li>Displays tab allowing layout toggles, visibility controls, and advanced CSS customization.<\/li>\n<li>Country-grouped frontend switcher with automatic IP distance-based closest location auto-detection.<\/li>\n<li>Timetable CRUD Editor Database Manager with custom row locks on sync.<\/li>\n<li>Gutenberg Block, native Elementor widget, and responsive shortcode implementations.<\/li>\n<li>REST API timings endpoints optimized with recursive UTF-8 sanitization and exception-safe try\/catch handlers.<\/li>\n<\/ul>","raw_excerpt":"A performance-optimized, secure, and highly customizable WordPress plugin to display Islamic prayer times using local database caching.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/330219","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=330219"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/mehdituran"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=330219"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=330219"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=330219"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=330219"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=330219"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=330219"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}