You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

336 lines
12 KiB
PHP

<?php
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
class AWSM_Job_Openings_Info {
private static $instance = null;
protected $cpath = null;
public function __construct() {
$this->cpath = untrailingslashit( plugin_dir_path( __FILE__ ) );
add_action( 'admin_init', array( $this, 'redirect_to_setup' ) );
add_action( 'admin_head', array( $this, 'remove_menu' ) );
add_action( 'in_admin_header', array( $this, 'nav_header' ) );
add_action( 'admin_menu', array( $this, 'custom_admin_menu' ) );
add_action( 'admin_footer', array( $this, 'admin_add_js' ) );
add_action( 'manage_posts_extra_tablenav', array( $this, 'empty_posts' ) );
add_action( 'wp_ajax_awsm_jobs_setup', array( $this, 'handle_setup' ) );
add_filter( 'admin_body_class', array( $this, 'admin_body_class' ) );
}
public static function init() {
if ( is_null( self::$instance ) ) {
self::$instance = new self();
}
return self::$instance;
}
public function redirect_to_setup() {
if ( ! get_transient( '_awsm_activation_redirect' ) ) {
return;
}
delete_transient( '_awsm_activation_redirect' );
if ( is_network_admin() || isset( $_GET['activate-multi'] ) ) {
return;
}
wp_safe_redirect( add_query_arg( array( 'page' => 'awsm-jobs-setup' ), admin_url( 'edit.php?post_type=awsm_job_openings' ) ) );
exit;
}
public function handle_setup() {
$response = array(
'success' => array(),
'error' => array(),
);
if ( ! isset( $_POST['awsm_job_nonce'] ) || ! wp_verify_nonce( $_POST['awsm_job_nonce'], 'awsm-jobs-setup' ) ) {
$response['error'][] = esc_html__( 'Failed to verify nonce!', 'wp-job-openings' );
}
if ( ! current_user_can( 'manage_options' ) ) {
$response['error'][] = esc_html__( 'You do not have sufficient permissions to make this request!', 'wp-job-openings' );
}
if ( count( $response['error'] ) === 0 ) {
$update_options = array();
$options = array(
'awsm_job_company_name' => array(
'label' => __( 'Name of company', 'wp-job-openings' ),
'sanitize_cb' => 'sanitize_text_field',
),
'awsm_hr_email_address' => array(
'label' => __( 'Recruiter Email Address', 'wp-job-openings' ),
'sanitize_cb' => 'sanitize_email',
),
'awsm_select_page_listing' => array(
'label' => __( 'Job listing page', 'wp-job-openings' ),
'sanitize_cb' => 'intval',
),
);
foreach ( $options as $option => $option_details ) {
if ( ! isset( $_POST[ $option ] ) || empty( $_POST[ $option ] ) ) {
/* translators: %s: Form field label */
$response['error'][] = sprintf( esc_html__( '%s is required!', 'wp-job-openings' ), esc_html( $option_details['label'] ) );
} else {
$field_val = call_user_func( $option_details['sanitize_cb'], $_POST[ $option ] );
if ( $option === 'awsm_hr_email_address' ) {
if ( ! is_email( $field_val ) ) {
$response['error'][] = esc_html__( 'Recruiter Email Address is invalid!', 'wp-job-openings' );
}
}
if ( count( $response['error'] ) === 0 ) {
$update_options[ $option ] = $field_val;
}
}
}
if ( count( $update_options ) === count( $options ) ) {
foreach ( $update_options as $update_option => $field_val ) {
update_option( $update_option, $field_val );
if ( $update_option === 'awsm_hr_email_address' ) {
update_option( 'awsm_jobs_hr_notification', $field_val );
update_option( 'awsm_jobs_admin_to_notification', $field_val );
} elseif ( $update_option === 'awsm_select_page_listing' ) {
AWSM_Job_Openings::add_shortcode_to_page( $field_val );
}
}
update_option( 'awsm_jobs_plugin_version', AWSM_JOBS_PLUGIN_VERSION );
$response['redirect'] = esc_url_raw( add_query_arg( array( 'page' => 'awsm-jobs-overview' ), admin_url( 'edit.php?post_type=awsm_job_openings' ) ) );
$response['success'][] = esc_html__( 'Setup successfully completed!', 'wp-job-openings' );
}
}
wp_send_json( $response );
}
public function custom_admin_menu() {
add_submenu_page( 'edit.php?post_type=awsm_job_openings', esc_html__( 'WP Job Openings Setup', 'wp-job-openings' ), esc_html__( 'Setup', 'wp-job-openings' ), 'manage_options', 'awsm-jobs-setup', array( $this, 'setup_page' ) );
add_submenu_page( 'edit.php?post_type=awsm_job_openings', esc_html__( 'Add-ons', 'wp-job-openings' ), esc_html__( 'Add-ons', 'wp-job-openings' ), 'manage_awsm_jobs', 'awsm-jobs-add-ons', array( $this, 'add_ons_page' ) );
// Add Get PRO link in submenu.
if ( ! class_exists( 'AWSM_Job_Openings_Pro_Pack' ) && current_user_can( 'edit_others_applications' ) ) {
global $submenu;
// phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
$submenu['edit.php?post_type=awsm_job_openings'][] = array(
sprintf( '<span class="awsm-jobs-get-pro">%s</span>', esc_html__( 'Upgrade', 'wp-job-openings' ) ),
'edit_others_applications',
esc_url( 'https://awsm.in/get/wpjo-pro/' ),
);
}
}
public function remove_menu() {
remove_submenu_page( 'edit.php?post_type=awsm_job_openings', 'awsm-jobs-setup' );
}
public function setup_page() {
include_once $this->cpath . '/templates/info/setup.php';
}
public function add_ons_page() {
include_once $this->cpath . '/templates/info/add-ons.php';
}
public function empty_posts( $which ) {
global $post_type;
if ( $post_type === 'awsm_job_openings' && $which === 'bottom' ) {
$overview_data = AWSM_Job_Openings::get_overview_data();
if ( $overview_data['total_jobs'] === 0 ) {
$this->empty_jobs();
}
}
}
public static function empty_jobs() {
$user_obj = wp_get_current_user();
?>
<div class="awsm-jobs-empty-list">
<img src="<?php echo esc_url( AWSM_JOBS_PLUGIN_URL . '/assets/img/empty-state.svg' ); ?>" width="113" height="113" />
<h2>
<?php
/* translators: %s: Current user name */
printf( esc_html__( 'Welcome, %s', 'wp-job-openings' ), esc_html( $user_obj->display_name ) );
?>
</h2>
<div class="awsm-jobs-empty-list-msg">
<p><?php esc_html_e( 'Start adding job openings to your website', 'wp-job-openings' ); ?></p>
</div>
<div class="awsm-jobs-empty-list-btn-wrapper">
<a href="<?php echo esc_url( admin_url( 'post-new.php?post_type=awsm_job_openings' ) ); ?>" class="button button-primary button-large"><?php esc_html_e( 'Add New Job Opening', 'wp-job-openings' ); ?></a>
</div>
</div>
<?php
}
public function get_add_on_btn_content( $plugin, $add_on_details = array() ) {
$plugin_slug = $installed_plugin = $content = $btn_attrs = ''; // phpcs:ignore Squiz.PHP.DisallowMultipleAssignments.Found
$action_url = $add_on_details['url'];
$btn_action = __( 'Get it now', 'wp-job-openings' );
$btn_class = 'button button-large';
$btn_target = '_self';
if ( ! empty( $plugin ) ) {
$plugin_arr = explode( '/', esc_html( $plugin ) );
$plugin_slug = $plugin_arr[0];
$plugin_root = WP_PLUGIN_DIR . '/' . $plugin_slug;
$installed_plugin = file_exists( $plugin_root ) ? get_plugins( '/' . $plugin_slug ) : '';
}
if ( empty( $installed_plugin ) ) {
if ( get_filesystem_method( array(), plugin_dir_path( dirname( dirname( __FILE__ ) ) ) ) === 'direct' && $add_on_details['type'] === 'free' ) {
$btn_class .= ' install-now';
$action_url = wp_nonce_url( self_admin_url( 'update.php?action=install-plugin&plugin=' . $plugin_slug ), 'install-plugin_' . $plugin_slug );
} else {
$btn_target = '_blank';
}
} else {
if ( is_plugin_active( $plugin ) ) {
$btn_action = __( 'Activated', 'wp-job-openings' );
$action_url = '#';
$btn_class .= ' button-disabled';
$btn_attrs = ' disabled';
} else {
$btn_action = __( 'Activate', 'wp-job-openings' );
$action_url = wp_nonce_url( self_admin_url( 'plugins.php?action=activate&plugin=' . $plugin ), 'activate-plugin_' . $plugin );
$btn_class .= ' activate-now';
}
}
if ( ! empty( $action_url ) ) {
$content = sprintf( '<a href="%2$s" class="%3$s" target="%4$s"%5$s>%1$s</a>', esc_html( $btn_action ), esc_url( $action_url ), esc_attr( $btn_class ), esc_attr( $btn_target ), esc_attr( $btn_attrs ) );
}
return $content;
}
public static function get_admin_nav_page() {
$is_page = false;
$screen = get_current_screen();
if ( ! empty( $screen ) ) {
$post_type = $screen->post_type;
if ( ( $post_type === 'awsm_job_openings' ) || ( $post_type === 'awsm_job_application' ) ) {
$is_page = $screen->id;
// Check if page is the setup page.
if ( isset( $_GET['page'] ) && $_GET['page'] === 'awsm-jobs-setup' ) {
$is_page = false;
}
// Check if the page have the block editor (Gutenberg) active.
if ( method_exists( $screen, 'is_block_editor' ) && $screen->is_block_editor() ) {
$is_page = false;
}
// Check if the WPBakery Page Builder front-end editor is active or not.
if ( function_exists( 'vc_is_inline' ) && vc_is_inline() ) {
$is_page = false;
}
}
}
return $is_page;
}
public function admin_body_class( $classes ) {
$nav_page = self::get_admin_nav_page();
if ( ! empty( $nav_page ) ) {
$classes .= ' awsm-job-admin-nav-page ';
if ( $nav_page === 'edit-awsm_job_openings' ) {
$overview_data = AWSM_Job_Openings::get_overview_data();
if ( $overview_data['total_jobs'] === 0 ) {
$classes .= 'awsm-jobs-empty-list-page ';
}
}
}
return $classes;
}
public function nav_header() {
$nav_page = self::get_admin_nav_page();
if ( ! empty( $nav_page ) ) :
$nav_items = array(
array(
'visible' => current_user_can( 'edit_jobs' ),
'id' => 'edit-awsm_job_openings',
'label' => __( 'Openings', 'wp-job-openings' ),
'url' => admin_url( 'edit.php?post_type=awsm_job_openings' ),
),
array(
'visible' => current_user_can( 'edit_applications' ),
'id' => 'edit-awsm_job_application',
'label' => __( 'Applications', 'wp-job-openings' ),
'url' => admin_url( 'edit.php?post_type=awsm_job_application' ),
),
array(
'visible' => current_user_can( 'manage_awsm_jobs' ),
'id' => 'awsm_job_openings_page_awsm-jobs-settings',
'label' => __( 'Settings', 'wp-job-openings' ),
'url' => admin_url( 'edit.php?post_type=awsm_job_openings&page=awsm-jobs-settings' ),
),
array(
'visible' => current_user_can( 'manage_awsm_jobs' ),
'id' => 'awsm_job_openings_page_awsm-jobs-add-ons',
'label' => __( 'Add-Ons', 'wp-job-openings' ),
'url' => admin_url( 'edit.php?post_type=awsm_job_openings&page=awsm-jobs-add-ons' ),
),
array(
'visible' => ! class_exists( 'AWSM_Job_Openings_Pro_Pack' ) && current_user_can( 'edit_others_applications' ),
'label' => __( 'Upgrade', 'wp-job-openings' ),
'url' => 'https://awsm.in/get/wpjo-pro/',
'class' => array( 'button' ),
'target' => '_blank',
),
);
/**
* Filters admin navigation items.
*
* @since 2.0.0
*
* @param array $nav_items Items data array.
* @param string $nav_page The page/screen ID.
*/
$nav_items = apply_filters( 'awsm_jobs_admin_nav_items', $nav_items, $nav_page );
?>
<div class="awsm-job-admin-nav-header">
<div class="awsm-job-admin-nav-logo">
<a href="<?php echo esc_url( admin_url( 'edit.php?post_type=awsm_job_openings&page=awsm-jobs-overview' ) ); ?>">
<?php esc_html_e( 'WP Job Openings', 'wp-job-openings' ); ?>
</a>
</div>
<ul class="awsm-job-admin-nav">
<?php
foreach ( $nav_items as $nav_item ) {
$display = isset( $nav_item['visible'] ) ? $nav_item['visible'] : true;
if ( $display ) {
$extra_atts = '';
$class = isset( $nav_item['class'] ) ? $nav_item['class'] : array();
if ( isset( $nav_item['id'] ) && $nav_page === $nav_item['id'] ) {
$class[] = 'active';
}
if ( ! empty( $class ) ) {
$extra_atts = ' class="' . esc_attr( implode( ' ', $class ) ) . '"';
}
if ( isset( $nav_item['target'] ) ) {
$extra_atts .= ' target="' . esc_attr( $nav_item['target'] ) . '"';
}
// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
printf( '<li><a href="%2$s"%3$s>%1$s</a></li>', esc_html( $nav_item['label'] ), esc_url( $nav_item['url'] ), $extra_atts );
}
}
?>
</ul>
</div>
<?php
endif;
}
public function admin_add_js() {
?>
<script type="text/javascript">
jQuery(document).ready(function($) {
$('#adminmenu .awsm-jobs-get-pro').parent('a').attr('target', '_blank');
});
</script>
<?php
}
}