/** * register_post_types function. */ public function register_post_types() { if (post_type_exists("job_application")) { return; } $plural = __('Job Applications', 'wp-job-manager-applications'); $singular = __('Application', 'wp-job-manager-applications'); register_post_type("job_application", apply_filters("register_post_type_job_application", array('labels' => array('name' => $plural, 'singular_name' => $singular, 'menu_name' => $plural, 'all_items' => sprintf(__('All %s', 'wp-job-manager-applications'), $plural), 'add_new' => __('Add New', 'wp-job-manager-applications'), 'add_new_item' => sprintf(__('Add %s', 'wp-job-manager-applications'), $singular), 'edit' => __('Edit', 'wp-job-manager-applications'), 'edit_item' => sprintf(__('Edit %s', 'wp-job-manager-applications'), $singular), 'new_item' => sprintf(__('New %s', 'wp-job-manager-applications'), $singular), 'view' => sprintf(__('View %s', 'wp-job-manager-applications'), $singular), 'view_item' => sprintf(__('View %s', 'wp-job-manager-applications'), $singular), 'search_items' => sprintf(__('Search %s', 'wp-job-manager-applications'), $plural), 'not_found' => sprintf(__('No %s found', 'wp-job-manager-applications'), $plural), 'not_found_in_trash' => sprintf(__('No %s found in trash', 'wp-job-manager-applications'), $plural), 'parent' => sprintf(__('Parent %s', 'wp-job-manager-applications'), $singular)), 'description' => __('This is where you can edit and view applications.', 'wp-job-manager-applications'), 'public' => false, 'show_ui' => true, 'capability_type' => 'job_application', 'map_meta_cap' => true, 'publicly_queryable' => false, 'exclude_from_search' => true, 'hierarchical' => false, 'rewrite' => false, 'query_var' => false, 'supports' => array('title', 'custom-fields', 'editor'), 'has_archive' => false, 'show_in_nav_menus' => false))); $applicaton_statuses = get_job_application_statuses(); foreach ($applicaton_statuses as $name => $label) { register_post_status($name, apply_filters('register_job_application_status', array('label' => $label, 'public' => true, 'exclude_from_search' => 'archived' === $name ? true : false, 'show_in_admin_all_list' => 'archived' === $name ? false : true, 'show_in_admin_status_list' => true, 'label_count' => _n_noop($label . ' <span class="count">(%s)</span>', $label . ' <span class="count">(%s)</span>', 'wp-job-manager')), $name)); } }
/** * Past Applications */ public function past_applications() { // If user is not logged in, abort if (!is_user_logged_in()) { do_action('job_manager_job_applications_past_logged_out'); return; } $args = apply_filters('job_manager_job_applications_past_args', array('post_type' => 'job_application', 'post_status' => array_keys(get_job_application_statuses()), 'posts_per_page' => -1, 'ignore_sticky_posts' => 1, 'meta_key' => '_candidate_user_id', 'meta_value' => get_current_user_id())); $applications = new WP_Query($args); if ($applications->have_posts()) { get_job_manager_template('past-applications.php', array('applications' => $applications->query($args)), 'wp-job-manager-applications', JOB_MANAGER_APPLICATIONS_PLUGIN_DIR . '/templates/'); } else { get_job_manager_template('past-applications-none.php', array(), 'wp-job-manager-applications', JOB_MANAGER_APPLICATIONS_PLUGIN_DIR . '/templates/'); } }
/** * Past Applications */ public function past_applications($atts) { // If user is not logged in, abort if (!is_user_logged_in()) { do_action('job_manager_job_applications_past_logged_out'); return; } extract(shortcode_atts(array('posts_per_page' => '25'), $atts)); $args = apply_filters('job_manager_job_applications_past_args', array('post_type' => 'job_application', 'post_status' => array_keys(get_job_application_statuses()), 'posts_per_page' => $posts_per_page, 'offset' => (max(1, get_query_var('paged')) - 1) * $posts_per_page, 'ignore_sticky_posts' => 1, 'meta_key' => '_candidate_user_id', 'meta_value' => get_current_user_id())); $applications = new WP_Query($args); ob_start(); if ($applications->have_posts()) { get_job_manager_template('past-applications.php', array('applications' => $applications->posts, 'max_num_pages' => $applications->max_num_pages), 'wp-job-manager-applications', JOB_MANAGER_APPLICATIONS_PLUGIN_DIR . '/templates/'); } else { get_job_manager_template('past-applications-none.php', array(), 'wp-job-manager-applications', JOB_MANAGER_APPLICATIONS_PLUGIN_DIR . '/templates/'); } return ob_get_clean(); }
/** * Publish meta box */ public function job_application_save($post) { $statuses = get_job_application_statuses(); ?> <div class="submitbox" id="submitpost"> <div id="minor-publishing"> <div id="misc-publishing-actions"> <div class="misc-pub-section misc-pub-post-status"> <div id="post-status-select"> <select name='post_status' id='post_status'> <?php foreach ($statuses as $key => $label) { $selected = selected($post->post_status, $key, false); echo "<option{$selected} value='" . esc_attr($key) . "'>" . esc_html($label) . "</option>"; } ?> </select> </div> </div> </div> </div> <div id="major-publishing-actions"> <div id="delete-action"> <a class="submitdelete deletion" href="<?php echo get_delete_post_link($post->ID); ?> "><?php _e('Move to Trash'); ?> </a> </div> <div id="publishing-action"> <span class="spinner"></span> <input name="save" class="button button-primary" type="submit" value="<?php _e('Save', 'wp-job-manager-applications'); ?> "> </div> <div class="clear"></div> </div> </div> <?php }
/** * Adds post status to the "submitdiv" Meta Box and post type WP List Table screens. Based on https://gist.github.com/franz-josef-kaiser/2930190 * * @return void */ public function extend_submitdiv_post_status() { global $wp_post_statuses, $post, $post_type; // Abort if we're on the wrong post type, but only if we got a restriction if ('job_application' !== $post_type) { return; } // Get all non-builtin post status and add them as <option> $options = $display = ''; foreach ($wp_post_statuses as $status) { if (!$status->_builtin && in_array($status->name, array_keys(get_job_application_statuses()))) { // Match against the current posts status $selected = selected($post->post_status, $status->name, false); // If we one of our custom post status is selected, remember it $selected and $display = $status->label; $label = strip_tags($status->label); // Build the options $options .= "<option{$selected} value='{$status->name}'>{$label}</option>"; } } ?> <script type="text/javascript"> jQuery( document ).ready( function($) { <?php // Add the selected post status label to the "Status: [Name] (Edit)" if (!empty($display)) { ?> jQuery( '#post-status-display' ).html( '<?php echo $display; ?> ' );<?php } ?> var select = jQuery( '#post-status-select' ).find( 'select' ); jQuery( select ).append( "<?php echo $options; ?> " ); } ); </script> <?php }
/** * When the status changes */ public function transition_post_status($new_status, $old_status, $post) { if ('job_application' !== $post->post_type) { return; } $statuses = get_job_application_statuses(); // Add a note if ($old_status !== $new_status && array_key_exists($old_status, $statuses) && array_key_exists($new_status, $statuses)) { $user = get_user_by('id', get_current_user_id()); $comment_author = $user->display_name; $comment_author_email = $user->user_email; $comment_post_ID = $post->ID; $comment_author_url = ''; $comment_content = sprintf(__('Application status changed from "%s" to "%s"', 'wp-job-manager-applications'), $statuses[$old_status], $statuses[$new_status]); $comment_agent = 'WP Job Manager'; $comment_type = 'job_application_note'; $comment_parent = 0; $comment_approved = 1; $commentdata = apply_filters('job_application_note_data', compact('comment_post_ID', 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_content', 'comment_agent', 'comment_type', 'comment_parent', 'comment_approved'), $application_id); $comment_id = wp_insert_comment($commentdata); } if ('hired' === $new_status) { update_post_meta(wp_get_post_parent_id($post->ID), '_filled', 1); } }
/** * Show applications on the job dashboard */ public function show_applications($atts) { $job_id = absint($_REQUEST['job_id']); $job = get_post($job_id); extract(shortcode_atts(array('posts_per_page' => '20'), $atts)); remove_filter('the_title', array($this, 'add_breadcrumb_to_the_title')); // Permissions if (!job_manager_user_can_edit_job($job_id)) { _e('You do not have permission to view this job.', 'wp-job-manager-applications'); return; } wp_enqueue_script('wp-job-manager-applications-dashboard'); $args = apply_filters('job_manager_job_applications_args', array('post_type' => 'job_application', 'post_status' => array_diff(array_merge(array_keys(get_job_application_statuses()), array('publish')), array('archived')), 'ignore_sticky_posts' => 1, 'posts_per_page' => $posts_per_page, 'offset' => (max(1, get_query_var('paged')) - 1) * $posts_per_page, 'post_parent' => $job_id)); // Filters $application_status = !empty($_GET['application_status']) ? sanitize_text_field($_GET['application_status']) : ''; $application_orderby = !empty($_GET['application_orderby']) ? sanitize_text_field($_GET['application_orderby']) : ''; if ($application_status) { $args['post_status'] = $application_status; } switch ($application_orderby) { case 'name': $args['order'] = 'ASC'; $args['orderby'] = 'post_title'; break; case 'rating': $args['order'] = 'DESC'; $args['orderby'] = 'meta_value'; $args['meta_key'] = '_rating'; break; default: $args['order'] = 'DESC'; $args['orderby'] = 'date'; break; } $applications = new WP_Query(); $columns = apply_filters('job_manager_job_applications_columns', array('name' => __('Name', 'wp-job-manager-applications'), 'email' => __('Email', 'wp-job-manager-applications'), 'date' => __('Date Received', 'wp-job-manager-applications'))); get_job_manager_template('job-applications.php', array('applications' => $applications->query($args), 'job_id' => $job_id, 'max_num_pages' => $applications->max_num_pages, 'columns' => $columns, 'application_status' => $application_status, 'application_orderby' => $application_orderby), 'wp-job-manager-applications', JOB_MANAGER_APPLICATIONS_PLUGIN_DIR . '/templates/'); }
/** * See if a user has already appled for a job * @param int $user_id * @param int $job_id * @return bool */ function user_has_applied_for_job($user_id, $job_id) { if (!$user_id) { return false; } return sizeof(get_posts(array('post_type' => 'job_application', 'post_status' => array_merge(array_keys(get_job_application_statuses()), array('publish')), 'posts_per_page' => 1, 'fields' => 'ids', 'post_parent' => $job_id, 'meta_query' => array(array('key' => '_candidate_user_id', 'value' => absint($user_id)))))); }
<fieldset class="fieldset-status"> <label for="application-status-<?php esc_attr_e($application->ID); ?> "><?php _e('Application status', 'wp-job-manager-applications'); ?> :</label> <div class="field"> <select id="application-status-<?php esc_attr_e($application->ID); ?> " name="application_status"> <?php foreach (get_job_application_statuses() as $name => $label) { ?> <option value="<?php echo esc_attr($name); ?> " <?php selected($application->post_status, $name); ?> ><?php echo esc_html($label); ?> </option> <?php } ?> </select>
/** * Add statuses to admin */ public function add_custom_statuses() { global $typenow; if ('job_application' === $typenow) { echo "<script>jQuery(document).ready( function() {"; echo "jQuery( 'select[name=\"_status\"]' ).find('option[value!=\"-1\"]').remove();"; foreach (get_job_application_statuses() as $key => $value) { echo "jQuery( 'select[name=\"_status\"]' ).append( '<option value=\"" . esc_attr($key) . "\">" . esc_attr($value) . "</option>' );"; } echo "});</script>"; } }