Hook Usage Guide Reign – WP Job Manager Addon

Get Started

How to Use the New Compatibility Hooks in Your Classes

This guide shows how public classes and theme developers should leverage the new compatibility hooks instead of directly implementing functionality.


1. Instead of Direct Implementation, Use Filters

OLD WAY (Direct Implementation)

class My_Public_Class {
    public function modify_job_fields() {
        // Directly modifying fields
        $fields = array(
            'job_title' => array(
                'label' => 'Job Title',
                'type' => 'text'
            )
        );
        // Direct implementation
        return $fields;
    }
}

NEW WAY (Using Compatibility Hooks)

class My_Public_Class {
    public function __construct() {
        // Hook into our compatibility filters
        add_filter('reign_wpjm_job_query_args', array($this, 'customize_job_query'), 10, 2);
        add_filter('reign_wpjm_application_fields', array($this, 'add_custom_fields'), 10, 2);
        add_action('reign_wpjm_job_submitted', array($this, 'after_job_submission'));
    }
    
    public function customize_job_query($query_args, $args) {
        // Modify query using the hook
        $query_args['meta_key'] = '_featured';
        $query_args['orderby'] = 'meta_value';
        return $query_args;
    }
    
    public function add_custom_fields($fields, $form_id) {
        // Add fields using the hook
        $fields['custom_field'] = array(
            'label' => 'Custom Field',
            'type' => 'text',
            'required' => false
        );
        return $fields;
    }
}

2. Job Listing Customizations

Using Job Hooks

class Reign_Job_Customizer {
    
    public function init() {
        // Use compatibility hooks instead of direct WP Job Manager hooks
        add_action('reign_wpjm_job_listing_meta_start', array($this, 'add_custom_meta'));
        add_filter('reign_wpjm_job_query_args', array($this, 'modify_query'));
        add_filter('reign_wpjm_structured_data', array($this, 'enhance_seo'));
        add_action('reign_wpjm_job_submitted', array($this, 'notify_admin'));
    }
    
    public function add_custom_meta() {
        // Add custom content to job meta
        echo '<div class="custom-job-badge">Premium</div>';
    }
    
    public function modify_query($query_args, $original_args) {
        // Filter jobs by custom criteria
        if (is_page('premium-jobs')) {
            $query_args['meta_query'][] = array(
                'key' => '_is_premium',
                'value' => '1'
            );
        }
        return $query_args;
    }
    
    public function enhance_seo($data, $post) {
        // Add custom structured data
        $data['customField'] = get_post_meta($post->ID, '_custom_field', true);
        return $data;
    }
    
    public function notify_admin($job_id) {
        // Send notification when job submitted
        $admin_email = get_option('admin_email');
        wp_mail($admin_email, 'New Job Posted', 'Job ID: ' . $job_id);
    }
}

3. Resume Management

Using Resume Hooks

class Reign_Resume_Manager {
    
    public function init() {
        // Use resume compatibility hooks
        add_action('reign_wpjm_single_resume_start', array($this, 'resume_header'));
        add_filter('reign_wpjm_resume_searchable_meta', array($this, 'add_searchable_fields'));
        add_filter('reign_wpjm_candidate_photo', array($this, 'customize_photo'));
        add_action('reign_wpjm_resume_submitted', array($this, 'process_resume'));
    }
    
    public function resume_header() {
        // Add header content to resumes
        if (current_user_can('administrator')) {
            echo '<div class="admin-tools">Admin View</div>';
        }
    }
    
    public function add_searchable_fields($meta_keys) {
        // Make custom fields searchable
        $meta_keys[] = '_skills_rating';
        $meta_keys[] = '_certifications';
        return $meta_keys;
    }
    
    public function customize_photo($photo_url, $post) {
        // Add default photo if none exists
        if (empty($photo_url)) {
            $photo_url = get_template_directory_uri() . '/images/default-candidate.jpg';
        }
        return $photo_url;
    }
    
    public function process_resume($resume_id) {
        // Process resume after submission
        $skills = get_post_meta($resume_id, '_candidate_skills', true);
        if ($skills) {
            // Index skills for better search
            $this->index_skills($resume_id, $skills);
        }
    }
}

4. Application System Integration

Using Application Hooks

class Reign_Application_Handler {
    
