unregister_awsm_job_openings_post_type(); $this->register_post_types(); $this->manage_default_roles_caps(); $this->add_custom_role(); $this->create_upload_directory(); } public function unregister() { $this->unregister_awsm_job_openings_post_type(); $this->manage_default_roles_caps( 'remove' ); $this->remove_custom_role(); } public function register_post_types() { if ( post_type_exists( 'awsm_job_openings' ) ) { return; } $labels = array( 'name' => __( 'Job Openings', 'wp-job-openings' ), 'singular_name' => __( 'Job', 'wp-job-openings' ), 'add_new' => __( 'New Opening', 'wp-job-openings' ), 'add_new_item' => __( 'Add New Job', 'wp-job-openings' ), 'edit_item' => __( 'Edit Job', 'wp-job-openings' ), 'new_item' => __( 'New job', 'wp-job-openings' ), 'search_items' => __( 'Search Jobs', 'wp-job-openings' ), 'not_found' => __( 'No Jobs found', 'wp-job-openings' ), 'not_found_in_trash' => __( 'No Jobs found in Trash', 'wp-job-openings' ), 'parent_item_colon' => __( 'Parent Job :', 'wp-job-openings' ), 'menu_name' => __( 'Job Openings', 'wp-job-openings' ), 'view_item' => __( 'View Job listing', 'wp-job-openings' ), 'view_items' => __( 'View Job listings', 'wp-job-openings' ), 'item_published' => __( 'Job listing published.', 'wp-job-openings' ), 'item_published_privately' => __( 'Job listing published privately.', 'wp-job-openings' ), 'item_reverted_to_draft' => __( 'Job listing reverted to draft.', 'wp-job-openings' ), 'item_scheduled' => __( 'Job listing scheduled.', 'wp-job-openings' ), 'item_updated' => __( 'Job listing updated.', 'wp-job-openings' ), ); $has_archive = get_option( 'awsm_jobs_disable_archive_page' ) !== 'disable' ? true : false; $with_front = get_option( 'awsm_jobs_remove_permalink_front_base' ) !== 'remove' ? true : false; $supports = array( 'title', 'editor', 'excerpt', 'author', 'custom-fields', 'publicize' ); $featured_image_support = get_option( 'awsm_jobs_enable_featured_image' ); if ( $featured_image_support === 'enable' ) { $supports[] = 'thumbnail'; } /** * Filters 'awsm_job_openings' post type arguments. * * @since 1.4 * * @param array $args arguments. */ $args = apply_filters( 'awsm_job_openings_args', array( 'has_archive' => $has_archive, 'labels' => $labels, 'hierarchical' => false, 'map_meta_cap' => true, 'taxonomies' => array(), 'public' => true, 'show_ui' => true, 'show_in_rest' => true, 'show_in_menu' => true, 'rewrite' => array( 'slug' => get_option( 'awsm_permalink_slug', 'jobs' ), 'with_front' => $with_front, ), 'capability_type' => 'job', 'menu_icon' => esc_url( AWSM_JOBS_PLUGIN_URL . '/assets/img/nav-icon.svg' ), 'supports' => $supports, ) ); register_post_type( 'awsm_job_openings', $args ); if ( post_type_exists( 'awsm_job_application' ) ) { return; } $labels = array( 'name' => __( 'Applications', 'wp-job-openings' ), 'singular_name' => __( 'Application', 'wp-job-openings' ), 'menu_name' => __( 'Applications', 'wp-job-openings' ), 'edit_item' => __( 'Applications', 'wp-job-openings' ), 'search_items' => __( 'Search Applications', 'wp-job-openings' ), 'not_found' => __( 'No Applications found', 'wp-job-openings' ), 'not_found_in_trash' => __( 'No Applications found in Trash', 'wp-job-openings' ), ); /** * Filters 'awsm_job_application' post type arguments. * * @since 1.4 * * @param array $args arguments. */ $args = apply_filters( 'awsm_job_application_args', array( 'labels' => $labels, 'public' => false, 'show_ui' => true, 'map_meta_cap' => true, 'show_in_menu' => 'edit.php?post_type=awsm_job_openings', 'capability_type' => 'application', 'capabilities' => array( 'create_posts' => 'do_not_allow', ), 'supports' => false, 'rewrite' => false, ) ); register_post_type( 'awsm_job_application', $args ); } private function get_caps() { $caps = array( 'level_1' => array( 'edit_jobs' => true, 'delete_jobs' => true, 'edit_applications' => true, 'delete_applications' => true, ), 'level_2' => array( 'edit_published_jobs' => true, 'delete_published_jobs' => true, 'publish_jobs' => true, 'edit_published_applications' => true, 'delete_published_applications' => true, 'publish_applications' => true, ), 'level_3' => array( 'edit_others_jobs' => true, 'read_private_jobs' => true, 'delete_private_jobs' => true, 'delete_others_jobs' => true, 'edit_private_jobs' => true, 'edit_others_applications' => true, 'read_private_applications' => true, 'delete_private_applications' => true, 'delete_others_applications' => true, 'edit_private_applications' => true, ), 'level_4' => array( 'manage_awsm_jobs' => true, ), ); return $caps; } private function manage_default_roles_caps( $action = 'add' ) { $caps = $this->get_caps(); $role_caps = array( 'administrator' => array_merge( $caps['level_1'], $caps['level_2'], $caps['level_3'], $caps['level_4'] ), 'editor' => array_merge( $caps['level_1'], $caps['level_2'], $caps['level_3'] ), 'author' => array_merge( $caps['level_1'], $caps['level_2'] ), 'contributor' => $caps['level_1'], ); foreach ( $role_caps as $slug => $current_caps ) { $role = get_role( $slug ); if ( $role ) { foreach ( $current_caps as $current_cap => $value ) { if ( $action === 'remove' ) { $role->remove_cap( $current_cap ); } else { $role->add_cap( $current_cap ); } } } } } private function add_custom_role() { $caps = $this->get_caps(); $hr_caps = array_merge( $caps['level_1'], $caps['level_2'], $caps['level_3'], $caps['level_4'] ); $hr_caps['read'] = true; $hr_caps['upload_files'] = true; add_role( 'hr', __( 'HR', 'wp-job-openings' ), $hr_caps ); } private function remove_custom_role() { if ( get_role( 'hr' ) ) { remove_role( 'hr' ); } } public function unregister_awsm_job_openings_post_type() { global $wp_post_types; if ( isset( $wp_post_types['awsm_job_openings'] ) ) { unset( $wp_post_types['awsm_job_openings'] ); return true; } return false; } private function create_upload_directory() { $upload_dir = wp_upload_dir(); $base_dir = trailingslashit( $upload_dir['basedir'] ); $upload_dir = $base_dir . AWSM_JOBS_UPLOAD_DIR_NAME; $files = array( array( 'name' => 'index.html', 'content' => '', ), array( 'name' => '.htaccess', 'content' => 'Options -Indexes', ), ); if ( wp_mkdir_p( $upload_dir ) ) { foreach ( $files as $file ) { $current_file = trailingslashit( $upload_dir ) . $file['name']; if ( ! file_exists( $current_file ) ) { $handle = @fopen( $current_file, 'w' ); if ( $handle ) { fwrite( $handle, $file['content'] ); fclose( $handle ); } } } } } public static function get_attachments_meta_query( $meta_query ) { $query = array( 'relation' => 'OR', array( 'key' => '_wp_attached_file', 'compare' => 'NOT EXISTS', ), array( 'key' => '_wp_attached_file', 'compare' => 'NOT LIKE', 'value' => AWSM_JOBS_UPLOAD_DIR_NAME, ), ); if ( is_array( $meta_query ) && ! empty( $meta_query ) ) { $meta_query[] = $query; } else { $meta_query = array( $query ); } return $meta_query; } public function list_attachments( $query ) { if ( is_admin() && $query->is_main_query() ) { $screen = get_current_screen(); if ( ! empty( $screen ) && $screen->id === 'upload' && $screen->post_type === 'attachment' ) { $meta_query = $query->get( 'meta_query' ); $query->set( 'meta_query', self::get_attachments_meta_query( $meta_query ) ); } } } public function grid_attachments( $query ) { if ( is_admin() ) { $meta_query = isset( $query['meta_query'] ) ? $query['meta_query'] : array(); $query['meta_query'] = self::get_attachments_meta_query( $meta_query ); } return $query; } public function job_updated_messages( $messages ) { global $post, $post_ID; $permalink = get_permalink( $post_ID ); $preview_url = function_exists( 'get_preview_post_link' ) ? get_preview_post_link( $post ) : add_query_arg( 'preview', 'true', $permalink ); // Preview job link. $preview_post_link_html = sprintf( ' %2$s', esc_url( $preview_url ), __( 'Preview Job listing', 'wp-job-openings' ) ); // Scheduled job preview link. $scheduled_post_link_html = sprintf( ' %2$s', esc_url( $permalink ), __( 'Preview Job listing', 'wp-job-openings' ) ); // View job link. $view_post_link_html = sprintf( ' %2$s', esc_url( $permalink ), __( 'View Job listing', 'wp-job-openings' ) ); $scheduled_date = date_i18n( get_awsm_jobs_date_format( 'scheduled-date' ) . ' @ ' . get_awsm_jobs_time_format( 'scheduled-date' ), strtotime( $post->post_date ) ); $messages['awsm_job_openings'] = array( 0 => '', // Unused. Messages start at index 1. 1 => __( 'Job listing updated.', 'wp-job-openings' ) . $view_post_link_html, 2 => __( 'Custom field updated.', 'default' ), 3 => __( 'Custom field deleted.', 'default' ), 4 => __( 'Job listing updated.', 'wp-job-openings' ), /* translators: %s: date and time of the revision */ 5 => isset( $_GET['revision'] ) ? sprintf( __( 'Job listing restored to revision from %s.', 'wp-job-openings' ), wp_post_revision_title( intval( $_GET['revision'] ), false ) ) : false, 6 => __( 'Job listing published.', 'wp-job-openings' ) . $view_post_link_html, 7 => __( 'Job listing saved.', 'wp-job-openings' ), 8 => __( 'Job listing submitted.', 'wp-job-openings' ) . $preview_post_link_html, /* translators: %s: scheduled date */ 9 => sprintf( __( 'Job listing scheduled for: %s.', 'wp-job-openings' ), '' . $scheduled_date . '' ) . $scheduled_post_link_html, 10 => __( 'Job listing draft updated.', 'wp-job-openings' ) . $preview_post_link_html, ); $messages['awsm_job_application'] = array( 0 => '', // Unused. Messages start at index 1. 1 => __( 'Application updated.', 'wp-job-openings' ), 2 => __( 'Custom field updated.', 'default' ), 3 => __( 'Custom field deleted.', 'default' ), 4 => __( 'Application updated.', 'wp-job-openings' ), /* translators: %s: date and time of the revision */ 5 => isset( $_GET['revision'] ) ? sprintf( __( 'Application restored to revision from %s.', 'wp-job-openings' ), wp_post_revision_title( intval( $_GET['revision'] ), false ) ) : false, 6 => __( 'Application published.', 'wp-job-openings' ), 7 => __( 'Application saved.', 'wp-job-openings' ), 8 => __( 'Application submitted.', 'wp-job-openings' ), /* translators: %s: scheduled date */ 9 => sprintf( __( 'Application scheduled for: %s.', 'wp-job-openings' ), '' . $scheduled_date . '' ), 10 => __( 'Application draft updated.', 'wp-job-openings' ), ); return $messages; } public function jobs_bulk_updated_messages( $bulk_messages, $bulk_counts ) { $bulk_messages['awsm_job_openings'] = array( /* translators: %s: job count */ 'updated' => _n( '%s job listing updated.', '%s job listings updated.', $bulk_counts['updated'], 'wp-job-openings' ), /* translators: %s: job count */ 'locked' => _n( '%s job listing not updated, somebody is editing it.', '%s job listings not updated, somebody is editing them.', $bulk_counts['locked'], 'wp-job-openings' ), /* translators: %s: job count */ 'deleted' => _n( '%s job listing permanently deleted.', '%s job listings permanently deleted.', $bulk_counts['deleted'], 'wp-job-openings' ), /* translators: %s: job count */ 'trashed' => _n( '%s job listing moved to the Trash.', '%s job listings moved to the Trash.', $bulk_counts['trashed'], 'wp-job-openings' ), /* translators: %s: job count */ 'untrashed' => _n( '%s job listing restored from the Trash.', '%s job listings restored from the Trash.', $bulk_counts['untrashed'], 'wp-job-openings' ), ); $bulk_messages['awsm_job_application'] = array( /* translators: %s: job application count */ 'updated' => _n( '%s application updated.', '%s applications updated.', $bulk_counts['updated'], 'wp-job-openings' ), /* translators: %s: job application count */ 'locked' => _n( '%s application not updated, somebody is editing it.', '%s applications not updated, somebody is editing them.', $bulk_counts['locked'], 'wp-job-openings' ), /* translators: %s: job application count */ 'deleted' => _n( '%s application permanently deleted.', '%s applications permanently deleted.', $bulk_counts['deleted'], 'wp-job-openings' ), /* translators: %s: job application count */ 'trashed' => _n( '%s application moved to the Trash.', '%s applications moved to the Trash.', $bulk_counts['trashed'], 'wp-job-openings' ), /* translators: %s: job application count */ 'untrashed' => _n( '%s application restored from the Trash.', '%s applications restored from the Trash.', $bulk_counts['untrashed'], 'wp-job-openings' ), ); return $bulk_messages; } /** * Redirect users with HR Role to job page instead of profile page after login. * * @param string $redirect_to The redirect destination URL. * @param string $requested_redirect_to The requested redirect destination URL. * @param WP_User|WP_Error $user WP_User object if login was successful, WP_Error object otherwise. * * @return string */ public function login_redirect( $redirect_to, $requested_redirect_to, $user ) { if ( ! is_wp_error( $user ) && ( empty( $redirect_to ) || 'wp-admin/' === $redirect_to || admin_url() === $redirect_to ) ) { if ( ! empty( $user->roles ) && is_array( $user->roles ) && in_array( 'hr', $user->roles ) && ! $user->has_cap( 'edit_posts' ) && $user->has_cap( 'edit_jobs' ) ) { $url = add_query_arg( array( 'page' => 'awsm-jobs-overview' ), admin_url( 'edit.php?post_type=awsm_job_openings' ) ); /** * Filters login redirection URL for the HR user. * * @since 2.1.1 * * @param string $redirect_url The redirect destination URL. * @param WP_User|WP_Error $user WP_User object if login was successful, WP_Error object otherwise. */ $redirect_url = apply_filters( 'awsm_jobs_login_redirect', esc_url_raw( $url ), $user ); if ( ! empty( $redirect_url ) ) { $redirect_to = $redirect_url; } } } return $redirect_to; } public function woocommerce_disable_backend_access( $disable ) { if ( current_user_can( 'edit_jobs' ) ) { $disable = false; } return $disable; } }