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> |