    public function init() {
        // Use application compatibility hooks
        add_filter('reign_wpjm_application_fields', array($this, 'customize_form'));
        add_filter('reign_wpjm_validate_application', array($this, 'validate_application'), 10, 3);
        add_action('reign_wpjm_new_application', array($this, 'process_application'), 10, 2);
        add_filter('reign_wpjm_application_email_message', array($this, 'customize_email'));
    }
    
    public function customize_form($fields, $form_id) {
        // Add custom application fields
        $fields['linkedin_profile'] = array(
            'label' => 'LinkedIn Profile',
            'type' => 'url',
            'required' => false,
            'priority' => 15
        );
        
        $fields['availability'] = array(
            'label' => 'When can you start?',
            'type' => 'select',
            'options' => array(
                'immediately' => 'Immediately',
                '2_weeks' => 'In 2 weeks',
                '1_month' => 'In 1 month'
            ),
            'required' => true,
            'priority' => 20
        );
        
        return $fields;
    }
    
    public function validate_application($is_valid, $fields, $values) {
        // Custom validation
        if (isset($values['linkedin_profile']) && !empty($values['linkedin_profile'])) {
            if (strpos($values['linkedin_profile'], 'linkedin.com') === false) {
                return new WP_Error('invalid_linkedin', 'Please provide a valid LinkedIn URL');
            }
        }
        return $is_valid;
    }
    
    public function process_application($application_id, $job_id) {
        // Process application
        $job_title = get_the_title($job_id);
        $employer = get_post_meta($job_id, '_company_name', true);
        
        // Track application analytics
        $this->track_application_analytics($application_id, $job_id);
        
        // Notify HR team for urgent positions
        $is_urgent = get_post_meta($job_id, '_urgent_hiring', true);
        if ($is_urgent) {
            $this->notify_hr_team($application_id, $job_id);
        }
    }
    
    public function customize_email($message) {
        // Add company branding to emails
        $site_name = get_bloginfo('name');
        $message .= "\n\n---\n";
        $message .= "Thank you for using {$site_name} Job Board\n";
        $message .= "Powered by Reign Theme";
        
        return $message;
    }
}

5. Dashboard Enhancements

Using Dashboard Hooks

class Reign_Dashboard_Enhancer {
    
    public function init() {
        // Use dashboard hooks
        add_filter('reign_wpjm_job_dashboard_columns', array($this, 'add_columns'));
        add_filter('reign_wpjm_job_stats', array($this, 'add_statistics'), 10, 2);
        add_filter('reign_wpjm_resume_dashboard_columns', array($this, 'resume_columns'));
    }
    
    public function add_columns($columns) {
        // Add custom columns to job dashboard
        $columns['views'] = __('Views', 'reign-addon');
        $columns['conversion'] = __('Apply Rate', 'reign-addon');
        $columns['status'] = __('Status', 'reign-addon');
        return $columns;
    }
    
    public function add_statistics($stats, $job_id) {
        // Add custom statistics
        $views = get_post_meta($job_id, '_job_views', true) ?: 0;
        $applications = get_post_meta($job_id, '_application_count', true) ?: 0;
        
        $stats['views'] = array(
            'label' => 'Total Views',
            'value' => $views,
            'icon' => 'dashicons-visibility'
        );
        
        if ($views > 0) {
            $conversion = round(($applications / $views) * 100, 2);
            $stats['conversion'] = array(
                'label' => 'Apply Rate',
                'value' => $conversion . '%',
                'icon' => 'dashicons-chart-line'
            );
        }
        
        return $stats;
    }
}

6. Complete Implementation Example

Full Public Class Using All Hooks

class Reign_WPJM_Public {
    
    private static $instance = null;
    
    public static function get_instance() {
        if (null === self::$instance) {
            self::$instance = new self();
        }
        return self::$instance;
    }
    
    private function __construct() {
        $this->init_hooks();
    }
    
    private function init_hooks() {
        // Job Listings
        add_action('reign_wpjm_job_listing_meta_start', array($this, 'job_meta_start'));
        add_action('reign_wpjm_job_listing_meta_end', array($this, 'job_meta_end'));
        add_filter('reign_wpjm_job_query_args', array($this, 'filter_jobs'), 10, 2);
        add_action('reign_wpjm_job_submitted', array($this, 'on_job_submit'));
        
        // Resumes
        add_action('reign_wpjm_single_resume_start', array($this, 'resume_start'));
        add_filter('reign_wpjm_resume_searchable_meta', array($this, 'searchable_meta'));
        add_action('reign_wpjm_resume_submitted', array($this, 'on_resume_submit'));
        
        // Applications
        add_filter('reign_wpjm_application_fields', array($this, 'app_fields'), 10, 2);
        add_action('reign_wpjm_new_application', array($this, 'on_application'), 10, 2);
        add_filter('reign_wpjm_application_email_message', array($this, 'email_message'));
        
        // Dashboard
        add_filter('reign_wpjm_job_dashboard_columns', array($this, 'dashboard_columns'));
        add_filter('reign_wpjm_job_stats', array($this, 'job_stats'), 10, 2);
        
        // SEO
        add_filter('reign_wpjm_structured_data', array($this, 'structured_data'), 10, 2);
    }
    
