Home / Admin / LIFTER – Course to Module
Duplicate Snippet

Embed Snippet on Your Site

LIFTER – Course to Module

Replace Syntax

ismail daugherty PRO
<10
Code Preview
php
<?php
/**
 * LifterLMS Text Replacement Snippet - VERIFIED VERSION
 * Changes "Courses" to "Modules" and "Lessons" to "Steps"
 * Add to WP Code Snippets or functions.php
 * Run everywhere (Frontend & Admin)
 * 
 * Based on official LifterLMS documentation and GitHub source code
 */
// Main translation filter for LifterLMS text replacement
// Using priority 20 to ensure it runs after LifterLMS loads its text domain
add_filter('gettext', 'llms_change_course_lesson_terminology', 20, 3);
add_filter('ngettext', 'llms_change_course_lesson_terminology_plural', 20, 5);
add_filter('gettext_with_context', 'llms_change_course_lesson_terminology_context', 20, 4);
/**
 * Replace singular text strings
 * Performance optimized by checking domain first as recommended by WordPress
 */
function llms_change_course_lesson_terminology($translated_text, $text, $domain) {
    // CRITICAL: Check domain first for performance (this filter runs thousands of times)
    if ($domain !== 'lifterlms') {
        return $translated_text;
    }
    
    // Create replacement array (case-sensitive)
    $replacements = array(
        // Course → Module replacements
        'Course' => 'Module',
        'course' => 'module',
        'COURSE' => 'MODULE',
        
        // Courses → Modules replacements
        'Courses' => 'Modules',
        'courses' => 'modules',
        'COURSES' => 'MODULES',
        
        // Lesson → Step replacements
        'Lesson' => 'Step',
        'lesson' => 'step',
        'LESSON' => 'STEP',
        
        // Lessons → Steps replacements
        'Lessons' => 'Steps',
        'lessons' => 'steps',
        'LESSONS' => 'STEPS',
        
        // Common phrases with Course (based on LifterLMS source)
        'Course Builder' => 'Module Builder',
        'Course Catalog' => 'Module Catalog',
        'Course Categories' => 'Module Categories',
        'Course Category' => 'Module Category',
        'Course Content' => 'Module Content',
        'Course Dashboard' => 'Module Dashboard',
        'Course Description' => 'Module Description',
        'Course Details' => 'Module Details',
        'Course Difficulty' => 'Module Difficulty',
        'Course Information' => 'Module Information',
        'Course Instructor' => 'Module Instructor',
        'Course Length' => 'Module Length',
        'Course Meta' => 'Module Meta',
        'Course Options' => 'Module Options',
        'Course Outline' => 'Module Outline',
        'Course Overview' => 'Module Overview',
        'Course Prerequisites' => 'Module Prerequisites',
        'Course Progress' => 'Module Progress',
        'Course Reviews' => 'Module Reviews',
        'Course Settings' => 'Module Settings',
        'Course Syllabus' => 'Module Syllabus',
        'Course Tags' => 'Module Tags',
        'Course Title' => 'Module Title',
        'Course Track' => 'Module Track',
        'My Courses' => 'My Modules',
        'All Courses' => 'All Modules',
        'New Course' => 'New Module',
        'Edit Course' => 'Edit Module',
        'View Course' => 'View Module',
        'Add Course' => 'Add Module',
        'Add New Course' => 'Add New Module',
        'Search Courses' => 'Search Modules',
        'Parent Course' => 'Parent Module',
        'No Courses found' => 'No Modules found',
        'No Courses found in trash' => 'No Modules found in trash',
        'No courses found' => 'No modules found',
        'No courses found in Trash' => 'No modules found in Trash',
        'Featured Course' => 'Featured Module',
        'Remove featured course' => 'Remove featured module',
        'Set featured course' => 'Set featured module',
        'Course Archives' => 'Module Archives',
        'Course Attributes' => 'Module Attributes',
        'Insert into course' => 'Insert into module',
        'Uploaded to this course' => 'Uploaded to this module',
        'Filter courses list' => 'Filter modules list',
        'Courses list navigation' => 'Modules list navigation',
        'Courses list' => 'Modules list',
        'Launch Course Builder' => 'Launch Module Builder',
        'This course is' => 'This module is',
        'Enroll in this course' => 'Enroll in this module',
        'Continue Course' => 'Continue Module',
        'Start Course' => 'Start Module',
        'Course Complete' => 'Module Complete',
        'Take this Course' => 'Take this Module',
        'Back to Course' => 'Back to Module',
        'Return to Course' => 'Return to Module',
        'View All Courses' => 'View All Modules',
        'Browse Courses' => 'Browse Modules',
        
        // Common phrases with Lesson (based on LifterLMS source)
        'Lesson Content' => 'Step Content',
        'Lesson Title' => 'Step Title',
        'Lesson Description' => 'Step Description',
        'Lesson Options' => 'Step Options',
        'Lesson Settings' => 'Step Settings',
        'Lesson Preview' => 'Step Preview',
        'Lesson Progress' => 'Step Progress',
        'Next Lesson' => 'Next Step',
        'Previous Lesson' => 'Previous Step',
        'Current Lesson' => 'Current Step',
        'New Lesson' => 'New Step',
        'Edit Lesson' => 'Edit Step',
        'View Lesson' => 'View Step',
        'Add Lesson' => 'Add Step',
        'Add New Lesson' => 'Add New Step',
        'Search Lessons' => 'Search Steps',
        'Parent Lesson' => 'Parent Step',
        'Parent Lessons' => 'Parent Steps',
        'No Lessons found' => 'No Steps found',
        'No Lessons found in trash' => 'No Steps found in trash',
        'No lessons found' => 'No steps found',
        'No lessons found in Trash' => 'No steps found in Trash',
        'All Lessons' => 'All Steps',
        'Lesson Archives' => 'Step Archives',
        'Lesson Attributes' => 'Step Attributes',
        'Insert into lesson' => 'Insert into step',
        'Uploaded to this lesson' => 'Uploaded to this step',
        'Filter lessons list' => 'Filter steps list',
        'Lessons list navigation' => 'Steps list navigation',
        'Lessons list' => 'Steps list',
        'Mark Lesson Complete' => 'Mark Step Complete',
        'Complete Lesson' => 'Complete Step',
        'Free Lesson' => 'Free Step',
        'Lesson Prerequisite' => 'Step Prerequisite',
        'lesson complete' => 'step complete',
        'lesson is complete' => 'step is complete',
        'lesson completion' => 'step completion',
        'Back to Lesson' => 'Back to Step',
        'Mark Complete' => 'Mark Complete', // Keep as is if it's generic
        
        // Menu name translations (using _x context)
        'Categories' => 'Categories', // Keep as is for course categories
        
        // Status messages
        'You must be enrolled in the course to access this lesson' => 'You must be enrolled in the module to access this step',
        'You are not enrolled in this course' => 'You are not enrolled in this module',
        'This lesson is not available yet' => 'This step is not available yet',
        'Course enrollment is closed' => 'Module enrollment is closed',
        'Lesson drip is' => 'Step drip is',
        
        // Email notifications
        'enrolled in a course' => 'enrolled in a module',
        'completed a course' => 'completed a module',
        'completed a lesson' => 'completed a step',
    );
    
    // Check if the text exists in our replacements
    if (isset($replacements[$text])) {
        return $replacements[$text];
    }
    
    // Also check the translated text for replacements
    if (isset($replacements[$translated_text])) {
        return $replacements[$translated_text];
    }
    
    return $translated_text;
}
/**
 * Handle plural forms (ngettext filter)
 */
