{"id":382188,"date":"2026-10-19T07:46:22","date_gmt":"2026-10-19T07:46:22","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/coursekit\/"},"modified":"2026-10-21T11:10:30","modified_gmt":"2026-10-21T11:10:30","slug":"lektivo","status":"publish","type":"plugin","link":"https:\/\/sv.wordpress.org\/plugins\/lektivo\/","author":23572899,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.3.3","stable_tag":"1.3.3","tested":"7.1.3","requires":"7.0","requires_php":"8.3","requires_plugins":null,"header_name":"Lektivo","header_author":"Jugas IT","header_description":"Manage courses, instructors, locations, and schedules with Gutenberg blocks. Booking stays with your external provider.","assets_banners_color":"","last_updated":"2026-10-21 11:10:30","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/jugasit.com\/lektivo","header_author_uri":"https:\/\/jugasit.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":91,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.3.2":{"tag":"1.3.2","author":"ephracis","date":"2026-10-19 07:45:58","revision":3754222},"1.3.3":{"tag":"1.3.3","author":"ephracis","date":"2026-10-21 11:10:30","revision":3758194}},"upgrade_notice":{"1.3.2":"<p>Prefer Freemius updates if Lektivo still lives under coursekit\/. A manual zip installs lektivo\/ beside it; activate the new copy and delete unused coursekit\/ \u2014 Lektivo deactivates the duplicate and keeps your content.<\/p>","1.2.0":"<p>Major rename to Lektivo. Back up your site, deactivate the old plugin, activate Lektivo, and verify content before deleting the old install.<\/p>"},"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":{"lektivo\/schedule-viewer":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"lektivo\/schedule-viewer","version":"0.3.0","title":"Schedule Viewer","category":"widgets","icon":"calendar-alt","description":"Weekly class schedule for a semester, listed by day and time.","supports":{"align":["wide","full"],"html":false},"textdomain":"lektivo","attributes":{"semesterId":{"type":"integer","default":0}},"editorScript":"file:.\/index.js","style":"file:.\/style-index.css","editorStyle":"file:.\/index.css"},"lektivo\/course-list":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"lektivo\/course-list","version":"0.1.0","title":"Course List","category":"widgets","icon":"list-view","description":"Displays a list of courses for the current term by default, with optional filtering by category, difficulty, style, semester, or lifecycle (upcoming, running, past).","supports":{"align":["wide","full"],"html":false},"textdomain":"lektivo","attributes":{"columns":{"type":"integer","default":1},"showImage":{"type":"boolean","default":true},"showExcerpt":{"type":"boolean","default":true},"showDifficulty":{"type":"boolean","default":true},"showStyle":{"type":"boolean","default":true},"showPricing":{"type":"boolean","default":true},"postsPerPage":{"type":"integer","default":12},"courseCategory":{"type":"integer","default":0},"difficulty":{"type":"integer","default":0},"style":{"type":"integer","default":0},"semesterId":{"type":"integer"},"orderBy":{"type":"string","default":"title"},"groupByLifecycle":{"type":"boolean","default":false},"lifecycleFilter":{"type":"string","default":"all"},"bookingPolicy":{"type":"string","default":"always"},"showPastSection":{"type":"boolean","default":true}},"editorScript":"file:.\/index.js","style":"file:.\/style-index.css","editorStyle":"file:.\/index.css"},"lektivo\/instructor-grid":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"lektivo\/instructor-grid","version":"0.1.0","title":"Instructor Grid","category":"widgets","icon":"groups","description":"Displays a grid of instructor cards with photo, name, role, and specialties.","supports":{"align":["wide","full"],"html":false},"textdomain":"lektivo","attributes":{"columns":{"type":"integer","default":3},"showImage":{"type":"boolean","default":true},"showRole":{"type":"boolean","default":true},"showSpecialties":{"type":"boolean","default":true},"showEmail":{"type":"boolean","default":false},"postsPerPage":{"type":"integer","default":12},"orderBy":{"type":"string","default":"title"}},"editorScript":"file:.\/index.js","style":"file:.\/style-index.css","editorStyle":"file:.\/index.css"}},"tagged_versions":["1.3.2","1.3.3"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[269,6978,7114,287464,4062],"plugin_category":[40],"plugin_contributors":[287465],"plugin_business_model":[],"class_list":["post-382188","plugin","type-plugin","status-publish","hentry","plugin_tags-booking","plugin_tags-classes","plugin_tags-courses","plugin_tags-instructors","plugin_tags-schedule","plugin_category-calendar-and-events","plugin_contributors-ephracis","plugin_committers-ephracis"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/lektivo.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Lektivo is for businesses that offer courses or classes \u2014 dance studios, yoga studios, language schools, cooking classes, and similar.<\/p>\n\n<p>It adds custom post types for courses, instructors, locations, and schedules, plus Gutenberg blocks for course lists, schedule viewing, and instructor grids. Professional adds testimonials, location maps, archive filters, and an interactive timetable.<\/p>\n\n<p>Lektivo handles <strong>content and structure<\/strong>. Booking and payment stay with your external provider (dans.se, Bookeo, WooCommerce Bookings, and the like) through configurable booking URLs.<\/p>\n\n<h4>Free vs Professional<\/h4>\n\n<p><strong>Lektivo Free<\/strong> includes the course, instructor, location, and schedule post types, taxonomies, meta fields, core admin, the basic Course List and Instructor Grid blocks, and a day\/time-ordered Schedule Viewer class list. Course, instructor, location, and schedule creation is unlimited.<\/p>\n\n<p><strong>Lektivo Professional<\/strong> (a separate paid build distributed outside wordpress.org) adds:<\/p>\n\n<ul>\n<li>Interactive timetable Schedule Viewer (location panels, weekday grid, mobile day cards)<\/li>\n<li>Course and schedule archive filters (Professional only, including trials)<\/li>\n<li>Location Map block and map embeds<\/li>\n<li>Testimonials (CPT, admin meta, theme showcase support)<\/li>\n<li>Related-course and instructor-course showcase helpers for rich theme cards<\/li>\n<li>Freemius updates and priority support<\/li>\n<\/ul>\n\n<p>Style sample packs and testimonial sample data (latin-heat and other Dance lab packs) live in the companion Dance theme and are tracked as a Dance follow-up, not this plugin ZIP.<\/p>\n\n<h4>Privacy note<\/h4>\n\n<p>Lektivo uses the Freemius SDK for licensing and optional opt-in analytics. Freemius only connects after you choose to opt in or start an upgrade. The free plugin on WordPress.org does not phone home without consent.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>From <strong>Plugins \u2192 Add New<\/strong>, search for Lektivo and click Install, or upload the <code>lektivo<\/code> folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate Lektivo through the Plugins screen.<\/li>\n<li>Add courses, instructors, locations, and schedules from the Lektivo admin menus.<\/li>\n<li>Place Lektivo blocks in the block editor, or use theme templates that support Lektivo.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20lektivo%20handle%20booking%20or%20payments%3F\"><h3>Does Lektivo handle booking or payments?<\/h3><\/dt>\n<dd><p>No. Each course or schedule entry has a booking URL that links to your external booking provider.<\/p><\/dd>\n<dt id=\"are%20there%20free-plan%20creation%20limits%3F\"><h3>Are there free-plan creation limits?<\/h3><\/dt>\n<dd><p>No. The free plugin on WordPress.org lets you create as many courses, instructors, locations, and schedules as you need.<\/p><\/dd>\n<dt id=\"where%20do%20i%20get%20lektivo%20professional%3F\"><h3>Where do I get Lektivo Professional?<\/h3><\/dt>\n<dd><p>Professional is a separate paid build (interactive timetable, archive filters, location maps, testimonials, course showcases, and updates). Upgrade from the Freemius pricing screen in wp-admin after activating the plugin, or visit the product page on jugasit.com.<\/p><\/dd>\n<dt id=\"will%20upgrading%20keep%20my%20content%3F\"><h3>Will upgrading keep my content?<\/h3><\/dt>\n<dd><p>Yes. Your courses, instructors, locations, and schedules stay in place. Professional (including trials) unlocks the interactive Schedule Viewer, course and schedule archive filters, location maps, testimonials, and rich course showcase helpers. On Free, filter values in the address bar have no effect.<\/p><\/dd>\n<dt id=\"does%20the%20free%20plugin%20send%20data%20to%20freemius%20without%20asking%3F\"><h3>Does the free plugin send data to Freemius without asking?<\/h3><\/dt>\n<dd><p>No. Connection and optional analytics are opt-in. You stay in control from the Freemius screens in wp-admin.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.3.3<\/h4>\n\n<ul>\n<li>CI: <code>package:wporg-free<\/code> fails when the free ZIP contains licence or plan checks (<code>bin\/check-free-gates.php<\/code>).<\/li>\n<li>Release: <code>release:wporg<\/code> always ships our own free build from <code>package:wporg-free<\/code> and no longer downloads the Freemius-generated free ZIP; <code>bin\/freemius-download-free.php<\/code> is removed (#65).<\/li>\n<li>Schedule Viewer layout and filter controls now come from a Professional-only editor script; the free editor shows only the semester picker.<\/li>\n<li>\u201cBook now\u201d and \u201cView on Map\u201d links that open a new tab include a translated screen-reader cue \u201c(opens in a new tab)\u201d and a single visible \u2197 cue (the legacy \u201cBook now \u2192\u201d arrow is dropped so the link is not \u201cBook now \u2192 \u2197\u201d) (#62).<\/li>\n<li>Course, instructor and location card titles (and Schedule Viewer location headings) default to h2 so archives no longer skip from h1 to h3; Course List lifecycle sections use h2 with nested card h3, and static booking status no longer uses aria-live. Class-based CSS keeps the prior h3 card title size, weight and spacing so theme h2 styles do not enlarge the cards (#64).<\/li>\n<li>Pricing tier, specialty and room fields in the admin meta boxes expose programmatic labels on existing rows and on rows added with \u201cAdd Tier\u201d \/ \u201cAdd Specialty\u201d \/ \u201cAdd Room\u201d (#63).<\/li>\n<li>Course and schedule filters update results in place when JavaScript is available (URL stays shareable; result count is announced to assistive tech), keep Apply for no-JS only, group fields with a fieldset legend, keep a visible focus outline on filter controls, and the course card Show more toggle exposes aria-expanded \/ aria-controls with a 24\u00d724 hit target (#59).<\/li>\n<li>Course, location and instructor cards: thumbnails are decorative (not nameless duplicate links), each course card keeps a single permalink (title) with a visible focus style, decorative info icons are hidden from assistive technology, and the plugin ships its own <code>.screen-reader-text<\/code> styles (#61).<\/li>\n<li>Schedule Viewer timetable class cells expose weekday and time to assistive technology, title links meet a 24\u00d724 minimum hit target, sticky columns no longer cover focused links, and a \u201cSkip schedule\u201d link bypasses long timetable regions (#60).<\/li>\n<li>WordPress.org free build no longer ships licence-gated code (Guideline 5): course archive filtering, licence notices and the Course Filters \/ Location Map shortcodes are Professional-only (#65).<\/li>\n<\/ul>\n\n<h4>1.3.2<\/h4>\n\n<ul>\n<li>Previous-release \u2192 candidate-build upgrade CI job\n(<code>test:upgrade-from-previous<\/code>): installs the last GitLab Release plugin\nand Dance theme ZIPs with <code>sv_SE<\/code> and seeded content, replaces both with\nthe new builds in the same folders, asserts an active plugin, clean\ndebug.log, rendered home\/courses\/schedules, Freemius SDK <code>languages\/<\/code>\nin the production ZIP, and desktop plus 390px screenshots per style\nvariation. Dance theme ZIPs fall back to\n  tests\/fixtures\/upgrade\/ when cross-project release downloads are\nunavailable (#55).<\/li>\n<li>Automated folder-name upgrade smoke test: install under <code>coursekit\/<\/code>,\nupload the canonical <code>lektivo\/<\/code> ZIP beside it, assert a single active\nplugin, preserved course data and options, retirement notice option, and\nno PHP fatals (#55).<\/li>\n<li>Release Checklist and <code>docs\/RELEASE.md<\/code> require \u201cUpgrade test from\nprevious release passed\u201d before tagging (#55).<\/li>\n<li>Document the <code>coursekit\/<\/code> \u2192 <code>lektivo\/<\/code> upgrade path in the release\nchecklist and readme upgrade notice (#55).<\/li>\n<li>When a site still runs Lektivo from <code>wp-content\/plugins\/coursekit\/<\/code>\n(common after Freemius in-place updates from the CourseKit product name)\nand a manual zip upload installs <code>lektivo\/<\/code> beside it, the canonical\ninstall deactivates the leftover <code>coursekit\/<\/code> copy and shows an admin\nnotice so administrators can delete the unused folder. Content and\nsettings are shared WordPress data and stay intact (#55).<\/li>\n<\/ul>\n\n<h4>1.3.1<\/h4>\n\n<ul>\n<li>Localize visitor-facing weekday names on <code>sv_SE<\/code> sites: long labels\n(<code>Torsdag<\/code>), short schedule abbreviations (<code>tor<\/code>), and plural session\nforms (<code>Torsdagar<\/code>). Helpers prefer the lektivo text domain then\nWordPress <code>$wp_locale<\/code>; Schedule Viewer fallbacks no longer hard-code\nEnglish (#57).<\/li>\n<li>Ship Swedish <code>lektivo<\/code> translations (<code>languages\/lektivo-sv_SE.po<\/code> \/\n  .mo) inside the plugin ZIP so <code>sv_SE<\/code> sites (for example\nritmostudio.se) show visitor-facing strings in Swedish without a\nwordpress.org language pack after the CourseKit \u2192 Lektivo rename.\nPackaging no longer excludes the plugin <code>languages\/<\/code> tree; CI verifies\nthe ZIP contains the <code>.mo<\/code> and key visitor strings translate (#56,\nrelated lektivo-dance#71).<\/li>\n<li>Production packaging keeps <code>vendor\/freemius\/wordpress-sdk\/languages\/<\/code> in\nthe Freemius ZIP (<code>.distignore<\/code> no longer strips nested <code>languages<\/code>\npaths) and CI fails if that folder is missing from the built ZIP (#53).<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>Shortcode wrappers for every Lektivo block so Classic Editor and HTML\nwidgets can embed the same markup as Gutenberg: <code>[lektivo_course_list]<\/code>,\n  [lektivo_instructor_grid], <code>[lektivo_schedule_viewer]<\/code>,\n  [lektivo_course_filters], and <code>[lektivo_location_map]<\/code>. Professional\ngates match the blocks (filters stay empty without a licence; Schedule\nViewer keeps the free class list vs Pro timetable). Use\n  layout=\"compact\" on the schedule shortcode for the compact day-card\nlist (#17).<\/li>\n<li>Course List <strong>Term<\/strong> control: defaults to the current bookable semester\n(same <code>Helpers::get_current_semester()<\/code> logic as Schedule Viewer), with\noptions for all terms or a fixed semester. Course cards show day and time\nfrom the schedule in the displayed term. Blocks saved before this keep\nlisting all terms until changed (#38).<\/li>\n<li>Schedule Viewer block settings for <strong>Layout<\/strong> (Responsive vs Compact list)\nand <strong>Show filters<\/strong>, so a page can embed the week as day cards on every\nscreen size without the filter form. Existing embeds keep the responsive\ntimetable and filters (#41).<\/li>\n<li>Lektivo always uses the site language (Settings \u2192 General) for its own\nstrings \u2014 in wp-admin, the block editor, REST (including <code>_locale=user<\/code>),\nand on the front end \u2014 even when the logged-in user\u2019s profile language\ndiffers. Language-pack <code>.mo<\/code> files under <code>wp-content\/languages\/plugins\/<\/code>\nare rewritten onto the site locale the same way as editor Jed JSON. A\ncheck ensures the Swedish PO has no empty or fuzzy translations.\nTheme-owned copy such as schedule headings stays in Lektivo Dance (#46).<\/li>\n<li>The Freemius Account page is no longer listed under Courses, so customers\ndo not see the Jugas IT owner's details and keys. Activation now returns\nyou to the Courses list, and the licence notices and Plugins row no longer\nlink to the Account page (#50).<\/li>\n<li>Course and schedule archive filters (<code>lektivocf_*<\/code> \/ <code>lektivosf_*<\/code> URL\nparams and filter controls) require Lektivo Professional, including\nFreemius trials. Free sites ignore filter values typed into the address by\nhand (#15).<\/li>\n<li>Course archive filter query params use the <code>lektivocf_*<\/code> prefix (aligned\nwith schedule <code>lektivosf_*<\/code>). Bookmarked or shared links that still use\n  ckf_* keep working as aliases on Professional; new filter forms emit only\n  lektivocf_* (#40).<\/li>\n<li>Admin list table column keys for difficulty colour \/ sort order and\nsemester booking-opens use the <code>lektivo_<\/code> prefix instead of <code>ck_<\/code> (#40).\nSites with custom CSS that targeted those admin column classes need the\nsame rename (<code>ck_color<\/code> \u2192 <code>lektivo_color<\/code>, <code>ck_sort_order<\/code> \u2192\n  lektivo_sort_order, <code>ck_booking_opens<\/code> \u2192 <code>lektivo_booking_opens<\/code>).\nFront-end <code>lektivo-*<\/code> \/ <code>wp-block-lektivo-*<\/code> class names and\n  --lektivo-diff-* CSS custom properties are unchanged.<\/li>\n<li>JavaScript translation files named after a script handle\n(<code>lektivo-{locale}-{handle}.json<\/code>) are rewritten onto the site language the\nsame way as the MD5 file-path JSON names, so Swedish (or any site locale)\nloads for every Jed file style (#52).<\/li>\n<li>Semester admin form field IDs use the <code>lektivo-semester-*<\/code> prefix instead of\nthe leftover <code>ck-semester-*<\/code> CourseKit IDs. Term meta keys are unchanged, so\nexisting semester data is unaffected (#40).<\/li>\n<li>Course archive cards use the same booking button markup and default booking\npolicy as the Course List block and <code>[lektivo_course_list]<\/code> shortcode, so a\ncustom course page and the archive show the same book \/ status state for the\nsame courses without extra configuration (#45).<\/li>\n<li>Schedule Viewer no longer forces the page wider than a phone screen:\nfilters stack below 600 px, day labels sit above class times on narrow\nviewports, and long course or instructor names wrap instead of truncating\n(#39).<\/li>\n<li>Tag pipelines on the canonical GitLab project fail again when Freemius\ncredentials are missing, after the project path rename to\n  jugasit\/lektivo\/lektivo (forks still dry-run).<\/li>\n<\/ul>\n\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>Updated Freemius SDK to the latest version.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>WordPress.org free packaging and gated SVN deploy: local free ZIP\n(<code>bin\/package-free-plugin.sh<\/code> \/ <code>package:wporg-free<\/code>), Freemius free\ndownload helper, <code>release:wporg<\/code> (skips cleanly without\n  WPORG_SVN_USERNAME \/ <code>WPORG_SVN_PASSWORD<\/code>), Plugin Check job, and\n  .wordpress-org\/ asset checklist. Pro Schedule Viewer UI lives in\n  ScheduleViewerPremium.php so free ZIPs ship without locked Pro code.<\/li>\n<li>Idempotent CourseKit \u2192 Lektivo legacy data migration\n(<code>Lektivo\\Migration\\LegacyCourseKit<\/code>) and deprecated Dance-theme\ncompatibility layer (<code>coursekit\/*<\/code> block aliases, <code>coursekit_*<\/code>\nhelpers, <code>ck_*<\/code> template hierarchy fallbacks).<\/li>\n<li>Swedish stopgap language-pack CI artifact (<code>dist\/lektivo-sv_SE.zip<\/code>)\nbuilt from <code>i18n\/lektivo-sv_SE.po<\/code> for drop-in under\n  wp-content\/languages\/plugins\/ until translate.wordpress.org ships\ntranslations. Not bundled in the plugin ZIP.<\/li>\n<li>Renamed the free plugin to <strong>Lektivo<\/strong> (slug <code>lektivo<\/code>, namespace\n  Lektivo\\, prefixes <code>lektivo_<\/code> \/ <code>_lektivo_<\/code> \/ <code>lektivo\/<\/code>).<\/li>\n<li>Expand Professional surface for the first public free release: Course\nFilters, Location Map, schedule filter\/grid helpers, FilterForm,\nTestimonials CPT\/admin meta, and related\/instructor course showcase\nhelpers (<code>src\/Pro\/CourseShowcase.php<\/code>) ship only in <code>@fs_premium_only<\/code>\npaths stripped from the free ZIP. Free keeps CPTs (except testimonials),\ntaxonomies, meta, core admin, Course List, Instructor Grid, and a plain\nday\/time-ordered Schedule Viewer list with no upgrade nag.<\/li>\n<li>Plugin Check (<code>lint:plugin-check<\/code>) runs with a 512M PHP\/WP-CLI memory\nlimit and fails the pipeline on PCP ERROR or WARNING rows.<\/li>\n<li>Release tooling moved to <code>tools\/release\/<\/code> (autoload-dev only; not\nshipped in the plugin ZIP).<\/li>\n<li>Free Schedule Viewer renders the full class-card list without an\nupgrade nag; the interactive grid remains premium-only code.<\/li>\n<li>Course pricing meta box: new tier rows use a monotonically increasing\n  data-next-index so remove-then-add no longer reuses a POST index and\nsilently drops a tier on save.<\/li>\n<li>Activation with CourseKit inactive migrates and flushes rewrite rules in the\nactivation hook so front-end course URLs work without an admin page load.\nCoexistence detection uses <code>CourseKit\\Plugin<\/code> \/\n  is_plugin_active( 'coursekit\/coursekit.php' ) (not the compat\n  coursekit_fs() stand-in). Coexistence early-return sets the rewrite flush\nflag so re-activating then deactivating CourseKit still refreshes permalinks.<\/li>\n<li><code>lektivo_render_course_grid()<\/code> (and other hard-coded block wrappers) route\nclass lists through <code>lektivo_classes()<\/code> so Dance still sees\n  wp-block-coursekit-* twins until the theme MR lands.<\/li>\n<li>Free ZIP excludes all dotfiles via <code>.distignore<\/code> <code>.*<\/code> (fixes Plugin Check\nERROR for shipped <code>.eslintignore<\/code>) and ships <code>composer.json<\/code> alongside\n  vendor\/. Plugin Check CI fails on CSV rows matching\n  line,column,(ERROR|WARNING), (<code>set -o pipefail<\/code> + gate self-test).\nActivation smoke installs the built <code>dist\/lektivo.zip<\/code> instead of a\nworking-tree symlink.<\/li>\n<li>Legacy CourseKit\u2192Lektivo migration: slash block markup for <code>wp_update_post()<\/code>,\nkeep multi-batch <code>block_markup<\/code> on the same step, never rename theme\n  coursekit_dance_* options, run migration on <code>admin_init<\/code> (not front-end\n  plugins_loaded) with explicit pending\/running\/done state, and flush\nrewrites after completion.<\/li>\n<li>Dance compatibility: keep block-theme <code>template-canvas.php<\/code> results, copy\nstyle handles onto <code>coursekit\/*<\/code> alias blocks, and dual-emit <code>coursekit-*<\/code>\nCSS classes via <code>lektivo_classes()<\/code> while Dance (or <code>coursekit<\/code> theme\nsupport) is active.<\/li>\n<li>Unique Composer <code>autoloader-suffix<\/code> so CourseKit and Lektivo can coexist\nwithout a fatal <code>ComposerAutoloaderInit<\/code> collision.<\/li>\n<li>Freemius menu\/<code>first-path<\/code> points at the Courses CPT list so post-activation\nredirects are accessible to admins.<\/li>\n<li>Packaging honours <code>.distignore<\/code> as the single ZIP exclude source; free ZIP\nstrips premium-only regions and <code>@fs_premium_only<\/code> comments.<\/li>\n<li>Skip full-table legacy scans once <code>lektivo_db_version<\/code> is current (LIKE\nscoped to migrated content types). Tagged <code>package-plugin<\/code> builds fail when\nCHANGELOG lacks <code>## X.Y.Z<\/code> instead of falling back to Unreleased.<\/li>\n<li>Front-end Lektivo strings follow the site language (Settings \u2192 General),\nnot the logged-in user\u2019s profile language; wp-admin still uses the profile\nlanguage.<\/li>\n<li>WordPress.org free package excludes hidden lint\/test cache files; <code>readme.txt<\/code>\nTested up to is 7.1; <code>src\/functions.php<\/code> guards against direct file access.<\/li>\n<li>Plugin Check PrefixAllGlobals warnings: template body variables are scoped\ninside static closures; block-theme footer HTML uses\n  $lektivo_block_footer_html.<\/li>\n<li>Admin meta boxes enqueue CSS\/JS instead of inline <code>&lt;style&gt;<\/code>\/<code>&lt;script&gt;<\/code>.<\/li>\n<li>Schedule templates and schedule queries only expose linked\ncourse\/instructor\/location titles when the linked post exists, has the\nexpected type, and is publicly readable (<code>lektivo_get_linked_post()<\/code>).<\/li>\n<li>Free-plan creation caps (<code>Licensing::FREE_LIMITS<\/code>, <code>Admin\\PostTypeLimit<\/code>)\nand related limit notices. Local content creation is unlimited in the\nfree WordPress.org build.<\/li>\n<\/ul>","raw_excerpt":"Manage courses, instructors, locations, and schedules with Gutenberg blocks. Booking and payment stay with your external provider.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/382188","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=382188"}],"author":[{"embeddable":true,"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/ephracis"}],"wp:attachment":[{"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=382188"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=382188"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=382188"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=382188"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=382188"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/sv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=382188"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}