    // Job Methods
    public function job_meta_start() {
        // Add opening wrapper
        echo '<div class="reign-job-meta-wrapper">';
    }
    
    public function job_meta_end() {
        // Add closing wrapper
        echo '</div>';
    }
    
    public function filter_jobs($query_args, $args) {
        // Custom job filtering
        if (isset($_GET['salary_min'])) {
            $query_args['meta_query'][] = array(
                'key' => '_job_salary',
                'value' => intval($_GET['salary_min']),
                'compare' => '>=',
                'type' => 'NUMERIC'
            );
        }
        return $query_args;
    }
    
    public function on_job_submit($job_id) {
        // Process job submission
        do_action('reign_job_submitted_notification', $job_id);
    }
    
    // Resume Methods
    public function resume_start() {
        echo '<div class="reign-resume-wrapper">';
    }
    
    public function searchable_meta($keys) {
        $keys[] = '_custom_skills';
        return $keys;
    }
    
    public function on_resume_submit($resume_id) {
        // Process resume
        $this->generate_resume_preview($resume_id);
    }
    
    // Application Methods
    public function app_fields($fields, $form_id) {
        $fields['cover_letter']['required'] = true;
        return $fields;
    }
    
    public function on_application($app_id, $job_id) {
        // Track application
        $this->track_application($app_id, $job_id);
    }
    
    public function email_message($message) {
        return $message . "\n\nPowered by Reign Theme";
    }
    
    // Dashboard Methods
    public function dashboard_columns($columns) {
        $columns['featured'] = __('Featured', 'reign');
        return $columns;
    }
    
    public function job_stats($stats, $job_id) {
        $stats['quality_score'] = $this->calculate_quality_score($job_id);
        return $stats;
    }
    
    // SEO Methods
    public function structured_data($data, $post) {
        $data['provider'] = array(
            '@type' => 'Organization',
            'name' => get_bloginfo('name')
        );
        return $data;
    }
    
    // Helper Methods
    private function track_application($app_id, $job_id) {
        // Implementation
    }
    
    private function generate_resume_preview($resume_id) {
        // Implementation
    }
    
    private function calculate_quality_score($job_id) {
        // Implementation
        return array(
            'label' => 'Quality Score',
            'value' => '85%',
            'icon' => 'dashicons-star-filled'
        );
    }
}

// Initialize
add_action('init', array('Reign_WPJM_Public', 'get_instance'));

7. Benefits of Using These Hooks

For Your Public Classes:

  1. Cleaner Code

    • Separation of concerns
    • Easier to maintain
    • Better organization
  2. Update-Safe

    • Won’t break on plugin updates
    • Compatible with future versions
    • No core modifications needed
  3. Extensible

    • Other developers can hook in
    • Easy to add/remove features
    • Modular approach
  4. Performance

    • Hooks only fire when needed
    • Conditional loading
    • Optimized execution
  5. Testing

    • Easier to unit test
    • Mock implementations possible
    • Isolated functionality

8. Migration Checklist

When updating your public classes:

  • Replace direct add_action on WP Job Manager hooks with reign compatibility hooks
  • Use reign_wpjm_* filters instead of job_manager_* filters where available
  • Implement action hooks for custom functionality
  • Add proper documentation for custom hooks
  • Test with all three plugins active
  • Test graceful degradation when plugins are deactivated
  • Update class documentation

Hook Reference Table

Original Hook Compatibility Hook Usage
submit_job_form_fields reign_wpjm_job_query_args Modify job queries
job_manager_job_submitted reign_wpjm_job_submitted After job submission
single_resume_start reign_wpjm_single_resume_start Resume display start
job_application_form_fields reign_wpjm_application_fields Customize app fields
new_job_application reign_wpjm_new_application After new application
Last updated: September 4, 2025