Hooks and Filters (Actions & Filters)

LearnPress uses WordPress’s powerful hooks system to allow developers to extend and customize the plugin’s functionality without modifying core files. This approach ensures that your customizations remain intact even after plugin updates.

Introduction to WordPress Hooks

WordPress hooks come in two varieties:

  • Actions: Allow you to add or change functionality at specific points in execution
  • Filters: Allow you to modify data before it’s used or displayed

LearnPress extends this system with its own set of hooks that are specific to LMS functionality.

How LearnPress Uses Hooks

LearnPress implements hooks throughout its codebase to create a flexible and extensible architecture:

  • Template hooks allow customization of the HTML output
  • Process hooks enable modification of business logic
  • Data hooks permit alteration of data before it’s saved or retrieved

The main hook files in LearnPress are:

  • inc/lp-template-hooks.php – Defines template-related hooks
  • inc/lp-core-hooks.php – Defines core functionality hooks
  • Various class files that define specific hooks for their functionality

Key Action Hooks

Action hooks allow you to execute custom code at specific points in LearnPress’s execution flow.

Course Actions

Hook Description Parameters Usage Example
learn-press/before-course-content Fires before the course content is displayed None
add_action('learn-press/before-course-content', function() {
    echo '<div class="my-custom-banner">Special Offer!</div>';
});
learn-press/after-course-content Fires after the course content is displayed None
add_action('learn-press/after-course-content', function() {
    echo '<div class="related-courses">You might also like...</div>';
});
learn-press/before-single-course Fires before the single course template None
add_action('learn-press/before-single-course', function() {
    // Add custom content before course
});
learn-press/after-single-course Fires after the single course template None
add_action('learn-press/after-single-course', function() {
    // Add custom content after course
});
learn-press/course-content-summary Used to build the course content summary None
add_action('learn-press/course-content-summary', function() {
    echo '<div class="custom-course-info">...</div>';
}, 15);

Lesson and Quiz Actions

Hook Description Parameters Usage Example
learn-press/before-content-item-summary/lp_lesson Fires before lesson content None
add_action('learn-press/before-content-item-summary/lp_lesson', function() {
    echo '<div class="lesson-prerequisites">Before starting...</div>';
});
learn-press/before-content-item-summary/lp_quiz Fires before quiz content None
add_action('learn-press/before-content-item-summary/lp_quiz', function() {
    echo '<div class="quiz-instructions">Quiz instructions...</div>';
});
learn-press/quiz-started Fires when a user starts a quiz $quiz_id, $course_id, $user_id
add_action('learn-press/quiz-started', function($quiz_id, $course_id, $user_id) {
    // Log quiz start or perform other actions
}, 10, 3);
learn-press/quiz-completed Fires when a user completes a quiz $quiz_id, $course_id, $user_id, $result
add_action('learn-press/quiz-completed', function($quiz_id, $course_id, $user_id, $result) {
    // Process quiz completion
}, 10, 4);

Checkout and Enrollment Actions

Hook Description Parameters Usage Example
learn-press/before-checkout-form Fires before the checkout form None
add_action('learn-press/before-checkout-form', function() {
    echo '<div class="checkout-notice">Important information...</div>';
});
learn-press/after-checkout-form Fires after the checkout form None
add_action('learn-press/after-checkout-form', function() {
    echo '<div class="checkout-support">Need help?</div>';
});
learn-press/user-enrolled-course Fires when a user enrolls in a course $course_id, $user_id, $user_course
add_action('learn-press/user-enrolled-course', function($course_id, $user_id, $user_course) {
    // Send welcome email or perform other actions
}, 10, 3);
learn-press/order/status-changed Fires when an order’s status changes $order_id, $old_status, $new_status
add_action('learn-press/order/status-changed', function($order_id, $old_status, $new_status) {
    if ($new_status === 'completed') {
        // Process completed order
    }
}, 10, 3);

Key Filter Hooks

Filter hooks allow you to modify data before it’s used by LearnPress.

Course Filters

Hook Description Parameters Usage Example
learn-press/course-price-html Filters the HTML output of course price $price_html, $course
add_filter('learn-press/course-price-html', function($price_html, $course) {
    // Modify price display
    return '<span class="special-price">' . $price_html . '</span>';
}, 10, 2);
learn-press/single-course/modern/info-meta Filters the course meta information in modern layout $data_info_meta, $course, $user
add_filter('learn-press/single-course/modern/info-meta', function($data_info_meta, $course, $user) {
    // Add or modify course meta information
    $data_info_meta['custom_field'] = [
        'label' => '<i class="icon"></i>Custom:',
        'value' => 'Custom Value'
    ];
    return $data_info_meta;
}, 10, 3);
learn_press_course_price Filters the course price value $price, $course_id
add_filter('learn_press_course_price', function($price, $course_id) {
    // Apply discount or modify price
    return $price * 0.9; // 10% discount
}, 10, 2);
learn-press/course-tabs Filters the tabs displayed on the course page $tabs, $course
add_filter('learn-press/course-tabs', function($tabs, $course) {
    // Add a custom tab
    $tabs['custom_tab'] = [
        'title' => 'Custom Tab',
        'priority' => 40,
        'callback' => function() {
            echo 'Custom tab content';
        }
    ];
    return $tabs;
}, 10, 2);