function llms_change_course_lesson_terminology_plural($translation, $single, $plural, $number, $domain) {
    if ($domain !== 'lifterlms') {
        return $translation;
    }
    
    // Replace in both singular and plural forms
    $single = str_replace(array('Course', 'course', 'Lesson', 'lesson'), 
                         array('Module', 'module', 'Step', 'step'), $single);
    $plural = str_replace(array('Courses', 'courses', 'Lessons', 'lessons'), 
                         array('Modules', 'modules', 'Steps', 'steps'), $plural);
    
    // Return modified translation
    $translation = str_replace(array('Course', 'course', 'Courses', 'courses', 'Lesson', 'lesson', 'Lessons', 'lessons'),
                              array('Module', 'module', 'Modules', 'modules', 'Step', 'step', 'Steps', 'steps'),
                              $translation);
    
    return $translation;
}
/**
 * Handle text with context (_x and _ex functions)
 */
function llms_change_course_lesson_terminology_context($translation, $text, $context, $domain) {
    if ($domain !== 'lifterlms') {
        return $translation;
    }
    
    // Apply the same replacements as the main function
    return llms_change_course_lesson_terminology($translation, $text, $domain);
}
/**
 * Change post type labels in admin
 * Uses the lifterlms_register_post_type_{post_type} filter
 */
