Lektivo

Description

Lektivo is for businesses that offer courses or classes — dance studios, yoga studios, language schools, cooking classes, and similar.

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.

Lektivo handles content and structure. Booking and payment stay with your external provider (dans.se, Bookeo, WooCommerce Bookings, and the like) through configurable booking URLs.

Free vs Professional

Lektivo Free 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.

Lektivo Professional (a separate paid build distributed outside wordpress.org) adds:

  • Interactive timetable Schedule Viewer (location panels, weekday grid, mobile day cards)
  • Course and schedule archive filters (Professional only, including trials)
  • Location Map block and map embeds
  • Testimonials (CPT, admin meta, theme showcase support)
  • Related-course and instructor-course showcase helpers for rich theme cards
  • Freemius updates and priority support

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.

Privacy note

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.

Blocks

This plugin provides 3 blocks.

  • Schedule Viewer Weekly class schedule for a semester, listed by day and time.
  • Course List Displays a list of courses for the current term by default, with optional filtering by category, difficulty, style, semester, or lifecycle (upcoming, running, past).
  • Instructor Grid Displays a grid of instructor cards with photo, name, role, and specialties.

Installation

  1. From Plugins Add New, search for Lektivo and click Install, or upload the lektivo folder to /wp-content/plugins/.
  2. Activate Lektivo through the Plugins screen.
  3. Add courses, instructors, locations, and schedules from the Lektivo admin menus.
  4. Place Lektivo blocks in the block editor, or use theme templates that support Lektivo.

FAQ

Does Lektivo handle booking or payments?

No. Each course or schedule entry has a booking URL that links to your external booking provider.

Are there free-plan creation limits?

No. The free plugin on WordPress.org lets you create as many courses, instructors, locations, and schedules as you need.

Where do I get Lektivo Professional?

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.

Will upgrading keep my content?

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.

Does the free plugin send data to Freemius without asking?

No. Connection and optional analytics are opt-in. You stay in control from the Freemius screens in wp-admin.

Reviews

There are no reviews for this plugin.

Contributors & Developers

“Lektivo” is open source software. The following people have contributed to this plugin.

Contributors

“Lektivo” has been translated into 1 locale. Thank you to the translators for their contributions.

Translate “Lektivo” into your language.

Interested in development?

Browse the code, check out the SVN repository, or subscribe to the development log by RSS.

Changelog

