This guide shows how public classes and theme developers should leverage the new compatibility hooks instead of directly implementing functionality.
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;
}
}
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;
}
}
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);
}
}
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);
}
}
}
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;
}
}
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;
}
}
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'));
-
Cleaner Code
- Separation of concerns
- Easier to maintain
- Better organization
-
Update-Safe
- Won’t break on plugin updates
- Compatible with future versions
- No core modifications needed
-
Extensible
- Other developers can hook in
- Easy to add/remove features
- Modular approach
-
Performance
- Hooks only fire when needed
- Conditional loading
- Optimized execution
-
Testing
- Easier to unit test
- Mock implementations possible
- Isolated functionality
When updating your public classes:
- Replace direct
add_actionon WP Job Manager hooks with reign compatibility hooks - Use
reign_wpjm_*filters instead ofjob_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
| 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 |