add_filter('lifterlms_register_post_type_course', 'llms_modify_course_post_type_args');
function llms_modify_course_post_type_args($args) {
    $args['labels']['name'] = 'Modules';
    $args['labels']['singular_name'] = 'Module';
    $args['labels']['add_new'] = 'Add Module';
    $args['labels']['add_new_item'] = 'Add New Module';
    $args['labels']['edit_item'] = 'Edit Module';
    $args['labels']['new_item'] = 'New Module';
    $args['labels']['view_item'] = 'View Module';
    $args['labels']['view_items'] = 'View Modules';
    $args['labels']['search_items'] = 'Search Modules';
    $args['labels']['not_found'] = 'No modules found';
    $args['labels']['not_found_in_trash'] = 'No modules found in Trash';
    $args['labels']['all_items'] = 'All Modules';
    $args['labels']['menu_name'] = 'Modules';
    $args['labels']['name_admin_bar'] = 'Module';
    return $args;
}
add_filter('lifterlms_register_post_type_lesson', 'llms_modify_lesson_post_type_args');
function llms_modify_lesson_post_type_args($args) {
    $args['labels']['name'] = 'Steps';
    $args['labels']['singular_name'] = 'Step';
    $args['labels']['add_new'] = 'Add Step';
    $args['labels']['add_new_item'] = 'Add New Step';
    $args['labels']['edit_item'] = 'Edit Step';
    $args['labels']['new_item'] = 'New Step';
    $args['labels']['view_item'] = 'View Step';
    $args['labels']['view_items'] = 'View Steps';
    $args['labels']['search_items'] = 'Search Steps';
    $args['labels']['not_found'] = 'No steps found';
    $args['labels']['not_found_in_trash'] = 'No steps found in Trash';
    $args['labels']['all_items'] = 'All Steps';
    $args['labels']['menu_name'] = 'Steps';
    $args['labels']['name_admin_bar'] = 'Step';
    if (isset($args['labels']['parent'])) {
        $args['labels']['parent'] = 'Parent Steps';
    }
    return $args;
}
/**
 * Modify taxonomy labels for course categories and tags
 */
add_filter('lifterlms_register_taxonomy_course_cat', 'llms_modify_course_cat_taxonomy_args');
function llms_modify_course_cat_taxonomy_args($args) {
    $args['label'] = 'Module Categories';
    $args['labels']['name'] = 'Module Categories';
    $args['labels']['singular_name'] = 'Module Category';
    $args['labels']['search_items'] = 'Search Module Categories';
    $args['labels']['all_items'] = 'All Module Categories';
    $args['labels']['parent_item'] = 'Parent Module Category';
    $args['labels']['parent_item_colon'] = 'Parent Module Category:';
    $args['labels']['edit_item'] = 'Edit Module Category';
    $args['labels']['update_item'] = 'Update Module Category';
    $args['labels']['add_new_item'] = 'Add New Module Category';
    $args['labels']['new_item_name'] = 'New Module Category Name';
    return $args;
}
add_filter('lifterlms_register_taxonomy_course_tag', 'llms_modify_course_tag_taxonomy_args');
function llms_modify_course_tag_taxonomy_args($args) {
    $args['label'] = 'Module Tags';
    $args['labels']['name'] = 'Module Tags';
    $args['labels']['singular_name'] = 'Module Tag';
    $args['labels']['search_items'] = 'Search Module Tags';
    $args['labels']['all_items'] = 'All Module Tags';
    $args['labels']['edit_item'] = 'Edit Module Tag';
    $args['labels']['update_item'] = 'Update Module Tag';
    $args['labels']['add_new_item'] = 'Add New Module Tag';
    $args['labels']['new_item_name'] = 'New Module Tag Name';
    return $args;
}
/**
 * Additional LifterLMS specific filters for various text elements
 */
add_filter('lifterlms_course_label', function() {
    return 'Module';
});
add_filter('lifterlms_courses_label', function() {
    return 'Modules';
});
add_filter('lifterlms_lesson_label', function() {
    return 'Step';
});
add_filter('lifterlms_lessons_label', function() {
    return 'Steps';
});
/**
 * Filter breadcrumb text
 */
add_filter('lifterlms_breadcrumb_courses_archive_text', function() {
    return 'Modules';
});
/**
 * Filter specific button text
 */
add_filter('llms_course_continue_button_text', function($text) {
    return str_replace(array('Course', 'course'), array('Module', 'module'), $text);
});
add_filter('llms_mark_complete_text', function($text) {
    return str_replace(array('Lesson', 'lesson'), array('Step', 'step'), $text);
});
/**
 * Filter the free text label
 */
add_filter('llms_get_preview_icon_html', function($html) {
    // The FREE label is hardcoded in LifterLMS, so we need to replace it
    return str_replace(array('Lesson', 'lesson'), array('Step', 'step'), $html);
}, 20);
/**
 * JavaScript to handle any dynamically loaded content
 * This ensures AJAX-loaded content also gets the terminology changes
 */