1.3.2

  • Previous-release candidate-build upgrade CI job
    (test:upgrade-from-previous): installs the last GitLab Release plugin
    and Dance theme ZIPs with sv_SE and seeded content, replaces both with
    the new builds in the same folders, asserts an active plugin, clean
    debug.log, rendered home/courses/schedules, Freemius SDK languages/
    in the production ZIP, and desktop plus 390px screenshots per style
    variation. Dance theme ZIPs fall back to
    tests/fixtures/upgrade/ when cross-project release downloads are
    unavailable (#55).
  • Automated folder-name upgrade smoke test: install under coursekit/,
    upload the canonical lektivo/ ZIP beside it, assert a single active
    plugin, preserved course data and options, retirement notice option, and
    no PHP fatals (#55).
  • Release Checklist and docs/RELEASE.md require “Upgrade test from
    previous release passed” before tagging (#55).
  • Document the coursekit/ lektivo/ upgrade path in the release
    checklist and readme upgrade notice (#55).
  • When a site still runs Lektivo from wp-content/plugins/coursekit/
    (common after Freemius in-place updates from the CourseKit product name)
    and a manual zip upload installs lektivo/ beside it, the canonical
    install deactivates the leftover coursekit/ copy and shows an admin
    notice so administrators can delete the unused folder. Content and
    settings are shared WordPress data and stay intact (#55).

1.3.1

  • Localize visitor-facing weekday names on sv_SE sites: long labels
    (Torsdag), short schedule abbreviations (tor), and plural session
    forms (Torsdagar). Helpers prefer the lektivo text domain then
    WordPress $wp_locale; Schedule Viewer fallbacks no longer hard-code
    English (#57).
  • Ship Swedish lektivo translations (languages/lektivo-sv_SE.po /
    .mo) inside the plugin ZIP so sv_SE sites (for example
    ritmostudio.se) show visitor-facing strings in Swedish without a
    wordpress.org language pack after the CourseKit Lektivo rename.
    Packaging no longer excludes the plugin languages/ tree; CI verifies
    the ZIP contains the .mo and key visitor strings translate (#56,
    related lektivo-dance#71).
  • Production packaging keeps vendor/freemius/wordpress-sdk/languages/ in
    the Freemius ZIP (.distignore no longer strips nested languages
    paths) and CI fails if that folder is missing from the built ZIP (#53).

1.3.0

  • Shortcode wrappers for every Lektivo block so Classic Editor and HTML
    widgets can embed the same markup as Gutenberg: [lektivo_course_list],
    [lektivo_instructor_grid], [lektivo_schedule_viewer],
    [lektivo_course_filters], and [lektivo_location_map]. Professional
    gates match the blocks (filters stay empty without a licence; Schedule
    Viewer keeps the free class list vs Pro timetable). Use
    layout=”compact” on the schedule shortcode for the compact day-card
    list (#17).
  • Course List Term control: defaults to the current bookable semester
    (same Helpers::get_current_semester() logic as Schedule Viewer), with
    options for all terms or a fixed semester. Course cards show day and time
    from the schedule in the displayed term. Blocks saved before this keep
    listing all terms until changed (#38).
  • Schedule Viewer block settings for Layout (Responsive vs Compact list)
    and Show filters, so a page can embed the week as day cards on every
    screen size without the filter form. Existing embeds keep the responsive
    timetable and filters (#41).
  • Lektivo always uses the site language (Settings General) for its own
    strings — in wp-admin, the block editor, REST (including _locale=user),
    and on the front end — even when the logged-in user’s profile language
    differs. Language-pack .mo files under wp-content/languages/plugins/
    are rewritten onto the site locale the same way as editor Jed JSON. A
    check ensures the Swedish PO has no empty or fuzzy translations.
    Theme-owned copy such as schedule headings stays in Lektivo Dance (#46).
  • The Freemius Account page is no longer listed under Courses, so customers
    do not see the Jugas IT owner’s details and keys. Activation now returns
    you to the Courses list, and the licence notices and Plugins row no longer
    link to the Account page (#50).
  • Course and schedule archive filters (lektivocf_* / lektivosf_* URL
    params and filter controls) require Lektivo Professional, including
    Freemius trials. Free sites ignore filter values typed into the address by
    hand (#15).
  • Course archive filter query params use the lektivocf_* prefix (aligned
    with schedule lektivosf_*). Bookmarked or shared links that still use
    ckf_* keep working as aliases on Professional; new filter forms emit only
    lektivocf_* (#40).
  • Admin list table column keys for difficulty colour / sort order and
    semester booking-opens use the lektivo_ prefix instead of ck_ (#40).
    Sites with custom CSS that targeted those admin column classes need the
    same rename (ck_color lektivo_color, ck_sort_order
    lektivo_sort_order, ck_booking_opens lektivo_booking_opens).
    Front-end lektivo-* / wp-block-lektivo-* class names and
    –lektivo-diff-* CSS custom properties are unchanged.
  • JavaScript translation files named after a script handle
    (lektivo-{locale}-{handle}.json) are rewritten onto the site language the
    same way as the MD5 file-path JSON names, so Swedish (or any site locale)
    loads for every Jed file style (#52).
  • Semester admin form field IDs use the lektivo-semester-* prefix instead of
    the leftover ck-semester-* CourseKit IDs. Term meta keys are unchanged, so
    existing semester data is unaffected (#40).
  • Course archive cards use the same booking button markup and default booking
    policy as the Course List block and [lektivo_course_list] shortcode, so a
    custom course page and the archive show the same book / status state for the
    same courses without extra configuration (#45).
  • Schedule Viewer no longer forces the page wider than a phone screen:
    filters stack below 600 px, day labels sit above class times on narrow
    viewports, and long course or instructor names wrap instead of truncating
    (#39).
  • Tag pipelines on the canonical GitLab project fail again when Freemius
    credentials are missing, after the project path rename to
    jugasit/lektivo/lektivo (forks still dry-run).

1.2.1

  • Updated Freemius SDK to the latest version.

1.2.0

  • WordPress.org free packaging and gated SVN deploy: local free ZIP
    (bin/package-free-plugin.sh / package:wporg-free), Freemius free
    download helper, release:wporg (skips cleanly without
    WPORG_SVN_USERNAME / WPORG_SVN_PASSWORD), Plugin Check job, and
    .wordpress-org/ asset checklist. Pro Schedule Viewer UI lives in
    ScheduleViewerPremium.php so free ZIPs ship without locked Pro code.
  • Idempotent CourseKit Lektivo legacy data migration
    (Lektivo\Migration\LegacyCourseKit) and deprecated Dance-theme
    compatibility layer (coursekit/* block aliases, coursekit_*
    helpers, ck_* template hierarchy fallbacks).
  • Swedish stopgap language-pack CI artifact (dist/lektivo-sv_SE.zip)
    built from i18n/lektivo-sv_SE.po for drop-in under
    wp-content/languages/plugins/ until translate.wordpress.org ships
    translations. Not bundled in the plugin ZIP.
  • Renamed the free plugin to Lektivo (slug lektivo, namespace
    Lektivo\, prefixes lektivo_ / _lektivo_ / lektivo/).
  • Expand Professional surface for the first public free release: Course
    Filters, Location Map, schedule filter/grid helpers, FilterForm,
    Testimonials CPT/admin meta, and related/instructor course showcase
    helpers (src/Pro/CourseShowcase.php) ship only in @fs_premium_only
    paths stripped from the free ZIP. Free keeps CPTs (except testimonials),
    taxonomies, meta, core admin, Course List, Instructor Grid, and a plain
    day/time-ordered Schedule Viewer list with no upgrade nag.
  • Plugin Check (lint:plugin-check) runs with a 512M PHP/WP-CLI memory
    limit and fails the pipeline on PCP ERROR or WARNING rows.
  • Release tooling moved to tools/release/ (autoload-dev only; not
    shipped in the plugin ZIP).
  • Free Schedule Viewer renders the full class-card list without an
    upgrade nag; the interactive grid remains premium-only code.
  • Course pricing meta box: new tier rows use a monotonically increasing
    data-next-index so remove-then-add no longer reuses a POST index and
    silently drops a tier on save.
  • Activation with CourseKit inactive migrates and flushes rewrite rules in the
    activation hook so front-end course URLs work without an admin page load.
    Coexistence detection uses CourseKit\Plugin /
    is_plugin_active( ‘coursekit/coursekit.php’ ) (not the compat
    coursekit_fs() stand-in). Coexistence early-return sets the rewrite flush
    flag so re-activating then deactivating CourseKit still refreshes permalinks.
  • lektivo_render_course_grid() (and other hard-coded block wrappers) route
    class lists through lektivo_classes() so Dance still sees
    wp-block-coursekit-* twins until the theme MR lands.
  • Free ZIP excludes all dotfiles via .distignore .* (fixes Plugin Check
    ERROR for shipped .eslintignore) and ships composer.json alongside
    vendor/. Plugin Check CI fails on CSV rows matching
    line,column,(ERROR|WARNING), (set -o pipefail + gate self-test).
    Activation smoke installs the built dist/lektivo.zip instead of a
    working-tree symlink.
  • Legacy CourseKitLektivo migration: slash block markup for wp_update_post(),
    keep multi-batch block_markup on the same step, never rename theme
    coursekit_dance_* options, run migration on admin_init (not front-end
    plugins_loaded) with explicit pending/running/done state, and flush
    rewrites after completion.
  • Dance compatibility: keep block-theme template-canvas.php results, copy
    style handles onto coursekit/* alias blocks, and dual-emit coursekit-*
    CSS classes via lektivo_classes() while Dance (or coursekit theme
    support) is active.
  • Unique Composer autoloader-suffix so CourseKit and Lektivo can coexist
    without a fatal ComposerAutoloaderInit collision.
  • Freemius menu/first-path points at the Courses CPT list so post-activation
    redirects are accessible to admins.
  • Packaging honours .distignore as the single ZIP exclude source; free ZIP
    strips premium-only regions and @fs_premium_only comments.
  • Skip full-table legacy scans once lektivo_db_version is current (LIKE
    scoped to migrated content types). Tagged package-plugin builds fail when
    CHANGELOG lacks ## X.Y.Z instead of falling back to Unreleased.
  • Front-end Lektivo strings follow the site language (Settings General),
    not the logged-in user’s profile language; wp-admin still uses the profile
    language.
  • WordPress.org free package excludes hidden lint/test cache files; readme.txt
    Tested up to is 7.1; src/functions.php guards against direct file access.
  • Plugin Check PrefixAllGlobals warnings: template body variables are scoped
    inside static closures; block-theme footer HTML uses
    $lektivo_block_footer_html.
  • Admin meta boxes enqueue CSS/JS instead of inline <style>/<script>.
  • Schedule templates and schedule queries only expose linked
    course/instructor/location titles when the linked post exists, has the
    expected type, and is publicly readable (lektivo_get_linked_post()).
  • Free-plan creation caps (Licensing::FREE_LIMITS, Admin\PostTypeLimit)
    and related limit notices. Local content creation is unlimited in the
    free WordPress.org build.