Skip to content

Hooks Reference

Learnomy overviewFree + ProGet Learnomy →

Every action and filter Learnomy fires, grouped by the part of the plugin that fires it. Use it to find the hook for a job; the feature pages explain the common ones in context.

575 hooks: 357 filters and 218 actions. This page is generated from the code by bin/gen-hooks-reference.php; do not edit it by hand.

Arguments are shown as the call passes them, after the hook name. For a filter the first argument is the value you return. “Fired in” is the first place the hook is called; a number in brackets means it is called from that many places.

Hook Type Arguments What it is for Fired in
learnomy_checkout_purchase_types filter array() The checkout purchase types that extensions register, keyed by type. includes/adapters/class-purchase-types.php:61
learnomy_default_gateway_order filter array( 'woocommerce', 'stripe', 'paypal', 'test' ) Preference order for surfaces that show one Pay button rather than a. includes/adapters/class-adapter-registry.php:98
learnomy_membership_invoice_paid action (int) $sub->id, $provider_sub_id Fires after a renewal invoice for a Stripe membership subscription has been recorded. includes/adapters/class-stripe-adapter.php:1688
learnomy_natively_provisioned_purchase_types filter array_merge( \Learnomy\Models\Transaction::course_sale_types(), array( 'membership', 'm... Filter the purchase types adapters provision themselves. includes/adapters/class-adapter-registry.php:425
learnomy_payment_failed action (string) ( $event->data->object->id ?? '' ), 'stripe', 'async_payment_failed' Fires when a Stripe Checkout session completes without payment being collected, so no. includes/adapters/class-stripe-adapter.php:1046 (2)
learnomy_paypal_subscription_updated action (int) $sub->id, $resource->status ?? '', $resource Fires when PayPal reports a subscription update that Free does not act on, such as a plan. includes/adapters/class-pay-pal-adapter.php:1442
learnomy_purchase_billing_interval filter $raw, $type, $item_id Schedule for a purchase type this adapter does not know natively. includes/adapters/class-woo-commerce-adapter.php:2050
learnomy_register_payment_adapters action Fires after the built-in gateways are registered. includes/adapters/class-adapter-registry.php:387
learnomy_stripe_invoice_orphan action $provider_sub_id, $invoice Fires when a paid Stripe invoice arrives for a subscription Learnomy has no record of. includes/adapters/class-stripe-adapter.php:1592 (2)
learnomy_stripe_subscription_updated action $subscription, $membership Stripe customer.subscription.updated event. Fires for every. includes/adapters/class-stripe-adapter.php:2017
learnomy_stripe_webhook_event action (string) $event->type, $event Fires for every verified Stripe webhook event, after the core. includes/adapters/class-stripe-adapter.php:1116
learnomy_subscription_ action . $hook . '_raw', (string) $wc_sub->get_id(), $payload, 'woocommerce' Fires for a WooCommerce subscription lifecycle event. The dynamic portion of the hook name,. includes/adapters/class-woo-commerce-adapter.php:1651
learnomy_subscription_cancelled_raw action $provider_sub_id, $resource, 'paypal' Generic cancellation - see the note in handle_subscription_renewed(). includes/adapters/class-pay-pal-adapter.php:1257 (2)
learnomy_subscription_payment_failed_raw action $provider_sub_id, $resource, 'paypal', $event_ts Generic payment failure - see the note in handle_subscription_renewed(). includes/adapters/class-pay-pal-adapter.php:1287 (2)
learnomy_subscription_renewed_raw action $provider_sub_id, $sale, 'paypal' Generic subscription lifecycle event, fired for EVERY recurring. includes/adapters/class-pay-pal-adapter.php:1338 (2)
Hook Type Arguments What it is for Fired in
learnomy_admin_commerce_menu_icon filter 'dashicons-cart' The icon of the Commerce top-level admin menu. includes/admin/class-admin.php:459
learnomy_admin_commerce_menu_items action Fires after Learnomy’s own Commerce submenus are registered, so extensions can add theirs. includes/admin/class-admin.php:542
learnomy_admin_commerce_menu_label filter __( 'LMS Commerce', 'learnomy' ) The label of the Commerce top-level admin menu. includes/admin/class-admin.php:453
learnomy_admin_course_detail_actions action (int) $course->id Pro extension point for per-course actions in the overview header. includes/admin/views/course-detail.php:95
learnomy_admin_course_detail_panels action (int) $course->id Fires at the bottom of the admin course detail screen, so extensions can add panels. includes/admin/views/course-detail.php:580
learnomy_admin_dashboard_after_stats action $stats Fires below the stat cards on the admin dashboard. Only fired for site owners, not. includes/admin/views/dashboard.php:134
learnomy_admin_filter_options_cap filter 200 includes/admin/class-admin.php:3185 (9)
learnomy_admin_hidden_submenu_targets filter $targets Allow Pro / third-party code to hide additional submenu pages. includes/admin/class-admin.php:1482
learnomy_admin_init action $this Fires at the end of the admin controller’s init, after Learnomy’s own admin hooks are. includes/admin/class-admin.php:102
learnomy_admin_instructor_detail_actions action (int) $instructor_id Pro extension point for per-instructor actions, rendered in the. includes/admin/views/instructor-detail.php:116
learnomy_admin_menu_icon filter \Learnomy\logo_menu_icon() The icon of the top-level Learnomy admin menu. includes/admin/class-admin.php:119
learnomy_admin_menu_items action Fires after Learnomy’s own admin submenus are registered, so extensions can add theirs. includes/admin/class-admin.php:374
learnomy_admin_menu_label filter __( 'Learnomy', 'learnomy' ) The label of the top-level Learnomy admin menu. includes/admin/class-admin.php:113
learnomy_admin_menu_section_map filter $groups, $parent Filter the slug -> section-key map for a menu. $parent says which menu. includes/admin/class-admin.php:1263
learnomy_admin_menu_sections filter $group_order, $parent Filter the ordered section-key -> label list for a menu. Controls both. includes/admin/class-admin.php:1272
learnomy_admin_pro_features_after_categories action Fires after the feature categories on the Pro Features admin page. includes/admin/views/pro-features.php:301
learnomy_admin_pro_features_before_categories action Fires before the catalog grid on the Pro Features page. includes/admin/views/pro-features.php:154
learnomy_admin_settings_menu_icon filter 'dashicons-admin-settings' The icon of the Settings top-level admin menu. includes/admin/class-admin.php:573
learnomy_admin_settings_menu_items action Pro / third-party config pages can register under the Settings menu. includes/admin/class-admin.php:697
learnomy_admin_settings_menu_label filter __( 'LMS Settings', 'learnomy' ) The label of the Settings top-level admin menu. includes/admin/class-admin.php:567
learnomy_admin_settings_nav action Fires after the built-in navigation items of the Settings screen, so extensions can add nav. includes/admin/views/settings.php:395
learnomy_admin_settings_nav_groups filter $nav_groups Register a settings tab into one of the groups above. includes/admin/views/settings.php:195
learnomy_admin_settings_sections action Fires after the built-in Settings sections, so extensions can render additional sections. includes/admin/views/settings.php:3136
learnomy_admin_status_labels filter $labels Filter the admin status slug → translated label map. includes/admin/class-ux.php:156
learnomy_admin_status_variants filter $map Filter the admin status → badge-variant map. includes/admin/class-ux.php:90
learnomy_admin_student_detail_actions action (int) $user->ID Pro extension point for per-student actions (e.g. “Add to Space”. includes/admin/views/student-detail.php:77
learnomy_admin_subscription_detail_actions action $sub_id Pro extension point for per-subscription actions in the header. includes/admin/views/subscription-detail.php:64
learnomy_admin_subscription_detail_panels action $sub_id, (int) ( $subscription->user_id ?? 0 ) Pro extension point for extra CONTENT panels below the payments table. includes/admin/views/subscription-detail.php:281
learnomy_admin_transaction_detail_actions action $txn_id Pro extension point for per-transaction actions in the header. includes/admin/views/transaction-detail.php:76
learnomy_certificate_instructor_choice_limit filter 500 The maximum number of instructors listed in the certificate rule’s Specific instructors. includes/admin/class-admin.php:4970
learnomy_commerce_card_descriptions filter array( 'learnomy-memberships' => __( 'Plans, pricing, and access tiers.', 'learnomy' ),... The one-line descriptions shown on the Commerce overview cards. includes/admin/views/commerce-overview.php:40
learnomy_course_editor_fields action $course ?? null Renders extra course-editor fields in the sidebar so integrations. includes/admin/views/course-form.php:589
learnomy_course_form_show_pricing filter $kernel->is_enabled( 'payments' ) || $kernel->is_enabled( 'membership' ), $course ?? null Whether the course editor shows the pricing panel. includes/admin/views/course-form.php:231
learnomy_demo_seed_pro action $manifest['course_ids'] ?? array() Fires during demo seeding so Pro extensions can seed their own demo fixtures. includes/admin/ajax/class-demo-seeder.php:222
learnomy_demo_seeder_cascade_cleanup action $user_ids, $course_ids Fires after the core cascade sweep so add-ons can purge their own. includes/admin/ajax/class-demo-seeder.php:638
learnomy_editorjs_tools filter array() Open extension seam - it is the owner’s site, so we never gate what an. includes/admin/class-admin.php:6117
learnomy_email_merge_tags filter $lrn_email_tags, (string) $type_key includes/admin/views/settings.php:2557
learnomy_force_commerce_menu filter false Allow Pro / third-party code to force the Commerce menu visible. includes/admin/class-admin.php:437 (2)
learnomy_grading_row_actions filter $lrn_grade_row_actions, $lrn_row includes/admin/views/quiz-grading.php:237
learnomy_integrations_cards action includes/admin/views/settings.php:3122
learnomy_is_pro filter defined( 'LEARNOMY_PRO_VERSION' ) Whether Learnomy Pro counts as active on the Earnings screen, which gates its Pro-only. includes/admin/views/earnings.php:269 (4)
learnomy_learning_standards filter array( 'xapi' => array( 'name' => __( 'xAPI', 'learnomy' ), 'icon' => 'activity', 'summ... The canonical learning-standards catalogue. Each entry is one standard the. includes/admin/views/partials/integrations-hub.php:31
learnomy_lesson_content_editor action $current_content_type, $is_edit && $lesson ? (int) $lesson->id : 0 Render seam for a Pro-registered content-type’s editor panel. includes/admin/views/lesson-editor.php:574
learnomy_lesson_editor_fields action $is_edit && $lesson ? $lesson : null Renders extra lesson-editor fields (and sub-lesson, same editor) so. includes/admin/views/lesson-editor.php:734
learnomy_lesson_editor_routes filter array( 'course-editor' ) Front-end routes that host a client-rendered lesson editor. includes/admin/class-lesson-attachments-panel.php:123
learnomy_lesson_has_release_schedule filter false, (int) $lesson->id Does this lesson also carry a Pro release schedule?. includes/admin/views/lesson-editor.php:820
learnomy_lesson_release_settings action $is_edit && $lesson ? (int) $lesson->id : 0 Release / drip scheduling panel injection point. includes/admin/views/lesson-editor.php:896
learnomy_membership_plan_after_form action $lrn_plan_id ?? 0 Render extra panels below the membership-plan editor form (e.g. an. includes/admin/views/membership-edit.php:479
learnomy_membership_plan_space_options filter array() Space scope. Free owns this column and Pro decides what can go in it,. includes/admin/views/membership-edit.php:399
learnomy_module_gate_enabled filter $enabled, $gate_key Final say on whether a gated admin page’s owner is active. includes/admin/class-admin.php:846
learnomy_module_gate_label filter $module_label, $module Plain-English name for the thing that gates the page. Free resolves. includes/admin/class-admin.php:1008
learnomy_module_gated_admin_slugs filter $map Admin pages that disappear when their gating module is switched off. includes/admin/class-admin.php:824
learnomy_module_gated_page_labels filter $slug_labels Plain-English names for gated pages, so the recovery notice says what. includes/admin/class-admin.php:997
learnomy_nav_menu_pages filter $pages Filter the list of Learnomy pages exposed in the nav-menus metabox. includes/admin/class-nav-menu-metabox.php:132
learnomy_notice_resurface_days filter $days, $key Filter the re-surface window for one notice. includes/admin/class-notice-dismissal.php:179
learnomy_onboarding_steps filter $steps The steps of the onboarding checklist. includes/admin/class-onboarding-state.php:178
learnomy_pro_course_builder_ai_slot action (int) $course->id AI authoring slot - the Pro ai-authoring extension renders its. includes/admin/views/course-builder.php:48
learnomy_pro_course_create_ai_slot action Fires on the new-course admin screen, where Pro renders its AI course creation entry point. includes/admin/views/course-form.php:100
learnomy_pro_docs_slugs filter self::DOCS_SLUGS Filter the catalog-slug => docs-slug map, so a site (or a future. includes/admin/class-pro-links.php:137
learnomy_pro_link_utm filter $args, $url, $campaign, $content Filter the tracking parameters added to a Learnomy marketing link. includes/admin/class-pro-links.php:97
learnomy_pro_quiz_editor_ai_slot action (int) $quiz->id, (string) ( $quiz->title ?? '' ) AI authoring slot - the Pro ai-authoring extension renders its. includes/admin/views/quiz-editor.php:222
learnomy_pro_tools_card_groups filter array( 'teaching' => __( 'Teaching', 'learnomy' ), 'progress' => __( 'Skills & progress... Section headings for the hub, in render order. includes/admin/views/pro-tools-hub.php:70
learnomy_pro_tools_cards filter array() The cards on the Pro Tools hub. Used here to work out which extension pages belong under the. includes/admin/class-admin.php:1622 (2)
learnomy_quiz_editor_advanced_panel action (int) $quiz->id Pro seam - advanced authoring for a saved quiz. includes/admin/views/quiz-editor.php:872
learnomy_quiz_editor_fields action $quiz ?? null Renders extra quiz-editor fields so an integration can add its own. includes/admin/views/quiz-editor.php:883
learnomy_quiz_grading_response_controls action $lrn_row['response'], $attempt, $lrn_row['question'] Fires after the manual grading controls of a response on the quiz grading detail screen. The. includes/admin/views/quiz-grading-detail.php:227 (2)
learnomy_sanitize_settings filter $clean, $raw The sanitized Learnomy settings, filtered before they are saved. includes/admin/class-admin.php:2399
learnomy_settings_pages_registry filter $frontend_pages Allow Pro extensions to register additional public pages in the Pages. includes/admin/views/settings.php:333
learnomy_settings_schema filter $schema Filter the settings schema. includes/admin/class-admin.php:2026
learnomy_unknown_instructor_label filter get_bloginfo( 'name' ), $course The label shown in the admin courses list for a course whose instructor no longer exists. includes/admin/views/courses.php:392
learnomy_warn_on_empty_publish filter true, $course_id Filter whether to warn about publishing an empty course. includes/admin/class-empty-curriculum-notice.php:69
learnomy_webhook_row_actions action $hook Fires after the row actions of a webhook in the admin webhooks list, so extensions can echo. includes/admin/views/webhooks.php:456
learnomy_webhook_row_actions_list filter $row_actions, $hook Filter the row actions for a webhook list row. includes/admin/views/webhooks.php:446
Hook Type Arguments What it is for Fired in
learnomy_account_fields_save action $user_id, $request Persist custom account fields captured at REGISTRATION. Same action the. includes/api/class-auth-controller.php:992 (3)
learnomy_account_fields_validate filter true, $request, 'instructor' === $role ? 'registration_instructor' : 'registration_stud... Reject a registration or account save before anything is written. includes/api/class-auth-controller.php:898 (3)
learnomy_admin_reset_course_progress action $user_id, $course_id Fires after an admin resets a student’s progress, quiz attempts and enrollment summary for a. includes/api/class-admin-controller.php:1580
learnomy_api_controllers filter $classes The REST controllers Learnomy registers, so an extension can add, replace or remove one. includes/api/class-api.php:357
learnomy_app_config_branding filter $defaults Filter the app branding block. The Pro white-label extension maps. includes/api/class-app-config-controller.php:235
learnomy_app_config_features filter $features Filter the app feature flags. Learnomy Pro injects one flag per. includes/api/class-app-config-controller.php:302
learnomy_app_config_legal filter $legal Filter the app legal block (per-site URLs, owner-configurable). includes/api/class-app-config-controller.php:330
learnomy_app_enabled filter false Filter whether the mobile app may connect to this site. includes/api/class-app-config-controller.php:178
learnomy_app_min_version filter '1.0.0' Filter the minimum app version this site supports. The app. includes/api/class-app-config-controller.php:84
learnomy_before_student_self_delete action $user_id, $user->user_email Fires immediately before the WordPress user row is removed during. includes/api/class-auth-controller.php:1435
learnomy_broadcast_max_audience filter 10000 Hard ceiling for a broadcast audience. Requests that resolve more. includes/api/class-broadcasts-controller.php:529 (2)
learnomy_broadcast_send_email filter true, $audience, $actor_id Filter whether this broadcast may also go out by email. includes/api/class-broadcasts-controller.php:449
learnomy_bulk_enroll_max filter 500 The maximum number of email addresses one bulk enrollment request processes. Extra addresses. includes/api/class-admin-controller.php:1808
learnomy_cancel_reasons filter $default The reasons a member can pick when cancelling a subscription. includes/api/class-membership-controller.php:852
learnomy_cancel_retention_offers filter array(), $sub, $user_id The retention offers shown to a member before they cancel a subscription. includes/api/class-membership-controller.php:805
learnomy_cancellable_subscription_statuses filter array( 'active', 'past_due', 'trialing', 'paused' ), $sub The subscription statuses a member may cancel from. includes/api/class-membership-controller.php:722
learnomy_checkout_extra filter $lrn_extra, $lrn_purchase_type, $request Metadata to carry with an extension purchase. includes/api/class-checkout-controller.php:967
learnomy_checkout_thank_you_url filter $url, $gateway_id, $context Filters the buyer’s post-purchase return URL. includes/api/class-checkout-controller.php:1411
learnomy_course_rest_args filter $args The argument schema of the course create and update REST routes. includes/api/class-courses-controller.php:2532
learnomy_course_rest_fields filter $data, $request The fields of a course in a REST response. includes/api/class-courses-controller.php:2191
learnomy_course_reviews_per_page filter 10, $course_id The number of reviews one page of a course’s review list returns. Clamped to 1-50. includes/api/class-reviews-controller.php:298 (2)
learnomy_course_saved action $course_id, $request Fires after a course is created or updated via REST, carrying the. includes/api/class-courses-controller.php:703 (2)
learnomy_course_settings_rest filter $out, $raw The course settings accepted from a REST request. Lets extensions accept extra keys they. includes/api/class-courses-controller.php:2350
learnomy_course_students_rest_items filter $items, $course_id, get_current_user_id() Filter the REST course-students rows before the response. Lets an. includes/api/class-enrollments-controller.php:724
learnomy_email_log_resent action $id, $user_id, $sent, $reason Fires after an admin manually resends a logged notification email. includes/api/class-email-log-controller.php:161
learnomy_external_enrollment_requested action $user_id, $course_id, $request Fires after an incoming webhook has enrolled a user, for add-ons such as xAPI. includes/api/class-webhooks-controller.php:649
learnomy_guest_account_created action $new_guest_account_id, \Learnomy\Models\Transaction::find( (int) $txn_id ) Fires after a guest checkout created a new user account and its transaction was recorded. includes/api/class-checkout-controller.php:1268 (2)
learnomy_incoming_webhook_payload filter [ 'user_email' => sanitize_email( (string) $request->get_param( 'user_email' ) ), 'cour... The parameters of an incoming enrollment webhook. Lets an adapter normalise a third-party. includes/api/class-webhooks-controller.php:538
learnomy_lesson_attachments_reordered action $lesson_id, $ids Fires after a lesson’s attachments are reordered. includes/api/class-lesson-attachments-controller.php:243
learnomy_lesson_comment_posted action $comment_id, $lesson_id, $user_id Fires after a new lesson comment is posted and is live. Comments held for moderation fire. includes/api/class-comments-controller.php:462 (2)
learnomy_lesson_comment_replied action $comment_id, $parent_id, $lesson_id, $user_id Fires after a reply to a lesson comment is posted and is live. includes/api/class-comments-controller.php:565 (2)
learnomy_lesson_created action $lesson_id, $course_id, $data Fires after a lesson is created through the REST API. includes/api/class-lessons-controller.php:981 (2)
learnomy_lesson_editor_panels filter [], $lesson_id, $lesson Per-lesson panels for a client-rendered lesson editor. includes/api/class-lessons-controller.php:1604
learnomy_lesson_numeric_ref_types filter array( 'mediashield' ) The lesson content types whose video field stores a numeric reference ID rather than a URL. includes/api/class-lessons-controller.php:1929
learnomy_lesson_resources action $lesson_id, $items Fire once per list fetch so later surfaces (student Resources section,. includes/api/class-lesson-attachments-controller.php:143
learnomy_lesson_saved action $lesson_id, $request Documented in create_lesson_in_section(). includes/api/class-lessons-controller.php:983 (3)
learnomy_lesson_updated action (int) $lesson->id, $data Fires after a lesson is updated through the REST API. includes/api/class-lessons-controller.php:1100
learnomy_lesson_video_progress action $user_id, (int) $lesson->id, $watch_pct includes/api/class-lessons-controller.php:1667
learnomy_lessons_reassigned action $updated_ids Fires after lessons are moved between sections. includes/api/class-sections-controller.php:461
learnomy_lessons_reordered action $section_id, $order Fires after the lessons of a section are reordered. includes/api/class-lessons-controller.php:1198
learnomy_login_credential_error_codes filter array( 'empty_username', 'empty_password', 'invalid_username', 'invalid_email', 'incorr... Error codes meaning “these credentials are wrong” and nothing more. includes/api/class-auth-controller.php:531
learnomy_membership_plan_archived action $plan_id Fires after a membership plan that still has dependants is set to inactive instead of being. includes/api/class-membership-controller.php:1118
learnomy_membership_plan_deleted action $plan_id Fires after a membership plan with no dependants is hard-deleted along with its course links. includes/api/class-membership-controller.php:1134
learnomy_membership_plan_has_dependants filter $has_subs, $plan_id Does anything else still depend on this plan?. includes/api/class-membership-controller.php:1108
learnomy_membership_plan_saved action $plan_id, true Fires after a membership plan is created. includes/api/class-membership-controller.php:1039 (2)
learnomy_membership_resume_paused filter false, $subscription_id, $sub Resumes a paused subscription. Free cannot, so Pro handles it and returns the result. includes/api/class-membership-controller.php:980
learnomy_module_route_map filter [ // questionandquiz bare, so every hyphenated child is covered // by the rule ra... Route pattern => module slug, for the modules a site owner can switch. includes/api/class-api.php:171
learnomy_module_toggled action $slug, $enabled Fires after an admin enables or disables a Learnomy module. includes/api/class-admin-controller.php:2232
learnomy_my_courses_per_page filter 40 The number of courses one page of the My Courses list returns. Clamped to 1-100 afterwards. includes/api/class-enrollments-controller.php:236 (2)
learnomy_pro_can_broadcast_to_space filter user_can( $user_id, 'manage_options' ), $space_id, $user_id Whether a user may send a broadcast to a space audience. Free has no Spaces model, so Pro. includes/api/class-broadcasts-controller.php:340
learnomy_pro_quiz_filter_marks filter $marks_by_qid, $questions, (int) $quiz->id Filter what each question on THIS paper is worth: question id => marks. includes/api/class-quizzes-controller.php:1322
learnomy_pro_quiz_filter_questions filter $questions, (int) $quiz->id, [] Filter the question objects a quiz attempt presents. Receives the. includes/api/class-quizzes-controller.php:1288
learnomy_pro_space_member_user_ids filter array(), $space_id The user IDs of a space’s members, resolved by Pro when a broadcast targets a space. includes/api/class-broadcasts-controller.php:587
learnomy_pro_space_title filter __( 'Learning Space', 'learnomy' ), $space_id The display title of a space audience, shown for a broadcast sent to a space. includes/api/class-broadcasts-controller.php:594
learnomy_quiz_attempts_granted action $user_id, $quiz_id, $granted, $attempts Fires after an admin changes a student’s extra-attempt balance on a quiz. includes/api/class-admin-controller.php:1643
learnomy_quiz_created action $quiz_id, $data Fires after a quiz is created through the REST API. includes/api/class-quizzes-controller.php:967
learnomy_quiz_player_context filter $player_context, (int) $quiz->id, (int) $attempt->id Filter the quiz player context payload sent to the client on quiz start. includes/api/class-quizzes-controller.php:1649
learnomy_quiz_saved action $quiz_id, $request Fires after a quiz is created or updated via REST, carrying the request,. includes/api/class-quizzes-controller.php:976 (2)
learnomy_quiz_slots_reordered action $quiz_id, $clean_order Fires after the question slots of a quiz are reordered. includes/api/class-quizzes-controller.php:721
learnomy_quiz_submit_grace_seconds filter 60, $attempt The grace period, in seconds, after a timed attempt’s deadline before a submission is. includes/api/class-quizzes-controller.php:1839
learnomy_quiz_timer_resume_policy filter 'wall_clock', $quiz, $attempt How a timed quiz attempt’s clock behaves when the student resumes it. includes/api/class-quizzes-controller.php:1546
learnomy_quiz_updated action (int) $quiz->id, $data Fires after a quiz is updated through the REST API. includes/api/class-quizzes-controller.php:1031
learnomy_registration_challenge_verify filter true, $request This filter is documented in includes/api/class-auth-controller.php. includes/api/class-checkout-controller.php:245 (2)
learnomy_report_resolved action $report_id, $status, get_current_user_id() Fires after a moderator resolves a report. includes/api/class-reports-controller.php:246
learnomy_report_submitted action $report_id, $object_type, $object_id, $user_id, $reason Fires after a member files a moderation report. includes/api/class-reports-controller.php:206
learnomy_rest_lesson_payload filter $filtered, $lesson, $request Filter the single-lesson REST payload. includes/api/class-lessons-controller.php:926
learnomy_section_created action $section_id, $course_id Fires after a course section is created through the REST API. includes/api/class-sections-controller.php:317
learnomy_section_items_reordered action $section_id, $items Fires after the mixed lessons and quizzes inside a section are reordered. includes/api/class-sections-controller.php:492
learnomy_section_updated action (int) $section->id, $data Fires after a course section is updated through the REST API. includes/api/class-sections-controller.php:379
learnomy_sections_reordered action $course_id, $order Fires after a course’s sections are reordered. includes/api/class-sections-controller.php:531
learnomy_student_account_deleted action $user->user_email Fires after the student user row is successfully removed. includes/api/class-auth-controller.php:1459
learnomy_subscription_extended action $sub_id, (int) $sub->user_id, (int) $sub->plan_id Fires after an admin extends a subscription’s period. includes/api/class-membership-controller.php:1380
learnomy_user_blocked action $me, $target Fires after one member blocks another. includes/api/class-blocks-controller.php:141
learnomy_user_registered action $user_id, $role Fires after a new user registers through the Learnomy frontend. includes/api/class-auth-controller.php:978
learnomy_user_unblocked action $me, $target Fires after one member unblocks another. includes/api/class-blocks-controller.php:161
learnomy_validate_plan_space_id filter is_numeric( $v ) && (int) $v >= 0, $v Whether a space ID is acceptable on a membership plan. Pro tightens this to require that the. includes/api/class-membership-controller.php:540
learnomy_withdrawal_approved action (int) $withdrawal->instructor_id, $withdrawal Fires after an admin approves an instructor withdrawal and it is marked processed. includes/api/class-admin-controller.php:958
learnomy_withdrawal_rejected action $withdrawal_id, (int) $withdrawal->instructor_id, $reason Fires after an admin rejects a withdrawal and its commissions are returned to pending. includes/api/class-admin-controller.php:999
Hook Type Arguments What it is for Fired in
learnomy_app_connect_bridge filter $info Filter the resolved app-connect bridge for this site. includes/auth/class-app-connect.php:155
learnomy_app_connect_schemes filter array( App_Authorize_Access::app_scheme() ) Filter the custom URL schemes the Learnomy app-connect flow may. includes/auth/class-app-connect.php:113
learnomy_app_credential_issued action $user->ID, $app_id, $app_name Fires after a member exchanges their password for an app credential. includes/auth/class-app-credentials.php:193
learnomy_app_password_login_enabled filter $on Filter whether members may exchange a WordPress password for an. includes/auth/class-app-credentials.php:89
learnomy_app_scheme filter self::DEFAULT_APP_SCHEME Filter the mobile app’s deep-link scheme. includes/auth/class-app-authorize-access.php:109
learnomy_email_verified_redirect filter \Learnomy\route_url( 'student-dashboard' ), $user_id Where a user is sent after their email address is verified and they are signed in. includes/auth/class-email-verification.php:241
learnomy_generic_login_errors filter true Whether to answer every failed sign-in identically. includes/auth/class-login-flow.php:252
learnomy_login_redirect filter $destination, $user, $redirect_to Filter where a member lands after signing in. includes/auth/class-login-flow.php:158
Hook Type Arguments What it is for Fired in
learnomy_my_progress_max filter 20 The maximum number of in-progress courses the My Progress block lists. 0 lists them all. blocks/my-progress/render.php:66
Hook Type Arguments What it is for Fired in
learnomy_cli_commands action Fires after built-in CLI commands are registered. includes/cli/class-cli.php:93
learnomy_repair_data_integrity_tasks filter array(), $dry_run Filters the extension-contributed data-integrity tasks. includes/cli/class-repair.php:458
Hook Type Arguments What it is for Fired in
learnomy_content_allowed_html filter $allowed, $context Filter the content allow-list (save gate + render floor). includes/content/class-content-html.php:515
learnomy_content_migratable_fields filter $fields Filter the content fields a migration converts. includes/content/class-content-migrator.php:132
learnomy_content_premigration_backup_written action $file, $rows Fires after the pre-migration content backup is written, before content is converted to. includes/content/class-content-migrator.php:294
learnomy_content_snapshot_fields filter $fields Filter the content fields that get snapshotted before a migration. includes/content/class-content-migrator.php:69
learnomy_embed_blocked_hosts filter array(), $url Filter the embed host deny-list (lowercase hosts). includes/content/class-embed.php:354
learnomy_embed_fediverse_enabled filter $enabled, $url Filter whether guarded Fediverse/oEmbed discovery runs. includes/content/class-embed.php:332
learnomy_embed_html filter $html, $url, $opts Filter the final embed HTML (after wrap + caption). includes/content/class-embed.php:81
learnomy_embed_oembed_args filter array( 'maxwidth' => 1280, 'discover' => false, ), $url Filter the args passed to wp_oembed_get for the FIRST pass (core providers). includes/content/class-embed.php:188
learnomy_embed_platform_adapters filter array( array( __CLASS__, 'peertube_adapter' ) ) Filter the federated-platform embed adapters. Each is. includes/content/class-embed.php:271
learnomy_store_content_as_html filter true Whether new lesson content is stored as HTML rather than Editor.js JSON. False opts the site. includes/content/class-content-html.php:571
Hook Type Arguments What it is for Fired in
learnomy_account_nav_items filter $items, $current Filter the account navigation items. Pro adds its account surfaces here. includes/functions.php:3807
learnomy_account_nav_section_map filter $section_by_key Filter the account-nav item -> section map, so a developer can move an. includes/functions.php:3850
learnomy_account_routes filter array( 'student-dashboard', 'account-courses', 'account-quiz-results', 'account-billing... The routes that make up the My Account area and share its vertical nav. includes/functions.php:3608
learnomy_app_user_agent_token filter 'LearnomyApp' Token the native app appends to its WebView User-Agent. White-label apps. includes/functions.php:2149
learnomy_asset_filemtime filter $on Whether Learnomy asset URLs use the file’s modified time as their version, so a changed file. includes/functions.php:5078
learnomy_become_instructor_slug filter 'become-instructor' The URL slug of the instructor application page. includes/functions.php:537
learnomy_billing_slug filter account_slug() . '/billing' The URL path of the account billing page. includes/functions.php:507 (2)
learnomy_block_allowed_html filter $allowed, $name Filter the allowed-HTML set used to sanitise Learnomy block output. includes/class-blocks.php:437
learnomy_block_category_label filter __( 'Learnomy', 'learnomy' ) Label for the Learnomy block-inserter category. includes/class-blocks.php:526
learnomy_block_output filter $html, $attributes, $name The rendered markup of a Learnomy block, filtered before it is sanitised and echoed. includes/class-blocks.php:476
learnomy_branding_url filter 'https://learnomy.com' Destination for the attribution link. Return ‘’ to render plain text. includes/functions.php:4820
learnomy_breadcrumb_root filter $item Filter the shared breadcrumb root. 10k sites, more than one mind: a. includes/functions.php:2052
learnomy_cancelled_slug filter enroll_slug() . '/cancelled' The URL path of the checkout cancelled page. includes/functions.php:525
learnomy_certificate_expired action (int) $row->id, (int) $row->user_id, (int) $row->course_id Fires after the daily sweep marks a certificate as expired. includes/class-cron.php:801
learnomy_checkout_default_country filter 'US' The billing country the checkout Address Element starts with. includes/class-template-loader.php:3210
learnomy_content_can_access filter $user_id > 0, $user_id Filter whether a viewer may read course content while the academy is private. includes/functions.php:737
learnomy_content_route_names filter array( 'catalog', 'category', 'course', 'lesson', 'quiz', 'standalone-quiz' ) The course content routes gated by the require-login setting. includes/functions.php:817
learnomy_countries filter $wc This filter is documented below. includes/functions.php:5184 (2)
learnomy_course_approved action $course_id Fires after a course is approved and published through the approve-course ability. includes/class-abilities.php:2631
learnomy_course_rejected action $course_id, $reason Fires after a course is rejected through the reject-course ability and set back to draft. includes/class-abilities.php:2656
learnomy_course_taxonomies filter $default The tag taxonomies offered for courses. includes/functions.php:4863
learnomy_cron_jobs filter $events The recurring cron events Learnomy schedules, so extensions can register theirs. includes/class-cron.php:181
learnomy_currency_names filter array( 'AED' => __( 'United Arab Emirates dirham', 'learnomy' ), 'AFN' => __( 'Afghan a... Filter the human names shown in a currency picker. includes/functions.php:2805
learnomy_currency_options filter $options, $args Filter the options shown in a currency picker. includes/functions.php:2787
learnomy_currency_symbol_position filter $position, $currency, $locale Filter the currency symbol position. includes/functions.php:3275
learnomy_currency_symbols filter array( 'AED' => 'د.إ', 'AFN' => '؋', 'ALL' => 'L', 'AMD' => 'AMD', 'ANG' => 'ƒ', 'A... Map of ISO 4217 currency code to display symbol. includes/functions.php:3001
learnomy_distraction_free_route filter $distraction_free, $route Whether a route renders without the theme header and footer. includes/class-template-loader.php:500
learnomy_docs_url filter 'https://learnomy.app/docs/' Filter the documentation base URL. includes/functions.php:5137
learnomy_edd_item_id filter 1662698 The EDD product id used to register the plugin for license updates. learnomy.php:104
learnomy_email_log_retention_days filter $retention_days Filter the email-log retention window in days. includes/class-cron.php:770
learnomy_enable_pwa filter false Whether the Learnomy PWA (service worker, offline banner and manifest) is enabled. This call. includes/functions.php:885 (3)
learnomy_enrollment_expired action (int) $row->id, (int) $row->user_id, (int) $row->course_id Fires after the expiry sweep marks an enrollment’s access as expired. includes/class-cron.php:291
learnomy_entity_labels filter $defaults Filters the set of renamable nouns. includes/functions.php:1506
learnomy_erase_app_data action $user_id Fires during a member data-erase so Pro extensions can wipe their own. includes/class-privacy.php:622
learnomy_erase_authored_course action $course_id, $user_id Fires before an erased author’s course is removed. includes/class-privacy.php:446
learnomy_extension_enabled filter false, $slug Filter whether a Pro extension is enabled on this site. includes/functions.php:596
learnomy_for_sale_models filter array( Models\MembershipPlan::class ) The model classes whose rows are for sale. Each has. includes/class-learnomy.php:1414
learnomy_hide_admin_bar_for_students filter true Filter whether the WP admin bar is hidden for pure students. includes/class-learnomy.php:131
learnomy_init action $this Fires after Learnomy has fully initialized all dependencies. includes/class-learnomy.php:717
learnomy_instructor_application_approved action $application_id, (int) ( $application->user_id ?? 0 ) Fires when an instructor application is approved. includes/class-abilities.php:2561 (2)
learnomy_instructor_application_rejected action $application_id, (int) ( $application->user_id ?? 0 ), $reason Fires when an instructor application is rejected. Same action and. includes/class-abilities.php:2598 (2)
learnomy_instructor_application_submitted action (int) $application_id, $user_id Fires when a student submits an instructor application. Notifier. includes/class-router.php:893 (3)
learnomy_instructor_approved action $application_id Legacy alias, kept firing. includes/class-abilities.php:2573
learnomy_instructor_course_edit_url filter $backend, $course_id The frontend URL of the course editor shown in the instructor’s in-content bar. Returning. includes/class-admin-bar.php:113 (3)
learnomy_instructor_lesson_edit_url filter $backend, $course_id, $lesson_id The frontend URL of the lesson editor shown in the instructor’s in-content bar. Returning. includes/class-admin-bar.php:134
learnomy_instructor_nav_items filter $items, $current includes/functions.php:3950
learnomy_instructor_profile_url filter $url, $instructor Filter the instructor profile URL used across course and lesson surfaces. includes/functions.php:1987
learnomy_instructor_quiz_edit_url filter $backend, $quiz_id, $course_id The frontend URL of the quiz editor shown in the instructor’s in-content bar. Returning the. includes/class-admin-bar.php:157
learnomy_instructor_registration_enabled filter ! solo_mode() Whether visitors may apply to become instructors. includes/functions.php:610
learnomy_instructor_rejected action $application_id, $reason Legacy alias, kept firing. includes/class-abilities.php:2608
learnomy_instructor_routes filter // 'instructor-reports' is NOT here, and its absence is the point. That // route is reg... The instructor routes that use the shared teaching layout and its stylesheets. includes/functions.php:3641
learnomy_instructor_shell_routes filter array( 'instructor-dashboard', 'instructor-reports', 'instructor-courses', 'instructor-... The instructor routes that render through the shared teaching shell and so load the. includes/class-template-loader.php:1431
learnomy_is_editor_preview filter defined( 'REST_REQUEST' ) && REST_REQUEST && current_user_can( 'edit_posts' ) Filters whether a block is being drawn as an editor preview. includes/functions.php:3475
learnomy_layouts filter $surfaces Filters the layout registry. Pro / third-party code adds variants to a. includes/functions.php:1218
learnomy_lesson_html_allowed_html filter $allowed, $raw Filter the allowed-HTML set used to sanitise raw lesson bodies (legacy. includes/functions.php:4372
learnomy_lesson_require_watch_percent filter 0, $lesson, $course The video watch percentage a lesson requires before it can be marked complete, as enforced. includes/class-template-loader.php:3460 (4)
learnomy_lesson_taxonomies filter $default The tag taxonomies offered for lessons. includes/functions.php:4898
learnomy_live_session_duration filter 60, $lesson Filter the default length of a live session, in minutes. includes/functions.php:2401
learnomy_member_payment_provider_label filter $label, $slug Filter the buyer-facing name of a payment provider. includes/functions.php:3417
learnomy_membership_faq_items filter $faq Filter the membership FAQ rows. Each row: { q, a }. includes/functions.php:4060
learnomy_membership_on_offer filter module_enabled( 'membership' ) Filter whether membership sign-up CTAs may render. includes/functions.php:2195
learnomy_multi_instructor_enabled filter $on Whether co-instructors and revenue sharing are offered. includes/functions.php:686
learnomy_offline_slug filter 'learnomy-offline' The URL slug of the offline page served by the PWA shell. includes/functions.php:858
learnomy_payout_method_aliases filter array( 'bank' => 'bank_transfer', 'banktransfer' => 'bank_transfer', 'bank-transfer' =>... The alternate spellings of payout methods that are normalised to a canonical method. includes/functions.php:1708
learnomy_payout_methods filter $methods Filter the payout rails. includes/functions.php:1690
learnomy_privacy_authored_batch filter self::AUTHORED_BATCH The number of rows processed per batch when erasing a user’s authored content. includes/class-privacy.php:409
learnomy_privacy_authored_content_erasure filter 'delete' What happens to content the data subject authored. includes/class-privacy.php:571
learnomy_privacy_authored_time_budget filter self::AUTHORED_TIME_BUDGET Seconds one authored-content pass may run before stopping and. includes/class-privacy.php:419
learnomy_privacy_certificate_erasure filter 'delete' How a certificate is erased for a GDPR request. includes/class-privacy.php:2006
learnomy_privacy_content_reassign_to filter $default User ID that authored content is reassigned to during a GDPR erase. includes/class-privacy.php:380
learnomy_pro_active filter defined( 'LEARNOMY_PRO_VERSION' ) Whether Learnomy Pro counts as active. A test can force this to fake Pro. includes/functions.php:1835 (2)
learnomy_protected_routes filter $protected_routes includes/class-template-loader.php:255
learnomy_provider_cancel_sweep_limit filter 25 The number of provider-side subscription cancellations reconciled in one hourly run. includes/class-cron.php:833
learnomy_purchase_descriptor filter $descriptor, $type, $item_id Describe a purchase type for display on a gateway’s order record. includes/functions.php:5519
learnomy_purge_page_cache action $url Fires when a Learnomy URL’s cached copy is stale. Hook a CDN or any page. includes/functions.php:5615
learnomy_pwa_app_name filter get_bloginfo( 'name' ) The app name in the PWA web manifest. includes/class-router.php:944
learnomy_pwa_app_short_name filter 'Learnomy' The app name in the PWA web manifest. includes/class-router.php:950
learnomy_pwa_icon filter $icon The app name in the PWA web manifest. includes/class-router.php:971
learnomy_pwa_manifest filter $manifest Filter the whole PWA manifest before it is served. includes/class-router.php:984
learnomy_pwa_theme_color filter '#2383e2' The app name in the PWA web manifest. includes/class-router.php:961
learnomy_query_vars filter $vars The public query variables Learnomy registers with WordPress. includes/class-router.php:366
learnomy_question_taxonomies filter $default The tag taxonomies offered for quiz questions. includes/functions.php:4929
learnomy_question_types filter $types Filters the registered question types. includes/class-question-types.php:67
learnomy_quiz_display_templates filter $templates Filter the quiz display templates. includes/functions.php:1888
learnomy_quiz_start_style filter $style Filter the quiz start-screen layout. includes/functions.php:1934
learnomy_quiz_taxonomies filter $default The tag taxonomies offered for quizzes. includes/functions.php:4956
learnomy_reengagement_enabled filter true Whether the inactivity re-engagement email runs at all. includes/class-cron.php:391
learnomy_reengagement_max_per_run filter 500 The maximum number of re-engagement emails queued in one run. includes/class-cron.php:408
learnomy_register_abilities action Fires inside wp_abilities_api_init after Learnomy’s own abilities are registered, so. includes/class-abilities.php:135
learnomy_register_instructor_slug filter 'register/instructor' The URL slug of the instructor registration page. includes/functions.php:846
learnomy_register_student_slug filter 'register/student' The URL slug of the student registration page. includes/functions.php:834
learnomy_registered_tag_types filter $types Extend the allow-list for vocabularies not surfaced by the three core. includes/functions.php:4982
learnomy_reminder_cadences filter array( '7d', '3d', '1d' ) The cadences at which expiry reminders are sent before an enrollment’s access ends. includes/class-cron.php:463 (2)
learnomy_require_login_for_content filter $on Whether course content routes redirect logged-out visitors to the login page. includes/functions.php:708
learnomy_reserved_slugs filter array( // WP pagination segment. 'page', // /instructor/ children (Pro frontend builder... The URL segments reserved by Learnomy, which a course or other slug may not use. includes/functions.php:410
learnomy_route_access_gates filter array( 'instructor-courses' => 'partials/instructor-access-gate.php', 'instructor-stude... Filter the routes that render an access gate instead of a 404. includes/class-template-loader.php:641
learnomy_route_capabilities filter self::$capability_routes Capability gate. Being logged in is not the same as being allowed:. includes/class-template-loader.php:298
learnomy_route_enabled filter true, $route Per-route enable gate. A route whose feature/module is turned off. includes/class-template-loader.php:343
learnomy_route_http_status filter (int) ( $view_data['http_status'] ?? 200 ), $route, $data, $view_data The HTTP status a route renders with, such as 403 or 410. Decided before headers are sent. includes/class-template-loader.php:558
learnomy_route_no_cache_for_user filter true, $route Whether a logged-in user’s Learnomy page is sent with private, no-cache headers so a page. includes/class-template-loader.php:364
learnomy_route_not_found filter ! empty( $view_data['not_found'] ), $route, $data, $view_data Whether the request is a 404. Lets a route without its own view-data resolver declare that. includes/class-template-loader.php:535
learnomy_route_slug filter $value, $option_key Uniform slug filter - THE single seam the route registry promised, so a. includes/functions.php:374
learnomy_route_title filter '', $route, $data Filter the for a route with no built-in title - the.</td> <td><code>includes/class-template-loader.php:3735</code></td> </tr> <tr> <td><code>learnomy_routes</code></td> <td>filter</td> <td><code>$defs</code></td> <td>Filter the route table. Pro + third-party code add/modify routes here.</td> <td><code>includes/class-routes.php:338</code></td> </tr> <tr> <td><code>learnomy_send_access_expiring_reminders</code></td> <td>filter</td> <td><code>true</code></td> <td></td> <td><code>includes/class-cron.php:332</code> (2)</td> </tr> <tr> <td><code>learnomy_send_renewal_reminders</code></td> <td>filter</td> <td><code>true</code></td> <td></td> <td><code>includes/class-cron.php:333</code> (2)</td> </tr> <tr> <td><code>learnomy_show_branding</code></td> <td>filter</td> <td><code>true</code></td> <td>Whether to show the Learnomy attribution on the learner-facing site.</td> <td><code>includes/functions.php:4811</code></td> </tr> <tr> <td><code>learnomy_solo_mode</code></td> <td>filter</td> <td><code>$on</code></td> <td>Whether the site runs in solo mode: one instructor, no commissions, no co-instructors and no.</td> <td><code>includes/functions.php:560</code></td> </tr> <tr> <td><code>learnomy_standalone_dark_mode</code></td> <td>filter</td> <td><code>false</code></td> <td>Filter whether Learnomy shows its own dark-mode toggle and applies its own.</td> <td><code>includes/functions.php:2517</code></td> </tr> <tr> <td><code>learnomy_student_registration_enabled</code></td> <td>filter</td> <td><code>$on</code></td> <td>Whether visitors may register as students.</td> <td><code>includes/functions.php:638</code></td> </tr> <tr> <td><code>learnomy_student_registration_url</code></td> <td>filter</td> <td><code>wp_login_url( $redirect ), $redirect</code></td> <td>Replacement destination for signup CTAs when student registration is.</td> <td><code>includes/functions.php:669</code></td> </tr> <tr> <td><code>learnomy_subscription_auto_expired</code></td> <td>action</td> <td><code>(int) $row->id, (int) $row->user_id, (int) $row->plan_id</code></td> <td>Fires when the sweep expires a subscription whose period ended more than the grace period.</td> <td><code>includes/class-cron.php:1009</code></td> </tr> <tr> <td><code>learnomy_subscription_grace_days</code></td> <td>filter</td> <td><code>$days</code></td> <td>Filter the past-due grace window (days).</td> <td><code>includes/functions.php:2270</code></td> </tr> <tr> <td><code>learnomy_subscription_trial_ending</code></td> <td>action</td> <td><code>(int) $row->id, (int) $row->user_id, (int) $row->plan_id, (string) $row->trial_ends_at</code></td> <td>Fires once for each trialing subscription whose trial ends within the next 72 hours.</td> <td><code>includes/class-cron.php:1047</code></td> </tr> <tr> <td><code>learnomy_template_map</code></td> <td>filter</td> <td><code>self::$default_template_map</code></td> <td>The template file used for each route.</td> <td><code>includes/class-template-loader.php:788</code></td> </tr> <tr> <td><code>learnomy_text_response_types</code></td> <td>filter</td> <td><code>[ 'essay', 'short_answer', 'fill_blank' ]</code></td> <td>Filters the types whose response is free text rather than option ids.</td> <td><code>includes/class-question-types.php:125</code></td> </tr> <tr> <td><code>learnomy_thank_you_slug</code></td> <td>filter</td> <td><code>enroll_slug() . '/thank-you'</code></td> <td>The URL path of the checkout thank-you page.</td> <td><code>includes/functions.php:516</code></td> </tr> <tr> <td><code>learnomy_three_decimal_currencies</code></td> <td>filter</td> <td><code>array( 'BHD', 'IQD', 'JOD', 'KWD', 'LYD', 'OMR', 'TND' )</code></td> <td>Currencies whose smallest unit is a THOUSANDTH, not a hundredth.</td> <td><code>includes/functions.php:2668</code></td> </tr> <tr> <td><code>learnomy_trusted_proxies</code></td> <td>filter</td> <td><code>array()</code></td> <td>Addresses or CIDR ranges of reverse proxies / CDNs in front of this site,.</td> <td><code>includes/functions.php:143</code></td> </tr> <tr> <td><code>learnomy_user_reference_tables</code></td> <td>filter</td> <td><code>$refs</code></td> <td>Filter the user-reference map.</td> <td><code>includes/functions.php:1814</code></td> </tr> <tr> <td><code>learnomy_view_data_resolvers</code></td> <td>filter</td> <td><code>self::$view_data_resolvers</code></td> <td>The classes that resolve view data for each route.</td> <td><code>includes/class-template-loader.php:767</code></td> </tr> <tr> <td><code>learnomy_virtual_query_corrected</code></td> <td>action</td> <td><code>$query, (string) $route</code></td> <td>Fires once the main query has been told it is on a Learnomy route.</td> <td><code>includes/class-router.php:148</code></td> </tr> <tr> <td><code>learnomy_wishlist_url</code></td> <td>filter</td> <td><code>add_query_arg( 'tab', 'wishlist', route_url( 'account-courses' ) )</code></td> <td>The Wishlist address. Filter it to send members somewhere else.</td> <td><code>includes/functions.php:2585</code></td> </tr> <tr> <td><code>learnomy_zero_decimal_currencies</code></td> <td>filter</td> <td><code>array( 'BIF', 'CLP', 'DJF', 'GNF', 'JPY', 'KMF', 'KRW', 'MGA', 'PYG', 'RWF', 'UGX', 'VN...</code></td> <td>The currency codes that have no minor unit, so their amounts are not multiplied by 100.</td> <td><code>includes/functions.php:2682</code></td> </tr> </tbody> </table> <h2>Cron</h2> <table> <thead> <tr> <th>Hook</th> <th>Type</th> <th>Arguments</th> <th>What it is for</th> <th>Fired in</th> </tr> </thead> <tbody> <tr> <td><code>learnomy_lesson_unlock_is_valid</code></td> <td>filter</td> <td><code>$valid, $user_id, $lesson_id, $course_id</code></td> <td>Filter whether a relative-drip unlock row is still valid to fire.</td> <td><code>includes/cron/class-drip-cron.php:245</code></td> </tr> <tr> <td><code>learnomy_lesson_unlocked</code></td> <td>action</td> <td><code>$lesson_id, $user_id, $course_id</code></td> <td>Fires once when a previously-locked lesson becomes available.</td> <td><code>includes/cron/class-drip-cron.php:151</code> (2)</td> </tr> </tbody> </table> <h2>Db</h2> <table> <thead> <tr> <th>Hook</th> <th>Type</th> <th>Arguments</th> <th>What it is for</th> <th>Fired in</th> </tr> </thead> <tbody> <tr> <td><code>learnomy_relation_models</code></td> <td>filter</td> <td><code>array()</code></td> <td>Filters the model classes asked to declare their relations.</td> <td><code>includes/db/class-relations.php:204</code></td> </tr> <tr> <td><code>learnomy_relation_parents</code></td> <td>filter</td> <td><code>$parents</code></td> <td>Filters the entity => parent table map.</td> <td><code>includes/db/class-relations.php:142</code></td> </tr> <tr> <td><code>learnomy_relations_cascaded</code></td> <td>action</td> <td><code>$entity, $id, $removed, $cleared</code></td> <td>Fires after an entity’s declared relations have been cleaned.</td> <td><code>includes/db/class-relations.php:309</code></td> </tr> <tr> <td><code>learnomy_schema_strip_fulltext</code></td> <td>filter</td> <td><code>$is_temp</code></td> <td>Force the FULLTEXT strip on or off.</td> <td><code>includes/db/class-schema.php:58</code></td> </tr> </tbody> </table> <h2>Integrations</h2> <table> <thead> <tr> <th>Hook</th> <th>Type</th> <th>Arguments</th> <th>What it is for</th> <th>Fired in</th> </tr> </thead> <tbody> <tr> <td><code>learnomy_companion_package_hosts</code></td> <td>filter</td> <td><code>array( $store_host )</code></td> <td>Hosts allowed to serve a companion plugin zip.</td> <td><code>includes/integrations/class-companion-installer.php:245</code></td> </tr> <tr> <td><code>learnomy_companions</code></td> <td>filter</td> <td><code>array( 'mediashield' => array( 'label' => __( 'MediaShield', 'learnomy' ), 'why' => __(...</code></td> <td>Filter the Academy Stack companion catalog. Pro + third-party plugins.</td> <td><code>includes/integrations/class-companion-registry.php:46</code></td> </tr> <tr> <td><code>learnomy_theme_token_maps</code></td> <td>filter</td> <td><code>$maps</code></td> <td>Filter the theme token maps. Themes/add-ons register a mapping here so.</td> <td><code>includes/integrations/class-theme-bridge.php:96</code></td> </tr> </tbody> </table> <h2>Migration</h2> <table> <thead> <tr> <th>Hook</th> <th>Type</th> <th>Arguments</th> <th>What it is for</th> <th>Fired in</th> </tr> </thead> <tbody> <tr> <td><code>learnomy_migration_not_migrated</code></td> <td>filter</td> <td><code>$items, $source_slug</code></td> <td>Filter the “not migrated” list, per source. Shown on BOTH the dry-run.</td> <td><code>includes/migration/class-import-service.php:286</code></td> </tr> <tr> <td><code>learnomy_migration_question_type_fallbacks</code></td> <td>filter</td> <td><code>array( 'image_matching' => 'matching', 'image_answering' => 'short_answer', 'h5p' => 's...</code></td> <td>The fallback Learnomy question type for each source question type with no exact equivalent.</td> <td><code>includes/migration/class-import-service.php:309</code></td> </tr> <tr> <td><code>learnomy_migration_sources</code></td> <td>filter</td> <td><code>$defaults</code></td> <td>Filter the migration sources. Pro and third parties append modules.</td> <td><code>includes/migration/class-source-registry.php:49</code></td> </tr> </tbody> </table> <h2>Models</h2> <table> <thead> <tr> <th>Hook</th> <th>Type</th> <th>Arguments</th> <th>What it is for</th> <th>Fired in</th> </tr> </thead> <tbody> <tr> <td><code>learnomy_catalog_where_clauses</code></td> <td>filter</td> <td><code>array( $where_sql, $where_values ), $args</code></td> <td>Final hook for extensions to contribute WHERE clauses + values to.</td> <td><code>includes/models/class-course.php:670</code></td> </tr> <tr> <td><code>learnomy_category_includes_descendants</code></td> <td>filter</td> <td><code>true, $category_id</code></td> <td>Whether a category listing rolls up the courses filed under its.</td> <td><code>includes/models/class-category.php:191</code></td> </tr> <tr> <td><code>learnomy_cert_verify_throttle_seconds</code></td> <td>filter</td> <td><code>5 * MINUTE_IN_SECONDS</code></td> <td>The minimum seconds between verification-count increments for one certificate.</td> <td><code>includes/models/class-certificate.php:452</code></td> </tr> <tr> <td><code>learnomy_certificate_template_usage</code></td> <td>filter</td> <td><code>$reasons, $template_id</code></td> <td>Filter what else depends on a certificate template.</td> <td><code>includes/models/class-certificate-template.php:170</code></td> </tr> <tr> <td><code>learnomy_commission_void_payout_statuses</code></td> <td>filter</td> <td><code>array( 'reversed', 'refunded' )</code></td> <td>Filters the payout statuses that exclude a commission from earnings.</td> <td><code>includes/models/class-commission.php:78</code></td> </tr> <tr> <td><code>learnomy_coupon_exhausted</code></td> <td>action</td> <td><code>$id</code></td> <td>Fires when a coupon is retired for running out of redemptions.</td> <td><code>includes/models/class-coupon.php:206</code></td> </tr> <tr> <td><code>learnomy_course_complete_continue_url</code></td> <td>filter</td> <td><code>self::completed_destination( $course, $user_id ), $course, $user_id</code></td> <td>Filter the “Continue Learning” destination for a course the viewer.</td> <td><code>includes/models/class-course.php:3965</code></td> </tr> <tr> <td><code>learnomy_course_complete_url</code></td> <td>filter</td> <td><code>\Learnomy\route_url( 'course-complete', array( 'slug' => (string) $course->slug ) ), $c...</code></td> <td>Where a learner lands when a course completes.</td> <td><code>includes/models/class-course.php:3847</code></td> </tr> <tr> <td><code>learnomy_course_enroll_gate</code></td> <td>filter</td> <td><code>'', $course, $user_id</code></td> <td>Lets an extension take over the enrol call-to-action for a course.</td> <td><code>includes/models/class-course.php:4070</code> (2)</td> </tr> <tr> <td><code>learnomy_course_is_purchasable</code></td> <td>filter</td> <td><code>true, $course, $user_id</code></td> <td>Whether a course may be bought right now.</td> <td><code>includes/models/class-course.php:3813</code></td> </tr> <tr> <td><code>learnomy_course_sale_transaction_types</code></td> <td>filter</td> <td><code>array( 'course', 'subscription_course', 'subscription_course_renewal' )</code></td> <td>Filter the transaction types treated as the sale of one course.</td> <td><code>includes/models/class-transaction.php:100</code></td> </tr> <tr> <td><code>learnomy_courses_primed</code></td> <td>action</td> <td><code>$lrn_primed</code></td> <td></td> <td><code>includes/models/class-course.php:968</code></td> </tr> <tr> <td><code>learnomy_enrollment_current_statuses</code></td> <td>filter</td> <td><code>[ 'active', 'completed' ]</code></td> <td>Statuses treated as a live enrolment by rosters, counts and averages.</td> <td><code>includes/models/class-enrollment.php:1132</code></td> </tr> <tr> <td><code>learnomy_enrollment_source_is_paid</code></td> <td>filter</td> <td><code>in_array( $source, array( 'purchase', 'paid', 'subscription', 'membership' ), true ), $...</code></td> <td>Whether an enrollment source counts as money changing hands.</td> <td><code>includes/models/class-enrollment.php:1043</code></td> </tr> <tr> <td><code>learnomy_enrollment_source_label</code></td> <td>filter</td> <td><code>$labels[ $source ] ?? ucfirst( str_replace( '_', ' ', $source ) ), $source</code></td> <td>Filters the human label for an enrollment source, so an integration.</td> <td><code>includes/models/class-enrollment.php:1023</code></td> </tr> <tr> <td><code>learnomy_instructor_resumed</code></td> <td>action</td> <td><code>$user_id</code></td> <td>An instructor was resumed and takes new business again.</td> <td><code>includes/models/class-instructor.php:251</code></td> </tr> <tr> <td><code>learnomy_instructor_suspended</code></td> <td>action</td> <td><code>$user_id</code></td> <td>An instructor was paused: hidden from the public directory, no new.</td> <td><code>includes/models/class-instructor.php:244</code></td> </tr> <tr> <td><code>learnomy_lesson_attachment_added</code></td> <td>action</td> <td><code>$lesson_id, $attachment_id, $media_id</code></td> <td>Fires after a file is attached to a lesson.</td> <td><code>includes/models/class-lesson.php:1278</code></td> </tr> <tr> <td><code>learnomy_lesson_attachment_removed</code></td> <td>action</td> <td><code>(int) $row->lesson_id, $attachment_id</code></td> <td>Fires after a lesson attachment is detached.</td> <td><code>includes/models/class-lesson.php:1299</code></td> </tr> <tr> <td><code>learnomy_lesson_content_type_descriptors</code></td> <td>filter</td> <td><code>$descriptors</code></td> <td>Filter the described lesson content types.</td> <td><code>includes/models/class-lesson.php:162</code></td> </tr> <tr> <td><code>learnomy_lesson_content_type_label</code></td> <td>filter</td> <td><code>$label, $type</code></td> <td>Filter the human-readable label for a lesson content-type, so a Pro.</td> <td><code>includes/models/class-lesson.php:230</code></td> </tr> <tr> <td><code>learnomy_lesson_content_types</code></td> <td>filter</td> <td><code>self::CONTENT_TYPES</code></td> <td>Filter the selectable lesson content-types.</td> <td><code>includes/models/class-lesson.php:86</code></td> </tr> <tr> <td><code>learnomy_max_webhooks</code></td> <td>filter</td> <td><code>self::DEFAULT_MAX</code></td> <td>Filter the maximum number of active outbound webhooks.</td> <td><code>includes/models/class-webhook.php:44</code></td> </tr> <tr> <td><code>learnomy_membership_free_plan_limit</code></td> <td>filter</td> <td><code>self::FREE_PLAN_LIMIT</code></td> <td>Filter the free-plan cap. Pro sets this to PHP_INT_MAX.</td> <td><code>includes/models/class-membership-plan.php:145</code></td> </tr> <tr> <td><code>learnomy_model_where_default_limit</code></td> <td>filter</td> <td><code>5000, static::table_name()</code></td> <td>The row ceiling applied to a model query that passes no limit.</td> <td><code>includes/models/class-model.php:684</code></td> </tr> <tr> <td><code>learnomy_notification_type_label</code></td> <td>filter</td> <td><code>$label, $type</code></td> <td>Filter the human label for a notification type slug.</td> <td><code>includes/models/class-notification.php:80</code></td> </tr> <tr> <td><code>learnomy_progress_activity_announcement</code></td> <td>filter</td> <td><code>$map, $status</code></td> <td>Verb and icon used to announce a progress row in an activity feed.</td> <td><code>includes/models/class-progress.php:613</code></td> </tr> <tr> <td><code>learnomy_provider_cancel_max_attempts</code></td> <td>filter</td> <td><code>10</code></td> <td>How many times a cancellation is retried at the payment provider before giving up.</td> <td><code>includes/models/class-subscription.php:558</code></td> </tr> <tr> <td><code>learnomy_quiz_max_attempts</code></td> <td>filter</td> <td><code>$limit, $quiz, $user_id</code></td> <td>Filter the number of attempts a student may take on a quiz.</td> <td><code>includes/models/class-quiz.php:539</code></td> </tr> <tr> <td><code>learnomy_renewal_transaction_types</code></td> <td>filter</td> <td><code>array( 'membership_renewal', 'subscription_course_renewal' )</code></td> <td>Filter the transaction types treated as a renewal.</td> <td><code>includes/models/class-transaction.php:121</code></td> </tr> <tr> <td><code>learnomy_subscription_deleted</code></td> <td>action</td> <td><code>$id</code></td> <td>Fires after a subscription is deleted so extensions can clean up.</td> <td><code>includes/models/class-subscription.php:99</code></td> </tr> <tr> <td><code>learnomy_technical_content_types</code></td> <td>filter</td> <td><code>self::TECHNICAL_CONTENT_TYPES</code></td> <td>The lesson content types whose technical name is hidden from learners.</td> <td><code>includes/models/class-lesson.php:259</code></td> </tr> <tr> <td><code>learnomy_webhook_deleted</code></td> <td>action</td> <td><code>$id</code></td> <td>Fires after a webhook is deleted so extensions can clean up rows.</td> <td><code>includes/models/class-webhook.php:108</code></td> </tr> </tbody> </table> <h2>Modules</h2> <table> <thead> <tr> <th>Hook</th> <th>Type</th> <th>Arguments</th> <th>What it is for</th> <th>Fired in</th> </tr> </thead> <tbody> <tr> <td><code>learnomy_after_module_disabled</code></td> <td>action</td> <td><code>$slug</code></td> <td>Fires after a module is disabled. A module that wrote rows into a.</td> <td><code>includes/modules/class-module-kernel.php:172</code></td> </tr> <tr> <td><code>learnomy_after_module_enabled</code></td> <td>action</td> <td><code>$slug</code></td> <td>Fires after a module is enabled. Lets the owning extension (Free or.</td> <td><code>includes/modules/class-module-kernel.php:135</code></td> </tr> <tr> <td><code>learnomy_module_disable_impact</code></td> <td>filter</td> <td><code>$impact, $slug</code></td> <td>Declare what ELSE a site loses by switching this module off.</td> <td><code>includes/modules/class-module-kernel.php:279</code></td> </tr> <tr> <td><code>learnomy_module_enabled</code></td> <td>filter</td> <td><code>$result, $slug</code></td> <td>Final say on whether an OPTIONAL module is active. Lets a site-wide.</td> <td><code>includes/modules/class-module-kernel.php:95</code></td> </tr> <tr> <td><code>learnomy_module_preset_applied</code></td> <td>action</td> <td><code>$preset_slug, $modules</code></td> <td>Fires after a wizard preset has been applied. Listeners can seed.</td> <td><code>includes/modules/class-module-kernel.php:808</code></td> </tr> <tr> <td><code>learnomy_module_presets</code></td> <td>filter</td> <td><code>$presets</code></td> <td>Filter the wizard presets. Custom builds can rename, replace, or.</td> <td><code>includes/modules/class-module-kernel.php:753</code></td> </tr> <tr> <td><code>learnomy_module_user_commitment</code></td> <td>filter</td> <td><code>$held, $slug, $user_id</code></td> <td>Whether this user still holds something the module sold them, and so.</td> <td><code>includes/modules/class-module-kernel.php:315</code></td> </tr> <tr> <td><code>learnomy_modules_catalog</code></td> <td>filter</td> <td><code>$base</code></td> <td>Filter the module catalog so Pro extensions and third parties.</td> <td><code>includes/modules/class-module-kernel.php:663</code></td> </tr> <tr> <td><code>learnomy_site_sells_something</code></td> <td>filter</td> <td><code>$sells</code></td> <td>Filter whether this site counts as selling something.</td> <td><code>includes/modules/class-module-kernel.php:468</code></td> </tr> </tbody> </table> <h2>Notifications</h2> <table> <thead> <tr> <th>Hook</th> <th>Type</th> <th>Arguments</th> <th>What it is for</th> <th>Fired in</th> </tr> </thead> <tbody> <tr> <td><code>learnomy_community_notification_removed</code></td> <td>action</td> <td><code>'course', $course_id</code></td> <td>Fires when an object that community notifications point at is deleted.</td> <td><code>includes/notifications/class-community-notification-contract.php:46</code> (2)</td> </tr> </tbody> </table> <h2>Permissions</h2> <table> <thead> <tr> <th>Hook</th> <th>Type</th> <th>Arguments</th> <th>What it is for</th> <th>Fired in</th> </tr> </thead> <tbody> <tr> <td><code>learnomy_can_access_course</code></td> <td>filter</td> <td><code>$result, $user_id, $context_id</code></td> <td>Whether a user may access a course.</td> <td><code>includes/permissions/class-permission-engine.php:120</code></td> </tr> <tr> <td><code>learnomy_co_instructor_can_manage</code></td> <td>filter</td> <td><code>false, $user_id, (int) $course->id</code></td> <td>Allow an assigned co-instructor to co-manage a course (content,.</td> <td><code>includes/permissions/class-permission-engine.php:366</code></td> </tr> <tr> <td><code>learnomy_credential_max_failures</code></td> <td>filter</td> <td><code>self::CREDENTIAL_MAX_FAILURES</code></td> <td>The failed credential attempts allowed in a bucket before it is locked out.</td> <td><code>includes/permissions/class-rate-limiter.php:115</code></td> </tr> <tr> <td><code>learnomy_credential_window</code></td> <td>filter</td> <td><code>self::CREDENTIAL_WINDOW</code></td> <td>How long, in seconds, failed credential attempts in a bucket are counted.</td> <td><code>includes/permissions/class-rate-limiter.php:142</code></td> </tr> <tr> <td><code>learnomy_guest_checkout_rate_limit</code></td> <td>filter</td> <td><code>self::GUEST_CHECKOUTS_PER_HOUR</code></td> <td>The number of guest checkouts allowed per IP address per hour.</td> <td><code>includes/permissions/class-rate-limiter.php:64</code></td> </tr> <tr> <td><code>learnomy_is_course_learner</code></td> <td>filter</td> <td><code>$result, $user_id, $course_id</code></td> <td>Final say on whether a user counts as a learner on this course.</td> <td><code>includes/permissions/class-permission-engine.php:261</code></td> </tr> <tr> <td><code>learnomy_permission_check</code></td> <td>filter</td> <td><code>false, $user_id, $action, $context_id</code></td> <td>The verdict for a permission action when the user lacks the WordPress capability behind it.</td> <td><code>includes/permissions/class-permission-engine.php:86</code> (2)</td> </tr> <tr> <td><code>learnomy_permission_context_check</code></td> <td>filter</td> <td><code>true, $user_id, $action, $context_id</code></td> <td>The verdict for an action that has no context-specific rule, once the capability check has passed.</td> <td><code>includes/permissions/class-permission-engine.php:183</code></td> </tr> <tr> <td><code>learnomy_visibility_grants</code></td> <td>filter</td> <td><code>$grants, $viewer_id, $purpose</code></td> <td>Filters the rectangles a viewer may read.</td> <td><code>includes/permissions/class-permission-engine.php:511</code></td> </tr> </tbody> </table> <h2>Security</h2> <table> <thead> <tr> <th>Hook</th> <th>Type</th> <th>Arguments</th> <th>What it is for</th> <th>Fired in</th> </tr> </thead> <tbody> <tr> <td><code>learnomy_scope_media_to_author</code></td> <td>filter</td> <td><code>$scope, get_current_user_id()</code></td> <td>Filter whether the Media Library is limited to the user’s own uploads.</td> <td><code>includes/security/class-media-library-scope.php:60</code></td> </tr> <tr> <td><code>learnomy_webhook_allowed_schemes</code></td> <td>filter</td> <td><code>array( 'https', 'http' )</code></td> <td>Allowed URL schemes for outbound webhooks. Defaults to https only.</td> <td><code>includes/security/class-webhook-url-validator.php:124</code></td> </tr> </tbody> </table> <h2>Seo</h2> <table> <thead> <tr> <th>Hook</th> <th>Type</th> <th>Arguments</th> <th>What it is for</th> <th>Fired in</th> </tr> </thead> <tbody> <tr> <td><code>learnomy_meta_description</code></td> <td>filter</td> <td><code>$description, (string) get_query_var( 'learnomy_route' )</code></td> <td>Filter the meta description for a Learnomy route.</td> <td><code>includes/seo/class-schema-markup.php:537</code></td> </tr> <tr> <td><code>learnomy_meta_description_max_length</code></td> <td>filter</td> <td><code>155</code></td> <td>Max meta-description length before truncation.</td> <td><code>includes/seo/class-schema-markup.php:581</code></td> </tr> <tr> <td><code>learnomy_seo_plugin_head_filters</code></td> <td>filter</td> <td><code>self::SEO_PLUGIN_HEAD_FILTERS</code></td> <td>Filters the SEO plugin filters Learnomy empties on its own routes, so.</td> <td><code>includes/seo/class-schema-markup.php:155</code></td> </tr> <tr> <td><code>learnomy_seo_yield_to_plugin</code></td> <td>filter</td> <td><code>$seo_plugin_active</code></td> <td>Whether Learnomy yields its schema markup to an active SEO plugin.</td> <td><code>includes/seo/class-schema-markup.php:454</code></td> </tr> <tr> <td><code>learnomy_sitemap_courses_per_page</code></td> <td>filter</td> <td><code>100</code></td> <td>The number of courses listed on each sitemap page.</td> <td><code>includes/seo/class-course-sitemap-provider.php:74</code></td> </tr> <tr> <td><code>learnomy_sitemap_instructors_per_page</code></td> <td>filter</td> <td><code>100</code></td> <td>The number of instructors listed on each sitemap page.</td> <td><code>includes/seo/class-instructor-sitemap-provider.php:103</code></td> </tr> </tbody> </table> <h2>Services</h2> <table> <thead> <tr> <th>Hook</th> <th>Type</th> <th>Arguments</th> <th>What it is for</th> <th>Fired in</th> </tr> </thead> <tbody> <tr> <td><code>learnomy_account_billing_view_data</code></td> <td>filter</td> <td><code>$view_data, $user_id</code></td> <td>Filter the resolved view-data array. Pro extensions can decorate.</td> <td><code>includes/services/view-data/class-account-billing-view-data.php:120</code></td> </tr> <tr> <td><code>learnomy_account_field_multi_types</code></td> <td>filter</td> <td><code>self::MULTI_TYPES</code></td> <td>Filter which account-field types hold multiple values. A custom type.</td> <td><code>includes/services/class-custom-fields.php:86</code></td> </tr> <tr> <td><code>learnomy_account_field_option_types</code></td> <td>filter</td> <td><code>self::OPTION_TYPES</code></td> <td>Filter which account-field types carry an option list.</td> <td><code>includes/services/class-custom-fields.php:102</code></td> </tr> <tr> <td><code>learnomy_account_field_render</code></td> <td>filter</td> <td><code>false, $field, $value</code></td> <td>Render an account field yourself. Echo the markup and return true to.</td> <td><code>includes/services/class-custom-fields.php:279</code></td> </tr> <tr> <td><code>learnomy_account_field_sanitize</code></td> <td>filter</td> <td><code>null, $field, $raw</code></td> <td>Sanitize an account field yourself. Return anything other than null.</td> <td><code>includes/services/class-custom-fields.php:510</code></td> </tr> <tr> <td><code>learnomy_account_field_types</code></td> <td>filter</td> <td><code>self::TYPES</code></td> <td>Filter the account-field types a site accepts.</td> <td><code>includes/services/class-custom-fields.php:67</code></td> </tr> <tr> <td><code>learnomy_after_email_send</code></td> <td>action</td> <td><code>$to, $subject, $template, $user_id, $sent</code></td> <td>Fires immediately after an email send attempt.</td> <td><code>includes/services/class-notification-service.php:528</code></td> </tr> <tr> <td><code>learnomy_allow_guest_checkout</code></td> <td>filter</td> <td><code>$on, $course</code></td> <td>Filters whether guest checkout is allowed for a given course.</td> <td><code>includes/services/class-payment-settings.php:274</code></td> </tr> <tr> <td><code>learnomy_allow_multiple_plan_subscriptions</code></td> <td>filter</td> <td><code>false</code></td> <td>Allow multiple concurrent plan subscriptions per user. Default false:.</td> <td><code>includes/services/class-subscription-service.php:392</code></td> </tr> <tr> <td><code>learnomy_avatar_updated</code></td> <td>action</td> <td><code>$user_id, (int) $attachment_id</code></td> <td>Fires after a member’s avatar changes. Lets caches (CDN, object.</td> <td><code>includes/services/class-avatar-service.php:179</code> (2)</td> </tr> <tr> <td><code>learnomy_before_email_send</code></td> <td>action</td> <td><code>$to, $subject, $template, $user_id</code></td> <td>Fires immediately before an email is sent.</td> <td><code>includes/services/class-notification-service.php:515</code></td> </tr> <tr> <td><code>learnomy_can_access_lesson</code></td> <td>filter</td> <td><code>$available, $user_id, $lesson_id, $lesson</code></td> <td>Gate a lesson’s availability. Pro’s content-drip extension hooks this.</td> <td><code>includes/services/class-lesson-service.php:233</code></td> </tr> <tr> <td><code>learnomy_certificate_asserted_facts</code></td> <td>filter</td> <td><code>$facts, $certificate</code></td> <td>Filter the facts a certificate asserts, as read back for display.</td> <td><code>includes/services/class-certificate-service.php:317</code></td> </tr> <tr> <td><code>learnomy_certificate_designs</code></td> <td>filter</td> <td><code>[]</code></td> <td>The curated certificate designs.</td> <td><code>includes/services/class-certificate-library.php:72</code></td> </tr> <tr> <td><code>learnomy_certificate_issue_snapshot</code></td> <td>filter</td> <td><code>$snapshot, $user_id, $course_id, $context</code></td> <td>Filter the facts recorded on a certificate at issue time.</td> <td><code>includes/services/class-certificate-service.php:199</code></td> </tr> <tr> <td><code>learnomy_certificate_issued</code></td> <td>action</td> <td><code>$certificate_id, $user_id, $course_id</code></td> <td>Fires after a certificate is issued.</td> <td><code>includes/services/class-certificate-service.php:146</code></td> </tr> <tr> <td><code>learnomy_certificate_revoked</code></td> <td>action</td> <td><code>$certificate_id, $certificate</code></td> <td>Fires after a certificate is revoked.</td> <td><code>includes/services/class-certificate-service.php:501</code></td> </tr> <tr> <td><code>learnomy_certificate_verified</code></td> <td>action</td> <td><code>$certificate->id, $uuid</code></td> <td>Fires when a certificate is verified by its public UUID.</td> <td><code>includes/services/class-certificate-service.php:408</code></td> </tr> <tr> <td><code>learnomy_checkout_cancelled_view_data</code></td> <td>filter</td> <td><code>$view_data, $course_id, $plan_id</code></td> <td>Filter the cancelled-flow view data before it reaches the template.</td> <td><code>includes/services/view-data/class-checkout-cancelled-view-data.php:83</code></td> </tr> <tr> <td><code>learnomy_checkout_thank_you_view_data</code></td> <td>filter</td> <td><code>$view_data, $transaction, $user_id</code></td> <td>Filter the thank-you view data before it reaches the template.</td> <td><code>includes/services/view-data/class-checkout-thank-you-view-data.php:522</code></td> </tr> <tr> <td><code>learnomy_commission_calculated</code></td> <td>action</td> <td><code>$transaction_id</code></td> <td>Fires after the commission rows for a sale are written.</td> <td><code>includes/services/class-commission-service.php:352</code> (2)</td> </tr> <tr> <td><code>learnomy_commission_instructor_allocations</code></td> <td>filter</td> <td><code>array( array( 'recipient_id' => $main_author_id, 'amount' => $instructor_pool, 'rate_ap...</code></td> <td>How a sale’s instructor pool is split between instructors.</td> <td><code>includes/services/class-commission-service.php:315</code></td> </tr> <tr> <td><code>learnomy_commission_overpaid</code></td> <td>action</td> <td><code>$overpaid, (int) $original->id, $provider</code></td> <td>Commissions already paid out that a refund has now made excessive.</td> <td><code>includes/services/class-refund-service.php:209</code></td> </tr> <tr> <td><code>learnomy_completion_enforcement</code></td> <td>filter</td> <td><code>$mode, $user_id, $lesson</code></td> <td>Layer 5: filter. Last word on the resolved enforcement mode. Return.</td> <td><code>includes/services/class-progress-service.php:528</code></td> </tr> <tr> <td><code>learnomy_consent_documents</code></td> <td>filter</td> <td><code>$docs</code></td> <td>Filters the legal documents a new member must agree to.</td> <td><code>includes/services/class-consent-service.php:98</code></td> </tr> <tr> <td><code>learnomy_consent_required</code></td> <td>filter</td> <td><code>! empty( self::documents() ), self::documents()</code></td> <td>Filters whether terms acceptance is enforced at registration.</td> <td><code>includes/services/class-consent-service.php:117</code></td> </tr> <tr> <td><code>learnomy_course_access_requirements</code></td> <td>filter</td> <td><code>array(), $course, $user_id</code></td> <td>Course-level requirements gate EVERY lesson in the course.</td> <td><code>includes/services/view-data/class-single-lesson-view-data.php:129</code></td> </tr> <tr> <td><code>learnomy_course_completed</code></td> <td>action</td> <td><code>$enrollment_id, (int) $enrollment->user_id, (int) $enrollment->course_id</code></td> <td>Fires after an enrollment is marked completed.</td> <td><code>includes/services/class-enrollment-service.php:610</code></td> </tr> <tr> <td><code>learnomy_course_completion_type_changed</code></td> <td>action</td> <td><code>$id, $new_type, $was_type</code></td> <td>A course’s completion type changed, so the number of steps it.</td> <td><code>includes/services/class-course-service.php:141</code></td> </tr> <tr> <td><code>learnomy_course_create_data</code></td> <td>filter</td> <td><code>$data, $author_id</code></td> <td>The data a new course is created with.</td> <td><code>includes/services/class-course-service.php:46</code></td> </tr> <tr> <td><code>learnomy_course_created</code></td> <td>action</td> <td><code>$course_id, $data</code></td> <td>Fires after a course is created.</td> <td><code>includes/services/class-course-service.php:62</code></td> </tr> <tr> <td><code>learnomy_course_deleted</code></td> <td>action</td> <td><code>$id</code></td> <td>Fires after a course is deleted.</td> <td><code>includes/services/class-course-service.php:361</code></td> </tr> <tr> <td><code>learnomy_course_duplicated</code></td> <td>action</td> <td><code>$new_course_id, $id</code></td> <td>Fires after a course is duplicated.</td> <td><code>includes/services/class-course-service.php:472</code></td> </tr> <tr> <td><code>learnomy_course_pending_review</code></td> <td>action</td> <td><code>$id</code></td> <td>Fires when a course is sent for admin review instead of being published.</td> <td><code>includes/services/class-course-service.php:171</code></td> </tr> <tr> <td><code>learnomy_course_published</code></td> <td>action</td> <td><code>$course_id</code></td> <td>Fires when a course is published, including when it is created already published.</td> <td><code>includes/services/class-course-service.php:73</code> (3)</td> </tr> <tr> <td><code>learnomy_course_restarted</code></td> <td>action</td> <td><code>$user_id, $course_id</code></td> <td>Fires after a learner restarts a course and their certificates for it are revoked.</td> <td><code>includes/services/class-progress-service.php:588</code></td> </tr> <tr> <td><code>learnomy_course_retaken</code></td> <td>action</td> <td><code>$user_id, $course_id, $reset_progress</code></td> <td>Fires after a student has successfully re-entered a course.</td> <td><code>includes/services/class-enrollment-service.php:660</code></td> </tr> <tr> <td><code>learnomy_course_update_data</code></td> <td>filter</td> <td><code>$data, $id</code></td> <td>The data a course is updated with.</td> <td><code>includes/services/class-course-service.php:88</code></td> </tr> <tr> <td><code>learnomy_course_updated</code></td> <td>action</td> <td><code>$id, $data</code></td> <td>Fires after a course is updated.</td> <td><code>includes/services/class-course-service.php:123</code></td> </tr> <tr> <td><code>learnomy_courses_per_page</code></td> <td>filter</td> <td><code>$per_page</code></td> <td>Filter the catalog page size.</td> <td><code>includes/services/view-data/class-catalog-view-data.php:62</code> (2)</td> </tr> <tr> <td><code>learnomy_dashboard_widgets</code></td> <td>filter</td> <td><code>array(), $surface, $context</code></td> <td>The dashboard widgets contributed for a surface.</td> <td><code>includes/services/class-dashboard-widget-registry.php:64</code></td> </tr> <tr> <td><code>learnomy_demo_data_cleaned</code></td> <td>action</td> <td><code>$manifest, $reassign_to</code></td> <td>Fires after demo data is removed.</td> <td><code>includes/services/class-setup-service.php:190</code> (2)</td> </tr> <tr> <td><code>learnomy_demo_data_seeded</code></td> <td>action</td> <td><code>$manifest, $admin_id</code></td> <td>Fires after demo data is created.</td> <td><code>includes/services/class-setup-service.php:155</code></td> </tr> <tr> <td><code>learnomy_email_body</code></td> <td>filter</td> <td><code>$body, $template, $user_id, $data</code></td> <td>The HTML body of a notification email.</td> <td><code>includes/services/class-notification-service.php:497</code></td> </tr> <tr> <td><code>learnomy_email_headers</code></td> <td>filter</td> <td><code>$headers, $template, $user_id</code></td> <td>The headers of a notification email.</td> <td><code>includes/services/class-notification-service.php:505</code></td> </tr> <tr> <td><code>learnomy_email_subject</code></td> <td>filter</td> <td><code>$subject, $template, $user_id, $data</code></td> <td>The subject of a notification email.</td> <td><code>includes/services/class-notification-service.php:488</code></td> </tr> <tr> <td><code>learnomy_email_template_groups</code></td> <td>filter</td> <td><code>$map</code></td> <td>Filter the email toggle groups.</td> <td><code>includes/services/class-notification-service.php:631</code></td> </tr> <tr> <td><code>learnomy_email_template_types</code></td> <td>filter</td> <td><code>array( 'enrollment' => __( 'Enrollment Welcome', 'learnomy' ), /* translators: %s: sing...</code></td> <td>The notification email templates a site owner can customise.</td> <td><code>includes/services/class-notification-service.php:671</code></td> </tr> <tr> <td><code>learnomy_email_to</code></td> <td>filter</td> <td><code>$user->user_email, $template, $user_id, $data</code></td> <td>The recipient address of a notification email.</td> <td><code>includes/services/class-notification-service.php:479</code></td> </tr> <tr> <td><code>learnomy_expo_push_message</code></td> <td>filter</td> <td><code>array( 'to' => $token, 'title' => $title, 'body' => $body, 'sound' => 'default', 'data'...</code></td> <td>Filter one Expo push message before it is sent.</td> <td><code>includes/services/class-expo-push-transport.php:84</code></td> </tr> <tr> <td><code>learnomy_external_purchase_completed</code></td> <td>action</td> <td><code>$txn_id, $user_id, $type, $ext, $gateway</code></td> <td>Legacy hook that fires after a purchase that is neither a course nor a membership completes.</td> <td><code>includes/services/class-purchase-recorder.php:320</code></td> </tr> <tr> <td><code>learnomy_grading_queue_sources</code></td> <td>filter</td> <td><code>array(), $course_ids, $status, $fetch</code></td> <td>Extra sources of items for the grading queue.</td> <td><code>includes/services/class-grading-service.php:167</code> (2)</td> </tr> <tr> <td><code>learnomy_instructor_courses_reassigned</code></td> <td>action</td> <td><code>$user_id, $target, $count</code></td> <td>Fires after a deleted instructor’s courses are reassigned.</td> <td><code>includes/services/class-user-cleanup-service.php:171</code></td> </tr> <tr> <td><code>learnomy_instructor_create_course_url</code></td> <td>filter</td> <td><code>admin_url( 'admin.php?page=learnomy-new-course' )</code></td> <td>The URL of the instructor dashboard create-course link.</td> <td><code>includes/services/view-data/class-instructor-dashboard-view-data.php:185</code> (3)</td> </tr> <tr> <td><code>learnomy_instructor_student_detail</code></td> <td>filter</td> <td><code>$student, $is_admin</code></td> <td>Filter one student’s instructor-facing detail record. Companion to.</td> <td><code>includes/services/view-data/class-instructor-students-view-data.php:239</code></td> </tr> <tr> <td><code>learnomy_instructor_students_list</code></td> <td>filter</td> <td><code>$students, $scope_course_ids, null === $scope_course_ids</code></td> <td>Filter the instructor roster rows before render. An extension can.</td> <td><code>includes/services/view-data/class-instructor-students-view-data.php:144</code></td> </tr> <tr> <td><code>learnomy_instructor_suspension_blocks_sources</code></td> <td>filter</td> <td><code>array( 'free' ), $course_id, $user_id</code></td> <td>Enrollment sources a suspended instructor still blocks.</td> <td><code>includes/services/class-enrollment-service.php:198</code></td> </tr> <tr> <td><code>learnomy_lesson_access_requirements</code></td> <td>filter</td> <td><code>array(), $lesson, $course, $user_id</code></td> <td>Filter extra lesson-access requirements layered on top of enrollment.</td> <td><code>includes/services/view-data/class-single-lesson-view-data.php:117</code></td> </tr> <tr> <td><code>learnomy_lesson_attachment_downloaded</code></td> <td>action</td> <td><code>$attachment_id, (int) $row->lesson_id, get_current_user_id()</code></td> <td>Fires immediately before a handout’s bytes go out, after the.</td> <td><code>includes/services/class-attachment-download.php:91</code></td> </tr> <tr> <td><code>learnomy_lesson_body_fields</code></td> <td>filter</td> <td><code>array( 'content', 'content_html', 'content_plain', 'video_url' )</code></td> <td>Fields that count as a lesson’s renderable body.</td> <td><code>includes/services/class-lesson-service.php:504</code></td> </tr> <tr> <td><code>learnomy_lesson_comments_enabled</code></td> <td>filter</td> <td><code>$global_lesson_comments, $lesson, $course</code></td> <td>Whether comments are enabled on a lesson in the lesson player.</td> <td><code>includes/services/view-data/class-single-lesson-view-data.php:396</code></td> </tr> <tr> <td><code>learnomy_lesson_completed</code></td> <td>action</td> <td><code>$user_id, $lesson_id, $course_id</code></td> <td>Fires after a learner completes a lesson.</td> <td><code>includes/services/class-progress-service.php:129</code></td> </tr> <tr> <td><code>learnomy_lesson_completion_rules</code></td> <td>filter</td> <td><code>$status, $user_id, $lesson</code></td> <td>A lesson’s completion status and requirements for a learner.</td> <td><code>includes/services/class-progress-service.php:468</code></td> </tr> <tr> <td><code>learnomy_lesson_copied</code></td> <td>action</td> <td><code>$new_id, $lesson_id, (int) $section->course_id</code></td> <td>Fires after a lesson is copied.</td> <td><code>includes/services/class-lesson-service.php:645</code></td> </tr> <tr> <td><code>learnomy_lesson_deleted</code></td> <td>action</td> <td><code>$lesson_id, $course_id</code></td> <td>Fires after a lesson is deleted.</td> <td><code>includes/services/class-lesson-service.php:570</code></td> </tr> <tr> <td><code>learnomy_lesson_media_served</code></td> <td>action</td> <td><code>$lesson_id, $media_id, get_current_user_id()</code></td> <td>Fires after a lesson’s primary media passes its permission check.</td> <td><code>includes/services/class-lesson-media-download.php:65</code></td> </tr> <tr> <td><code>learnomy_lesson_standard_completion</code></td> <td>filter</td> <td><code>null, $user_id, $lesson</code></td> <td>Whether a learner has met the completion rule of a SCORM, cmi5 or LTI lesson.</td> <td><code>includes/services/class-progress-service.php:381</code></td> </tr> <tr> <td><code>learnomy_lesson_unlock_date</code></td> <td>filter</td> <td><code>$unlocks_at, (int) $lesson->id, (int) $user_id, $course</code></td> <td>The date a locked, dripped lesson unlocks for the viewer.</td> <td><code>includes/services/view-data/class-single-lesson-view-data.php:304</code> (2)</td> </tr> <tr> <td><code>learnomy_manual_graded_types</code></td> <td>filter</td> <td><code>array( 'essay' )</code></td> <td>The question types that need manual grading.</td> <td><code>includes/services/class-quiz-service.php:657</code></td> </tr> <tr> <td><code>learnomy_media_protected</code></td> <td>action</td> <td><code>$media_id, $relative</code></td> <td>Fires after a media item’s bytes have moved into the protected store.</td> <td><code>includes/services/class-protected-uploads.php:592</code></td> </tr> <tr> <td><code>learnomy_membership_cancelled</code></td> <td>action</td> <td><code>$subscription_id, (int) $sub->user_id, (int) $sub->plan_id</code></td> <td>Plan-context subscription cancelled.</td> <td><code>includes/services/class-subscription-service.php:952</code></td> </tr> <tr> <td><code>learnomy_membership_change_plan_in_place</code></td> <td>filter</td> <td><code>false, $sub</code></td> <td>Whether this membership can be switched to another plan in place.</td> <td><code>includes/services/class-subscription-service.php:196</code></td> </tr> <tr> <td><code>learnomy_membership_created</code></td> <td>action</td> <td><code>$subscription_id, $user_id, $plan_id</code></td> <td>Plan-context subscription created.</td> <td><code>includes/services/class-subscription-service.php:369</code></td> </tr> <tr> <td><code>learnomy_membership_expired</code></td> <td>action</td> <td><code>$subscription_id, (int) $sub->user_id, (int) $sub->plan_id</code></td> <td>Plan-context subscription expired.</td> <td><code>includes/services/class-subscription-service.php:1371</code></td> </tr> <tr> <td><code>learnomy_membership_has_access</code></td> <td>filter</td> <td><code>$access, $user_id, $course_id, $active_subs</code></td> <td>Let Pro (Spaces, entitlement caps, geographic restrictions) enhance.</td> <td><code>includes/services/class-subscription-service.php:1399</code> (2)</td> </tr> <tr> <td><code>learnomy_membership_manage_actions</code></td> <td>filter</td> <td><code>$actions, $sub</code></td> <td>Filter the action buttons shown on the manage page. Pro adds.</td> <td><code>includes/services/view-data/class-membership-manage-view-data.php:266</code></td> </tr> <tr> <td><code>learnomy_membership_renewed</code></td> <td>action</td> <td><code>$subscription_id, (int) $sub->user_id, (int) $sub->plan_id</code></td> <td></td> <td><code>includes/services/class-subscription-service.php:1221</code></td> </tr> <tr> <td><code>learnomy_notification_pref_buckets</code></td> <td>filter</td> <td><code>$map</code></td> <td>Map notification types to learner email-preference buckets. Extensions.</td> <td><code>includes/services/class-notification-service.php:1040</code></td> </tr> <tr> <td><code>learnomy_notifications_always_send</code></td> <td>filter</td> <td><code>self::ALWAYS_SEND, $type</code></td> <td>Types that still send when the Notifications module is off.</td> <td><code>includes/services/class-notification-service.php:68</code></td> </tr> <tr> <td><code>learnomy_notifications_async</code></td> <td>filter</td> <td><code>true</code></td> <td>Whether notification delivery is queued through Action Scheduler instead of running inline.</td> <td><code>includes/services/class-notification-service.php:381</code></td> </tr> <tr> <td><code>learnomy_object_integrations</code></td> <td>filter</td> <td><code>array(), $type, $id</code></td> <td>Register a product that can give this object a community or discussion.</td> <td><code>includes/services/class-object-integration-registry.php:93</code></td> </tr> <tr> <td><code>learnomy_payment_completed</code></td> <td>action</td> <td><code>$txn_id, $user_id, $gateway</code></td> <td>Fires after a purchase of any type completes.</td> <td><code>includes/services/class-purchase-recorder.php:330</code></td> </tr> <tr> <td><code>learnomy_payment_refunded</code></td> <td>action</td> <td><code>(int) $original->id, $amount, $provider, $is_full_refund</code></td> <td>Fires after a refund is recorded against a sale.</td> <td><code>includes/services/class-refund-service.php:220</code></td> </tr> <tr> <td><code>learnomy_paypal_manage_url</code></td> <td>filter</td> <td><code>'https://www.paypal.com/myaccount/autopay/', $sub</code></td> <td>The URL where a PayPal subscriber manages their subscription.</td> <td><code>includes/services/view-data/class-membership-manage-view-data.php:150</code></td> </tr> <tr> <td><code>learnomy_pre_enroll</code></td> <td>filter</td> <td><code>true, $user_id, $course_id, $source</code></td> <td>Whether a user may be enrolled in a course.</td> <td><code>includes/services/class-enrollment-service.php:230</code></td> </tr> <tr> <td><code>learnomy_provision_enrollments</code></td> <td>filter</td> <td><code>array(), $user_id, $context</code></td> <td>Course IDs to auto-enroll a provisioned user into (empty = none).</td> <td><code>includes/services/class-provisioning-service.php:191</code></td> </tr> <tr> <td><code>learnomy_provision_role</code></td> <td>filter</td> <td><code>'lrn_student', $user_id, $context</code></td> <td>The role a newly provisioned user receives. Return ‘’ to skip.</td> <td><code>includes/services/class-provisioning-service.php:170</code></td> </tr> <tr> <td><code>learnomy_purchase_completed</code></td> <td>action</td> <td><code>$txn_id, $user_id, $type, $item_id, $ext, $gateway</code></td> <td>A purchase completed and was recorded. THE canonical fulfilment event.</td> <td><code>includes/services/class-purchase-recorder.php:305</code></td> </tr> <tr> <td><code>learnomy_purchase_enrollment_failed</code></td> <td>action</td> <td><code>$user_id, $course_id, $result, $provider, $context</code></td> <td>Fires when a completed payment did not result in a course enrollment.</td> <td><code>includes/services/class-enrollment-service.php:422</code></td> </tr> <tr> <td><code>learnomy_push_message</code></td> <td>filter</td> <td><code>array( 'token' => $device_token, 'notification' => array( 'title' => $title, 'body' => ...</code></td> <td>Filter the FCM message before it is sent.</td> <td><code>includes/services/class-push-service.php:146</code></td> </tr> <tr> <td><code>learnomy_push_sent</code></td> <td>action</td> <td><code>$token, $title</code></td> <td>Fires after a push notification is delivered to a device.</td> <td><code>includes/services/class-expo-push-transport.php:134</code> (2)</td> </tr> <tr> <td><code>learnomy_quiz_auto_grade_result</code></td> <td>filter</td> <td><code>$result, $attempt_id</code></td> <td>The automatic grading result of a quiz attempt.</td> <td><code>includes/services/class-quiz-service.php:763</code></td> </tr> <tr> <td><code>learnomy_quiz_deleted</code></td> <td>action</td> <td><code>$quiz_id, $course_id</code></td> <td>Fires after a quiz and its attempts, responses and slots are gone.</td> <td><code>includes/services/class-quiz-service.php:482</code></td> </tr> <tr> <td><code>learnomy_quiz_deleting</code></td> <td>action</td> <td><code>$quiz_id, $course_id</code></td> <td>Fires BEFORE a quiz’s cascade runs, while its slots, attempts and.</td> <td><code>includes/services/class-quiz-service.php:450</code></td> </tr> <tr> <td><code>learnomy_quiz_failed</code></td> <td>action</td> <td><code>$attempt_id, $user_id, $quiz_id, $score</code></td> <td>Fires when a quiz attempt is finally graded as failed.</td> <td><code>includes/services/class-quiz-service.php:1013</code></td> </tr> <tr> <td><code>learnomy_quiz_graded</code></td> <td>action</td> <td><code>$attempt_id, (int) $attempt->user_id, (int) $attempt->quiz_id</code></td> <td>Fires after the last manual grade is saved and the attempt is finalised as graded.</td> <td><code>includes/services/class-quiz-service.php:1348</code></td> </tr> <tr> <td><code>learnomy_quiz_inherits_lesson_lock</code></td> <td>filter</td> <td><code>true, $quiz, $user_id</code></td> <td>Whether a quiz inherits the lock state of the lesson it is bound to.</td> <td><code>includes/services/class-quiz-service.php:1479</code></td> </tr> <tr> <td><code>learnomy_quiz_pass_score</code></td> <td>filter</td> <td><code>$pass_score, $attempt_id, (int) $attempt->quiz_id</code></td> <td>The pass mark a quiz is graded against, in percent.</td> <td><code>includes/services/class-quiz-service.php:294</code> (3)</td> </tr> <tr> <td><code>learnomy_quiz_passed</code></td> <td>action</td> <td><code>$attempt_id, $user_id, $quiz_id, $score</code></td> <td>Fires when a quiz attempt is finally graded as passed.</td> <td><code>includes/services/class-quiz-service.php:1003</code></td> </tr> <tr> <td><code>learnomy_quiz_question_answered</code></td> <td>action</td> <td><code>$question_id, $response, $is_correct, $attempt_id</code></td> <td>Fires once per answered question, immediately after the response row is.</td> <td><code>includes/services/class-quiz-service.php:251</code></td> </tr> <tr> <td><code>learnomy_quiz_started</code></td> <td>action</td> <td><code>$attempt_id, $user_id, $quiz_id</code></td> <td>Fires after a quiz attempt is started.</td> <td><code>includes/services/class-quiz-service.php:190</code></td> </tr> <tr> <td><code>learnomy_quiz_submitted</code></td> <td>action</td> <td><code>$attempt_id, (int) $attempt->user_id, (int) $attempt->quiz_id</code></td> <td>Fires after a quiz attempt is submitted.</td> <td><code>includes/services/class-quiz-service.php:347</code></td> </tr> <tr> <td><code>learnomy_refund_partial_revocation</code></td> <td>action</td> <td><code>$notice, $original, (int) $refund_id</code></td> <td>A full refund could not fully revoke what was sold.</td> <td><code>includes/services/class-refund-service.php:170</code></td> </tr> <tr> <td><code>learnomy_registration_captcha_enabled</code></td> <td>filter</td> <td><code>$on</code></td> <td>Filter whether the built-in signup captcha runs.</td> <td><code>includes/services/class-registration-captcha.php:83</code></td> </tr> <tr> <td><code>learnomy_review_submitted</code></td> <td>action</td> <td><code>$review_id, $user_id, $course_id</code></td> <td>Fires after a course review is saved.</td> <td><code>includes/services/class-review-service.php:78</code></td> </tr> <tr> <td><code>learnomy_route_conflict_force_ownership</code></td> <td>filter</td> <td><code>false</code></td> <td>Whether Learnomy’s rewrite rules should outrank every other plugin’s.</td> <td><code>includes/services/class-route-conflicts.php:280</code></td> </tr> <tr> <td><code>learnomy_section_deleted</code></td> <td>action</td> <td><code>$section_id, $course_id</code></td> <td>Fires after a section and everything it owned have been removed.</td> <td><code>includes/services/class-course-service.php:411</code></td> </tr> <tr> <td><code>learnomy_send_notification</code></td> <td>action</td> <td><code>$user_id, $type, $data, \Learnomy\Notifications\Community_Notification_Contract::build(...</code></td> <td>Fires after a notification is created (in-app row + optional email).</td> <td><code>includes/services/class-notification-service.php:273</code></td> </tr> <tr> <td><code>learnomy_sender_email</code></td> <td>filter</td> <td><code>''</code></td> <td>Filter the resolved sender address before WordPress’s default is kept.</td> <td><code>includes/services/class-notification-service.php:905</code></td> </tr> <tr> <td><code>learnomy_sender_name</code></td> <td>filter</td> <td><code>''</code></td> <td>Filter the resolved sender name before WordPress’s default is kept.</td> <td><code>includes/services/class-notification-service.php:861</code></td> </tr> <tr> <td><code>learnomy_setup_completed</code></td> <td>action</td> <td><code>$settings</code></td> <td>Fires when the setup wizard is completed.</td> <td><code>includes/services/class-setup-service.php:97</code></td> </tr> <tr> <td><code>learnomy_should_stop_provider_billing</code></td> <td>filter</td> <td><code>true, $sub</code></td> <td>Whether to tell the gateway to stop billing this subscription.</td> <td><code>includes/services/class-subscription-service.php:719</code></td> </tr> <tr> <td><code>learnomy_student_access_restored</code></td> <td>action</td> <td><code>$enrollment_id, (int) $enrollment->user_id, (int) $enrollment->course_id</code></td> <td>Fires when a previously revoked enrolment is given access back.</td> <td><code>includes/services/class-enrollment-service.php:585</code></td> </tr> <tr> <td><code>learnomy_student_enrolled</code></td> <td>action</td> <td><code>(int) $existing->id, $user_id, $course_id, $source</code></td> <td>Fires after a student is enrolled in a course, including when an earlier enrollment is reactivated.</td> <td><code>includes/services/class-enrollment-service.php:348</code> (2)</td> </tr> <tr> <td><code>learnomy_student_unenrolled</code></td> <td>action</td> <td><code>$enrollment_id, (int) $enrollment->user_id, (int) $enrollment->course_id</code></td> <td>Fires after an enrollment is ended.</td> <td><code>includes/services/class-enrollment-service.php:522</code></td> </tr> <tr> <td><code>learnomy_subscription_approved</code></td> <td>action</td> <td><code>$subscription_id, (int) $sub->user_id, (int) $sub->plan_id, 'plan'</code></td> <td>Fires after an admin approves a pending subscription.</td> <td><code>includes/services/class-subscription-service.php:636</code></td> </tr> <tr> <td><code>learnomy_subscription_cancelled</code></td> <td>action</td> <td><code>$subscription_id, (int) $sub->user_id, $target_id, $immediate, $context_type</code></td> <td>Fires after a subscription is cancelled.</td> <td><code>includes/services/class-subscription-service.php:927</code></td> </tr> <tr> <td><code>learnomy_subscription_created</code></td> <td>action</td> <td><code>$subscription_id, $user_id, $plan_id, 'plan'</code></td> <td>Fires after a plan subscription is created and active.</td> <td><code>includes/services/class-subscription-service.php:356</code> (2)</td> </tr> <tr> <td><code>learnomy_subscription_declined</code></td> <td>action</td> <td><code>$subscription_id, (int) $sub->user_id, (int) $sub->plan_id, 'plan'</code></td> <td>Fires after an admin declines a pending subscription.</td> <td><code>includes/services/class-subscription-service.php:662</code></td> </tr> <tr> <td><code>learnomy_subscription_expired</code></td> <td>action</td> <td><code>$subscription_id, (int) $sub->user_id, $target_id, $context_type</code></td> <td>Fires after a subscription expires and its access is revoked.</td> <td><code>includes/services/class-subscription-service.php:1357</code></td> </tr> <tr> <td><code>learnomy_subscription_past_due</code></td> <td>action</td> <td><code>$subscription_id, (int) $sub->user_id, $target_id, $failure_reason, $context_type</code></td> <td>Fires after a subscription renewal payment fails and it becomes past due.</td> <td><code>includes/services/class-subscription-service.php:1287</code></td> </tr> <tr> <td><code>learnomy_subscription_paused</code></td> <td>action</td> <td><code>$subscription_id, (int) ( $sub->user_id ?? 0 ), (int) ( $sub->plan_id ?? 0 ), (string) ...</code></td> <td>Fires after a subscription is marked paused. THE one place this fires:.</td> <td><code>includes/services/class-subscription-service.php:1073</code></td> </tr> <tr> <td><code>learnomy_subscription_pending</code></td> <td>action</td> <td><code>$subscription_id, $user_id, $plan_id, 'plan'</code></td> <td>Fires when a subscription is created and is waiting for admin approval.</td> <td><code>includes/services/class-subscription-service.php:332</code></td> </tr> <tr> <td><code>learnomy_subscription_plan_changed</code></td> <td>action</td> <td><code>$subscription_id, $old_price_id, $new_price_id, $context</code></td> <td>Fires after a subscription’s billed price changes. Pro extensions.</td> <td><code>includes/services/class-subscription-service.php:1162</code></td> </tr> <tr> <td><code>learnomy_subscription_renewed</code></td> <td>action</td> <td><code>$subscription_id, (int) $sub->user_id, $target_id, $context_type</code></td> <td>Fires after a subscription renews.</td> <td><code>includes/services/class-subscription-service.php:1207</code></td> </tr> <tr> <td><code>learnomy_subscription_resumed</code></td> <td>action</td> <td><code>$subscription_id, (int) $sub->user_id, $target_id, $context_type</code></td> <td>Fires after a subscription is resumed.</td> <td><code>includes/services/class-subscription-service.php:989</code></td> </tr> <tr> <td><code>learnomy_subscription_status_labels</code></td> <td>filter</td> <td><code>[ 'pending' => __( 'Awaiting approval', 'learnomy' ), 'trialing' => __( 'In trial', 'le...</code></td> <td>Filter the subscription status → UI label map.</td> <td><code>includes/services/class-subscription-service.php:1763</code></td> </tr> <tr> <td><code>learnomy_subscription_trial_ended</code></td> <td>action</td> <td><code>$subscription_id, (int) $sub->user_id, (int) $sub->plan_id, 'plan'</code></td> <td>Fires after a subscription trial ends and the subscription becomes active.</td> <td><code>includes/services/class-subscription-service.php:565</code></td> </tr> <tr> <td><code>learnomy_suppress_notifications</code></td> <td>filter</td> <td><code>false, $type, $user_id, $data</code></td> <td>Short-circuit a notification (in-app + email) before anything is.</td> <td><code>includes/services/class-notification-service.php:87</code></td> </tr> <tr> <td><code>learnomy_suppress_webhooks</code></td> <td>filter</td> <td><code>false, $event, $payload</code></td> <td>Short-circuit outbound webhook delivery.</td> <td><code>includes/services/class-webhook-service.php:38</code></td> </tr> <tr> <td><code>learnomy_tab_switch_auto_submit_limit</code></td> <td>filter</td> <td><code>$limit, $quiz</code></td> <td>Filter the tab-switch auto-submit limit (0 = off), e.g. to vary it.</td> <td><code>includes/services/class-quiz-defaults.php:139</code></td> </tr> <tr> <td><code>learnomy_tab_switch_flag_threshold</code></td> <td>filter</td> <td><code>3, $attempt, $quiz</code></td> <td>The number of tab switches at which a quiz attempt is flagged.</td> <td><code>includes/services/class-grading-service.php:422</code></td> </tr> <tr> <td><code>learnomy_thank_you_polling_limit_seconds</code></td> <td>filter</td> <td><code>90</code></td> <td>Seconds the thank-you page keeps checking before it tells the buyer the payment is not confirmed.</td> <td><code>includes/services/view-data/class-checkout-thank-you-view-data.php:560</code></td> </tr> <tr> <td><code>learnomy_thank_you_polling_seconds</code></td> <td>filter</td> <td><code>3</code></td> <td>Seconds between status checks on the thank-you page while a payment is still pending.</td> <td><code>includes/services/view-data/class-checkout-thank-you-view-data.php:535</code></td> </tr> <tr> <td><code>learnomy_update_payment_hint</code></td> <td>filter</td> <td><code>$hint, $sub</code></td> <td>The URL where a member updates the payment method of a subscription.</td> <td><code>includes/services/view-data/class-membership-manage-view-data.php:194</code></td> </tr> <tr> <td><code>learnomy_update_payment_url</code></td> <td>filter</td> <td><code>$url, $sub</code></td> <td>The URL where a member updates the payment method of a subscription.</td> <td><code>includes/services/view-data/class-membership-manage-view-data.php:187</code></td> </tr> <tr> <td><code>learnomy_user_data_purged</code></td> <td>action</td> <td><code>$user_id, $summary</code></td> <td>Fires after a user’s Learnomy data is purged.</td> <td><code>includes/services/class-user-cleanup-service.php:328</code></td> </tr> <tr> <td><code>learnomy_user_provisioned</code></td> <td>action</td> <td><code>(int) $user_id, array_merge( array( 'source' => 'ensure_user_by_email' ), $args )</code></td> <td>Fires after an account is created for a buyer who had none, so role and enrollment listeners can run.</td> <td><code>includes/services/class-provisioning-service.php:110</code> (2)</td> </tr> <tr> <td><code>learnomy_validate_enrollment_source</code></td> <td>filter</td> <td><code>$unclaimed, $source, $user_id, $course_id, $access_type</code></td> <td>Lets an extension validate an enrollment source Learnomy does not recognise.</td> <td><code>includes/services/class-enrollment-service.php:884</code></td> </tr> <tr> <td><code>learnomy_video_max_playback_rate</code></td> <td>filter</td> <td><code>2.0, $lesson</code></td> <td>Fastest playback rate a student could plausibly have used. The bundled.</td> <td><code>includes/services/class-progress-service.php:812</code></td> </tr> <tr> <td><code>learnomy_video_watch_ceiling_pct</code></td> <td>filter</td> <td><code>$ceiling, $lesson, $progress_row</code></td> <td>Last word on the watch ceiling. The escape hatch for a site whose.</td> <td><code>includes/services/class-progress-service.php:828</code></td> </tr> <tr> <td><code>learnomy_webhook_event_map</code></td> <td>filter</td> <td><code>$map</code></td> <td>Filter the outbound webhook event catalogue.</td> <td><code>includes/services/class-webhook-events.php:113</code></td> </tr> <tr> <td><code>learnomy_webhooks_core_dispatch_enabled</code></td> <td>filter</td> <td><code>true</code></td> <td>Whether the core (Free) webhook dispatcher should wire itself to.</td> <td><code>includes/services/class-webhook-events.php:144</code></td> </tr> <tr> <td><code>learnomy_withdrawal_requested</code></td> <td>action</td> <td><code>$withdrawal_id, $instructor_id, $settled</code></td> <td>Fires after an instructor withdrawal is requested.</td> <td><code>includes/services/class-commission-service.php:695</code></td> </tr> </tbody> </table> <h2>Templates</h2> <table> <thead> <tr> <th>Hook</th> <th>Type</th> <th>Arguments</th> <th>What it is for</th> <th>Fired in</th> </tr> </thead> <tbody> <tr> <td><code>learnomy_account_billing_rendered</code></td> <td>action</td> <td><code>get_current_user_id()</code></td> <td>Fires after the billing page renders. Pro extensions hook here for.</td> <td><code>templates/account-billing.php:373</code></td> </tr> <tr> <td><code>learnomy_account_fields</code></td> <td>action</td> <td><code>0, 'registration_instructor'</code></td> <td>Fires in the instructor registration form to render extra fields.</td> <td><code>templates/register-instructor.php:229</code> (4)</td> </tr> <tr> <td><code>learnomy_account_nav_sections</code></td> <td>filter</td> <td><code>array( 'learning' => __( 'Learning', 'learnomy' ), 'account' => __( 'Account', 'learnom...</code></td> <td>Filter the account-nav sections - ordered section-key => label. Drives both.</td> <td><code>templates/partials/account-nav.php:59</code></td> </tr> <tr> <td><code>learnomy_cancelled_rendered</code></td> <td>action</td> <td><code>$course_id, $plan_id</code></td> <td>Fires after the cancelled page has rendered. Pro extensions can hook.</td> <td><code>templates/checkout-cancelled.php:91</code></td> </tr> <tr> <td><code>learnomy_catalog_access_notices</code></td> <td>filter</td> <td><code>array( 'not_your_course' => sprintf( /* translators: 1: singular Course label, 2: singu...</code></td> <td>The notices the catalog shows for each access reason.</td> <td><code>templates/catalog/partials/access-notice.php:28</code></td> </tr> <tr> <td><code>learnomy_catalog_filter_facets</code></td> <td>action</td> <td><code>$current_cat</code></td> <td>Hookable facet region in the catalog sidebar. Extensions (or Pro).</td> <td><code>templates/catalog/sidebar.php:140</code></td> </tr> <tr> <td><code>learnomy_certificate_verify_after</code></td> <td>action</td> <td><code>$certificate</code></td> <td>Fires after the verified certificate result block. Extensions use.</td> <td><code>templates/certificate-verify.php:246</code></td> </tr> <tr> <td><code>learnomy_certificate_verify_head</code></td> <td>action</td> <td><code>$certificate</code></td> <td>Fires in the verify page head region for a valid certificate.</td> <td><code>templates/certificate-verify.php:51</code></td> </tr> <tr> <td><code>learnomy_closed_cta</code></td> <td>filter</td> <td><code>$lrn_closed_html, $course, get_current_user_id()</code></td> <td>Override the closed-course CTA HTML.</td> <td><code>templates/course/partials/enroll-card.php:292</code></td> </tr> <tr> <td><code>learnomy_course_after_content</code></td> <td>action</td> <td><code>$course</code></td> <td>Placement region below the course body.</td> <td><code>templates/course/hero.php:191</code> (4)</td> </tr> <tr> <td><code>learnomy_course_before_content</code></td> <td>action</td> <td><code>$course</code></td> <td>Placement region above the course body (sponsor / CTA / related).</td> <td><code>templates/course/hero.php:165</code> (4)</td> </tr> <tr> <td><code>learnomy_course_card_badges</code></td> <td>action</td> <td><code>$course</code></td> <td>Fires inside the course card badge row so Surface A (sales.</td> <td><code>templates/partials/course-card.php:239</code></td> </tr> <tr> <td><code>learnomy_course_card_meta</code></td> <td>action</td> <td><code>$course</code></td> <td>Per-card taxonomy / meta slot. Catalog Facets framework subscribers.</td> <td><code>templates/partials/course-card.php:253</code></td> </tr> <tr> <td><code>learnomy_course_comments_enabled</code></td> <td>filter</td> <td><code>$course_comments_on && $site_comments_on, $course</code></td> <td>Whether the course comments section is shown.</td> <td><code>templates/course/partials/body.php:230</code></td> </tr> <tr> <td><code>learnomy_course_qa_section</code></td> <td>action</td> <td><code>$course</code></td> <td>Fires inside the course sales page Q&A section when.</td> <td><code>templates/course/partials/body.php:438</code></td> </tr> <tr> <td><code>learnomy_course_sidebar_bottom</code></td> <td>action</td> <td><code>$course</code></td> <td>Bottom of the course sidebar.</td> <td><code>templates/course/classic.php:119</code> (2)</td> </tr> <tr> <td><code>learnomy_course_sidebar_card_footer</code></td> <td>action</td> <td><code>$course</code></td> <td>Fires at the bottom of the single-course sidebar card, after the enrol/manage.</td> <td><code>templates/course/partials/enroll-card.php:648</code></td> </tr> <tr> <td><code>learnomy_course_sidebar_top</code></td> <td>action</td> <td><code>$course</code></td> <td>Top of the course sidebar (sponsor / CTA / related). Fires on every.</td> <td><code>templates/course/classic.php:106</code> (2)</td> </tr> <tr> <td><code>learnomy_dashboard_tab_buttons</code></td> <td>action</td> <td></td> <td>Legacy extension point - kept for modules that registered tabs.</td> <td><code>templates/dashboard-widgets/student/enrollments.php:97</code></td> </tr> <tr> <td><code>learnomy_dashboard_tab_panels</code></td> <td>action</td> <td></td> <td>Legacy panel extension point for modules registered against.</td> <td><code>templates/dashboard-widgets/student/enrollments.php:224</code></td> </tr> <tr> <td><code>learnomy_instructor_manage_courses_url</code></td> <td>filter</td> <td><code>admin_url( 'admin.php?page=learnomy-courses' )</code></td> <td>The URL of the manage-all link in the My Courses widget.</td> <td><code>templates/dashboard-widgets/instructor/my-courses.php:78</code></td> </tr> <tr> <td><code>learnomy_instructor_payout_setup</code></td> <td>action</td> <td><code>get_current_user_id()</code></td> <td>Payout-account setup slot. A payout integration (Pro Stripe Connect) renders.</td> <td><code>templates/dashboard-widgets/instructor/earnings.php:60</code></td> </tr> <tr> <td><code>learnomy_instructor_sections</code></td> <td>filter</td> <td><code>$lrn_sections</code></td> <td>Filter the instructor rail sections so a Pro extension can register its own.</td> <td><code>templates/instructor-section.php:68</code></td> </tr> <tr> <td><code>learnomy_instructor_withdraw_block_reason</code></td> <td>filter</td> <td><code>'', get_current_user_id()</code></td> <td>A reason that blocks the instructor from requesting a withdrawal.</td> <td><code>templates/dashboard-widgets/instructor/earnings.php:23</code></td> </tr> <tr> <td><code>learnomy_invoice_pdf_url</code></td> <td>filter</td> <td><code>$default_pdf_url, $invoice</code></td> <td></td> <td><code>templates/partials/membership-invoice-row.php:63</code></td> </tr> <tr> <td><code>learnomy_lesson_access_gate</code></td> <td>filter</td> <td><code>$lrn_gate, $lesson, $course, get_current_user_id()</code></td> <td>Filter the lesson access-gate copy (title / message / cta_label / cta_url).</td> <td><code>templates/lesson/focus.php:91</code> (2)</td> </tr> <tr> <td><code>learnomy_lesson_after_content</code></td> <td>action</td> <td><code>$lesson, $course</code></td> <td>Fires after the embedded lesson layout is rendered.</td> <td><code>templates/lesson/embedded.php:247</code> (2)</td> </tr> <tr> <td><code>learnomy_lesson_before_content</code></td> <td>action</td> <td><code>$lesson, $course</code></td> <td>Placement region above the lesson content (admin edit bar, sponsor, etc.).</td> <td><code>templates/lesson/focus.php:219</code> (2)</td> </tr> <tr> <td><code>learnomy_lesson_live_post_actions</code></td> <td>action</td> <td><code>$lesson, $course</code></td> <td>Fires in the notice shown for a finished live session, to add a recording or contact link.</td> <td><code>templates/lesson/partials/media.php:378</code></td> </tr> <tr> <td><code>learnomy_lesson_pause</code></td> <td>action</td> <td><code>$lesson</code></td> <td>Surface C - pause overlay. Always rendered, but hidden; the JS.</td> <td><code>templates/lesson/embedded.php:277</code></td> </tr> <tr> <td><code>learnomy_lesson_player_aside</code></td> <td>action</td> <td><code>$lesson, $is_enrolled</code></td> <td>Allow Pro modules to render auxiliary tools alongside the lesson.</td> <td><code>templates/lesson/embedded.php:371</code> (2)</td> </tr> <tr> <td><code>learnomy_lesson_render_content</code></td> <td>action</td> <td><code>$content_type, $lesson, $media_url</code></td> <td>Fires to render the player of a lesson content type registered by an extension.</td> <td><code>templates/lesson/partials/media.php:410</code></td> </tr> <tr> <td><code>learnomy_lesson_sidebar_bottom</code></td> <td>action</td> <td><code>$lesson, $course</code></td> <td>Bottom of the lesson curriculum sidebar.</td> <td><code>templates/lesson/embedded.php:662</code> (2)</td> </tr> <tr> <td><code>learnomy_lesson_sidebar_top</code></td> <td>action</td> <td><code>$lesson, $course</code></td> <td>Top of the lesson curriculum sidebar (e.g. resume CTA).</td> <td><code>templates/lesson/embedded.php:536</code> (2)</td> </tr> <tr> <td><code>learnomy_membership_manage_extra_sections</code></td> <td>action</td> <td><code>$sub</code></td> <td>Fires after the primary action row but before the invoices.</td> <td><code>templates/membership-manage.php:454</code></td> </tr> <tr> <td><code>learnomy_pricing_before_faq</code></td> <td>action</td> <td></td> <td>Fires after the plan grid + social proof but BEFORE the FAQ. Pro.</td> <td><code>templates/membership-pricing.php:218</code></td> </tr> <tr> <td><code>learnomy_pricing_page_footer</code></td> <td>action</td> <td></td> <td>Fires below the FAQ block. Pro uses it to inject a money-back.</td> <td><code>templates/membership-pricing.php:256</code></td> </tr> <tr> <td><code>learnomy_pricing_page_header</code></td> <td>action</td> <td></td> <td>Fires above the plan grid. Pro uses it to inject a trust-badges.</td> <td><code>templates/membership-pricing.php:96</code></td> </tr> <tr> <td><code>learnomy_pricing_plan_extras</code></td> <td>action</td> <td><code>$plan</code></td> <td>Hook inside each pricing card so Pro can inject entitlement badges.</td> <td><code>templates/partials/membership-plan-card.php:335</code></td> </tr> <tr> <td><code>learnomy_pricing_social_proof</code></td> <td>action</td> <td></td> <td></td> <td><code>templates/membership-pricing.php:204</code></td> </tr> <tr> <td><code>learnomy_quiz_before_content</code></td> <td>action</td> <td><code>$quiz</code></td> <td>In-content edit affordance, mirroring the course/lesson before-content hooks.</td> <td><code>templates/single-quiz.php:182</code></td> </tr> <tr> <td><code>learnomy_quiz_templates</code></td> <td>filter</td> <td><code>[ 'focused', 'classic', 'conversational', 'sectioned', 'review-board', ]</code></td> <td>The quiz display templates a quiz may use.</td> <td><code>templates/single-quiz.php:149</code></td> </tr> <tr> <td><code>learnomy_registration_challenge</code></td> <td>action</td> <td><code>'registration_instructor'</code></td> <td>Render an owner-supplied signup challenge (CAPTCHA widget,.</td> <td><code>templates/register-instructor.php:245</code> (2)</td> </tr> <tr> <td><code>learnomy_render_course_comments</code></td> <td>action</td> <td><code>(int) $course->id, $course</code></td> <td>Fires on the course page where the comments section is rendered.</td> <td><code>templates/course/partials/body.php:250</code></td> </tr> <tr> <td><code>learnomy_show_instructor_earnings</code></td> <td>filter</td> <td><code>\Learnomy\Services\Commission_Service::instructor_participates_in_revenue( get_current_...</code></td> <td>Whether the instructor dashboard shows the revenue stat for this instructor.</td> <td><code>templates/instructor-dashboard.php:160</code> (2)</td> </tr> <tr> <td><code>learnomy_thank_you_rendered</code></td> <td>action</td> <td><code>$transaction, get_current_user_id()</code></td> <td>Fires after the thank-you page has rendered. Pro analytics modules.</td> <td><code>templates/checkout-thank-you.php:356</code></td> </tr> </tbody> </table> <h2>Widgets</h2> <table> <thead> <tr> <th>Hook</th> <th>Type</th> <th>Arguments</th> <th>What it is for</th> <th>Fired in</th> </tr> </thead> <tbody> <tr> <td><code>learnomy_progress_widget_max</code></td> <td>filter</td> <td><code>10</code></td> <td>The most in-progress courses the Course Progress widget lists.</td> <td><code>includes/widgets/class-course-progress-widget.php:73</code></td> </tr> <tr> <td><code>learnomy_widget_output</code></td> <td>filter</td> <td><code>$output, $args, $instance, $this->id_base</code></td> <td>The rendered HTML of the instructor widget.</td> <td><code>includes/widgets/class-instructor-widget.php:59</code> (10)</td> </tr> </tbody> </table> <h2>Related</h2> <ul> <li><a href="/products/learnomy/developer-guide/background-jobs/">Developer Guide</a></li> <li><a href="/products/learnomy/developer-guide/template-overrides/">Template Overrides</a></li> <li><a href="/products/learnomy/integrations/rest-api-and-app/">REST API and App</a></li> </ul>