add_action('wp_footer', 'llms_terminology_js_replacements');
add_action('admin_footer', 'llms_terminology_js_replacements');
function llms_terminology_js_replacements() {
    ?>
    <script type="text/javascript">
    jQuery(document).ready(function($) {
        // Function to replace text in all text nodes
        function replaceTextInNode(node) {
            if (node.nodeType === 3) { // Text node
                var text = node.nodeValue;
                if (text) {
                    // Only replace whole words using word boundaries
                    text = text.replace(/\bCourse\b/g, 'Module');
                    text = text.replace(/\bcourse\b/g, 'module');
                    text = text.replace(/\bCourses\b/g, 'Modules');
                    text = text.replace(/\bcourses\b/g, 'modules');
                    text = text.replace(/\bLesson\b/g, 'Step');
                    text = text.replace(/\blesson\b/g, 'step');
                    text = text.replace(/\bLessons\b/g, 'Steps');
                    text = text.replace(/\blessons\b/g, 'steps');
                    node.nodeValue = text;
                }
            } else if (node.nodeType === 1) { // Element node
                // Skip script and style tags
                if (node.tagName && (node.tagName.toLowerCase() === 'script' || 
                    node.tagName.toLowerCase() === 'style')) {
                    return;
                }
                
                // Check for title and placeholder attributes
                if (node.title) {
                    node.title = node.title.replace(/\bCourse\b/g, 'Module')
                                          .replace(/\bcourse\b/g, 'module')
                                          .replace(/\bCourses\b/g, 'Modules')
                                          .replace(/\bcourses\b/g, 'modules')
                                          .replace(/\bLesson\b/g, 'Step')
                                          .replace(/\blesson\b/g, 'step')
                                          .replace(/\bLessons\b/g, 'Steps')
                                          .replace(/\blessons\b/g, 'steps');
                }
                if (node.placeholder) {
                    node.placeholder = node.placeholder.replace(/\bCourse\b/g, 'Module')
                                                      .replace(/\bcourse\b/g, 'module')
                                                      .replace(/\bCourses\b/g, 'Modules')
                                                      .replace(/\bcourses\b/g, 'modules')
                                                      .replace(/\bLesson\b/g, 'Step')
                                                      .replace(/\blesson\b/g, 'step')
                                                      .replace(/\bLessons\b/g, 'Steps')
                                                      .replace(/\blessons\b/g, 'steps');
                }
                
                // Check aria-label attribute
                if (node.getAttribute && node.getAttribute('aria-label')) {
                    var ariaLabel = node.getAttribute('aria-label');
                    ariaLabel = ariaLabel.replace(/\bCourse\b/g, 'Module')
                                        .replace(/\bcourse\b/g, 'module')
                                        .replace(/\bCourses\b/g, 'Modules')
                                        .replace(/\bcourses\b/g, 'modules')
                                        .replace(/\bLesson\b/g, 'Step')
                                        .replace(/\blesson\b/g, 'step')
                                        .replace(/\bLessons\b/g, 'Steps')
                                        .replace(/\blessons\b/g, 'steps');
                    node.setAttribute('aria-label', ariaLabel);
                }
                
                // Recurse through child nodes
                for (var i = 0; i < node.childNodes.length; i++) {
                    replaceTextInNode(node.childNodes[i]);
                }
            }
        }
        
        // Initial replacement on page load
        replaceTextInNode(document.body);
        
        // Watch for dynamically added content (AJAX, etc.)
        var observer = new MutationObserver(function(mutations) {
            mutations.forEach(function(mutation) {
                mutation.addedNodes.forEach(function(node) {
                    replaceTextInNode(node);
                });
            });
        });
        
        // Start observing with optimized settings
        observer.observe(document.body, {
            childList: true,
            subtree: true,
            attributes: false, // Don't watch attribute changes to improve performance
            characterData: false // Don't watch text content changes
        });
        
        // Also handle LifterLMS specific AJAX events if they exist
        $(document).on('llms-builder-loaded', function() {
            setTimeout(function() {
                replaceTextInNode(document.body);
            }, 100);
        });
    });
    </script>
    <?php
}
/**
 * Optional: Change the My Courses endpoint slug (uncomment if needed)
 * This changes the URL from /my-courses/ to /my-modules/
 */
// add_filter('lifterlms_myaccount_endpoints', 'llms_change_endpoints');
// function llms_change_endpoints($endpoints) {
//     if (isset($endpoints['my-courses'])) {
//         $endpoints['my-modules'] = $endpoints['my-courses'];
//         unset($endpoints['my-courses']);
//     }
//     return $endpoints;
// }
/**
 * Flush rewrite rules on activation (only run once)
 * This ensures URLs are properly updated
 */
register_activation_hook(__FILE__, 'llms_terminology_flush_rewrite_rules');
function llms_terminology_flush_rewrite_rules() {
    flush_rewrite_rules();
}
// Also flush on admin_init but only once
add_action('admin_init', 'llms_maybe_flush_rewrite_rules');
function llms_maybe_flush_rewrite_rules() {
    if (get_option('llms_terminology_flush_rules', false) !== 'done') {
        flush_rewrite_rules();
        update_option('llms_terminology_flush_rules', 'done');
    }
}

Comments

Add a Comment