/**
  * 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>";
     }
 }