{"id":335753,"date":"2026-08-07T22:57:48","date_gmt":"2026-08-07T22:57:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/presto-lightweight-calendar\/"},"modified":"2026-08-07T23:15:45","modified_gmt":"2026-08-07T23:15:45","slug":"moqbo","status":"publish","type":"plugin","link":"https:\/\/nn.wordpress.org\/plugins\/moqbo\/","author":23523815,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.0.3","requires":"6.5","requires_php":"7.4","requires_plugins":null,"header_name":"Moqbo \u2013 Lightweight Calendar","header_author":"kaanlogic","header_description":"Moqbo is a lightweight calendar plugin with no frills or unnecessary bloat.","assets_banners_color":"","last_updated":"2026-08-07 23:15:45","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":75,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description"],"tags":{"1.0.0":{"tag":"1.0.0","author":"kaanlogic","date":"2026-08-07 23:15:45"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3638335,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3638335,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3638335,"resolution":"1","location":"assets","locale":"","width":1200,"height":800},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3638335,"resolution":"2","location":"assets","locale":"","width":1200,"height":800}},"screenshots":[]},"plugin_section":[],"plugin_tags":[416,4745,1486,23853,80],"plugin_category":[40,43],"plugin_contributors":[274829],"plugin_business_model":[],"class_list":["post-335753","plugin","type-plugin","status-publish","hentry","plugin_tags-calendar","plugin_tags-event-calendar","plugin_tags-events","plugin_tags-rest-api","plugin_tags-shortcode","plugin_category-calendar-and-events","plugin_category-customization","plugin_contributors-kaanlogic","plugin_committers-kaanlogic"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/moqbo\/assets\/icon-128x128.png?rev=3638335","icon_2x":"https:\/\/ps.w.org\/moqbo\/assets\/icon-256x256.png?rev=3638335","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/moqbo\/assets\/screenshot-1.png?rev=3638335","caption":""},{"src":"https:\/\/ps.w.org\/moqbo\/assets\/screenshot-2.png?rev=3638335","caption":""}],"raw_content":"<!--section=description-->\n<p>Moqbo is a WordPress event calendar plugin for managing categorized timed and all-day events. It stores events and categories in site-specific custom database tables, provides administration screens for managing that data, renders frontend calendars through shortcodes, and can expose selected read and write operations through an optional REST API.<\/p>\n\n<h3>Features<\/h3>\n\n<ul>\n<li>Does one thing, but one thing well: Managing and displaying events in a calendar<\/li>\n<li>Built to be lightweight: Uses only events and categories<\/li>\n<li>Shortcodes: Display the full calendar or the next matching event date on the frontend via <code>[moqbo]<\/code> or <code>[moqbo-getdate]<\/code> respectively<\/li>\n<li>Optional REST API: Access and create events and categories for programmatic use<\/li>\n<\/ul>\n\n<h3>Requirements<\/h3>\n\n<ul>\n<li>WordPress 6.5 or newer<\/li>\n<li>PHP 7.4 or newer<\/li>\n<\/ul>\n\n<h3>Quick Start<\/h3>\n\n<ol>\n<li>Create a category under \"Moqbo &gt; Categories\".<\/li>\n<li>Create an event under \"Moqbo &gt; Add Event\".<\/li>\n<li>Add <code>[moqbo]<\/code> to a post or page.<\/li>\n<\/ol>\n\n<p>To display the next date for a matching event, use <code>[moqbo-getdate name=\"Office Hours\"]<\/code>.<\/p>\n\n<h3>API Usage<\/h3>\n\n<p>Moqbo registers WordPress REST API routes under <code>\/wp-json\/moqbo\/v1<\/code>. Enable the API and the required endpoint methods in \"Moqbo &gt; Settings\" before calling the general events or categories endpoints.<\/p>\n\n<ul>\n<li><code>POST \/events<\/code>: Creates an event.<\/li>\n<li><code>GET \/events\/{slug}<\/code>: Returns one event by slug.<\/li>\n<li><code>GET \/events?start_date=YYYY-MM-DD&amp;end_date=YYYY-MM-DD<\/code>: Lists events within the date range. The range can span up to 366 days.<\/li>\n<li><code>POST \/categories<\/code>: Creates a category.<\/li>\n<li><code>GET \/categories<\/code>: Lists categories alphabetically.<\/li>\n<li><code>GET \/categories\/{slug}<\/code>: Returns one category by slug.<\/li>\n<\/ul>\n\n<p>The general API has no update or delete endpoints. All date and time values are interpreted in the WordPress site's timezone. Event-list date ranges are inclusive: an event is returned when it overlaps any part of the requested range.<\/p>\n\n<h4>Authentication<\/h4>\n\n<p>Enabled <code>GET<\/code> endpoints are public by default. When <code>Require token authentication for GET requests<\/code> is enabled, send the configured token as a bearer token. Enabled <code>POST<\/code> endpoints always require that token, regardless of the GET authentication setting.<\/p>\n\n<pre><code>Authorization: Bearer 0123456789abcdef0123456789abcdef01234567\n<\/code><\/pre>\n\n<p>Tokens must be 32 to 255 characters and should only be sent over HTTPS. Set <code>Content-Type: application\/json<\/code> for JSON POST bodies.<\/p>\n\n<h4>Categories<\/h4>\n\n<p>Create a category before creating events that reference it:<\/p>\n\n<pre><code>POST \/wp-json\/moqbo\/v1\/categories\nContent-Type: application\/json\nAuthorization: Bearer 0123456789abcdef0123456789abcdef01234567\n\n{\n    \"name\": \"Meetings\",\n    \"slug\": \"meetings\",\n    \"color\": \"#2271b1\"\n}\n<\/code><\/pre>\n\n<p>On success, the endpoint returns <code>201 Created<\/code> and a <code>Location<\/code> header pointing to <code>\/wp-json\/moqbo\/v1\/categories\/meetings<\/code>:<\/p>\n\n<pre><code>{\n    \"name\": \"Meetings\",\n    \"slug\": \"meetings\",\n    \"color\": \"#2271b1\",\n    \"event_count\": 0\n}\n<\/code><\/pre>\n\n<p>The <code>GET \/wp-json\/moqbo\/v1\/categories<\/code> endpoint returns an array of category objects with the same fields. Category names and slugs must be unique; <code>color<\/code> must be a six-digit hex value such as <code>#2271b1<\/code>.<\/p>\n\n<h4>Events<\/h4>\n\n<p>Create an event with an existing <code>category_slug<\/code>:<\/p>\n\n<pre><code>POST \/wp-json\/moqbo\/v1\/events\nContent-Type: application\/json\nAuthorization: Bearer 0123456789abcdef0123456789abcdef01234567\n\n{\n    \"name\": \"Team Meeting\",\n    \"slug\": \"team-meeting\",\n    \"location\": \"Conference Room\",\n    \"category_slug\": \"meetings\",\n    \"description\": \"Weekly planning meeting.\",\n    \"start_at\": \"2026-01-15 09:00:00\",\n    \"end_at\": \"2026-01-15 10:00:00\",\n    \"all_day\": false\n}\n<\/code><\/pre>\n\n<p>On success, the endpoint returns <code>201 Created<\/code> and a <code>Location<\/code> header pointing to <code>\/wp-json\/moqbo\/v1\/events\/team-meeting<\/code>:<\/p>\n\n<pre><code>{\n    \"name\": \"Team Meeting\",\n    \"slug\": \"team-meeting\",\n    \"location\": \"Conference Room\",\n    \"category_slug\": \"meetings\",\n    \"description\": \"Weekly planning meeting.\",\n    \"start_at\": \"2026-01-15 09:00:00\",\n    \"end_at\": \"2026-01-15 10:00:00\",\n    \"all_day\": false\n}\n<\/code><\/pre>\n\n<p>Use <code>GET \/wp-json\/moqbo\/v1\/events?start_date=2026-01-01&amp;end_date=2026-01-31<\/code> to retrieve matching events. It returns a JSON array of event objects in start-time order; <code>GET \/wp-json\/moqbo\/v1\/events\/team-meeting<\/code> returns one object using the same representation.<\/p>\n\n<p>All event fields in the request body are required. <code>start_at<\/code> and <code>end_at<\/code> must use <code>YYYY-MM-DD HH:MM:SS<\/code>. Timed events must end after they start. All-day events must start and end at midnight, and their end may equal their start.<\/p>\n\n<h4>Errors<\/h4>\n\n<p>WordPress REST errors are JSON objects. For example, an invalid or missing bearer token returns <code>401 Unauthorized<\/code>:<\/p>\n\n<pre><code>{\n    \"code\": \"moqbo_api_invalid_token\",\n    \"message\": \"A valid Moqbo API token is required.\",\n    \"data\": {\n        \"status\": 401\n    }\n}\n<\/code><\/pre>\n\n<p>Disabled routes return <code>403<\/code>, malformed requests and validation failures return <code>400<\/code>, and requests for unknown event or category slugs return <code>404<\/code>.<\/p>\n\n<h3>Development<\/h3>\n\n<p>Frontend development requires Node.js 18 or newer and npm:<\/p>\n\n<pre><code>npm ci\nnpm run build\n<\/code><\/pre>\n\n<p>Additional commands:<\/p>\n\n<pre><code>npm run format\nnpm run zip\n<\/code><\/pre>\n\n<p>The ZIP command requires WP-CLI with <code>dist-archive<\/code>. Test changes on a clean WordPress installation with <code>WP_DEBUG<\/code> enabled and run the official <a href=\"https:\/\/wordpress.org\/plugins\/plugin-check\/\">Plugin Check<\/a> to find any potential issues.<\/p>\n\n<h3>License<\/h3>\n\n<p>Moqbo is licensed under the <a href=\"license.txt\">GNU General Public License v3.0 or later<\/a>. Third-party notices are available in <a href=\"third-party-notices.txt\"><code>third-party-notices.txt<\/code><\/a>.<\/p>","raw_excerpt":"Moqbo is a lightweight calendar for WordPress with event admin, categories, responsive shortcodes, and an optional token-protected REST API.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/nn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/335753","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/nn.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/nn.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=335753"}],"author":[{"embeddable":true,"href":"https:\/\/nn.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/kaanlogic"}],"wp:attachment":[{"href":"https:\/\/nn.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=335753"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/nn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=335753"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/nn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=335753"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/nn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=335753"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/nn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=335753"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/nn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=335753"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}