Template and Content Filters

Hook Description Parameters Usage Example
learn_press_get_template Filters the template file path $template, $template_name, $args
add_filter('learn_press_get_template', function($template, $template_name, $args) {
    // Use a different template file
    if ($template_name === 'single-course/price.php') {
        return get_stylesheet_directory() . '/custom-templates/course-price.php';
    }
    return $template;
}, 10, 3);
learn-press/content-item-summary-class Filters the CSS classes for content item summary $classes
add_filter('learn-press/content-item-summary-class', function($classes) {
    // Add custom classes
    $classes[] = 'my-custom-class';
    return $classes;
});
learn_press_page_title Filters the page title in LearnPress pages $page_title
add_filter('learn_press_page_title', function($page_title) {
    // Modify page title
    return 'Learn Online: ' . $page_title;
});

Query and Data Filters

Hook Description Parameters Usage Example
learnpress/archive-courses-layouts Filters the available layouts for course archive $layouts
add_filter('learnpress/archive-courses-layouts', function($layouts) {
    // Add a new layout option
    $layouts['masonry'] = __('Masonry', 'learnpress');
    return $layouts;
});
lp/is-learning-course Filters whether a user is learning a course $is_learning, $course_id
add_filter('lp/is-learning-course', function($is_learning, $course_id) {
    // Custom logic to determine if user is learning
    return $is_learning || has_custom_access($course_id);
}, 10, 2);
learn-press/get_template_part Filters the template part path $template, $slug, $name
add_filter('learn-press/get_template_part', function($template, $slug, $name) {
    // Use custom template part
    if ($slug === 'content' && $name === 'course') {
        return get_stylesheet_directory() . '/custom-parts/content-course.php';
    }
    return $template;
}, 10, 3);

Creating Custom Hooks

When developing extensions for LearnPress, it’s good practice to create your own hooks to make your code extensible:

// Adding an action hook
do_action('my_learnpress_extension/before_content', $args);

// Adding a filter hook
$value = apply_filters('my_learnpress_extension/modify_data', $value, $context);
Best Practices:

  • Use a unique prefix for your hooks to avoid conflicts
  • Document your hooks thoroughly
  • Be consistent with parameter passing
  • Consider backward compatibility when modifying hooks

Using Hooks in Theme Functions

To use LearnPress hooks in your theme, add your code to the theme’s functions.php file or a custom plugin:

// Example of using both action and filter hooks
function my_theme_learnpress_customizations() {
    // Add content before course
    add_action('learn-press/before-course-content', 'my_before_course_content');
    
    // Modify course price display
    add_filter('learn-press/course-price-html', 'my_course_price_html', 10, 2);
}
add_action('after_setup_theme', 'my_theme_learnpress_customizations');

// Action callback
function my_before_course_content() {
    echo '<div class="course-intro">Welcome to this course!</div>';
}

// Filter callback
function my_course_price_html($price_html, $course) {
    if ($course->get_price() > 0) {
        return $price_html . ' <span class="price-guarantee">Best price guarantee!</span>';
    }
    return $price_html;
}

Removing Default Actions

Sometimes you may want to remove LearnPress’s default actions to replace them with your own:

// Remove the default course price display
remove_action('learn-press/course-content-summary', 'learn_press_course_price', 25);

// Add your custom price display
add_action('learn-press/course-content-summary', 'my_custom_course_price', 25);

function my_custom_course_price() {
    // Your custom price display code
    echo '<div class="custom-price-display">...</div>';
}

Debugging Hooks

To see which hooks are firing and in what order, you can use a debugging plugin or add this code:

function debug_learnpress_hooks() {
    // Only show for admins
    if (!current_user_can('administrator')) return;
    
    $current_filter = current_filter();
    if (strpos($current_filter, 'learn') !== false) {
        echo "<div style='padding: 5px; background: #eee; border: 1px solid #ddd; margin: 5px;'>";
        echo "Hook: " . $current_filter;
        echo "</div>";
    }
}

// Add to all LearnPress hooks (this will be very verbose)
add_action('all', 'debug_learnpress_hooks');
Note: The hooks documented here represent the most commonly used hooks in LearnPress. The plugin contains many more hooks that you can discover by exploring the codebase or using a hook debugging tool.