--- a/wp-job-portal/includes/activation.php
+++ b/wp-job-portal/includes/activation.php
@@ -468,7 +468,7 @@
('searchjobtag', '4', 'job', 'tag'),
('categories_colsperrow', '3', 'category', NULL),
('productcode', 'wpjobportal', 'default', NULL),
- ('versioncode', '2.4.4', 'default', NULL),
+ ('versioncode', '2.4.5', 'default', NULL),
('producttype', 'free', 'default', NULL),
('vis_jscredits', '0', 'jscontrolpanel', 'credits'),
('vis_emcredits', '1', 'emcontrolpanel', NULL),
@@ -544,7 +544,7 @@
('vis_emresumebycategory', '1', 'emcontrolpanel', NULL),
('default_pageid', '239', 'default', NULL),
('visitorview_emp_resumesearch', '1', 'visitor', 'resumesearch'),
- ('visitorview_emp_viewresume', '1', 'visitor', NULL),
+ ('visitorview_emp_viewresume', '0', 'visitor', NULL),
('visitorview_emp_resumecat', '1', 'visitor', NULL),
('google_map_api_key', 'AIzaSyCZcnAK0DiGg8lAXej74e7PlrhkfCM86-M', 'default', NULL),
('tell_a_friend_captcha', '1', 'captcha', NULL),
--- a/wp-job-portal/includes/wpjobportal-ai.php
+++ b/wp-job-portal/includes/wpjobportal-ai.php
@@ -1,288 +0,0 @@
-<?php
-/**
- * AI Content Generator – Popup + Button + Preview
- * Works anywhere in WP Admin (Classic Editor, Elementor, WPBakery, custom editors)
- */
-
-
-if (!defined('ABSPATH'))
- die('Restricted Access');
-
-/**
- * Enqueue CSS + JS + Inline Script
- */
-?>
-<style>
-
- /* === AI GENERATOR MODAL – WRAPPER === */
- body .wpjp-ai-modal-overlay {
- position: fixed;
- top: 0; left: 0;
- width: 100%; height: 100%;
- background: rgba(0,0,0,0.55);
- display: none;
- z-index: 999999;
- }
-
- body .wpjp-ai-modal-overlay .wpjp-ai-modal {
- background: #fff;
- width: 750px;
- max-width: 90%;
- margin: 6% auto;
- padding: 0;
- border-radius: 10px;
- overflow: hidden;
- box-shadow: 0 10px 40px rgba(0,0,0,0.2);
- font-family: inherit;
- }
-
- /* === HEADER === */
- body .wpjp-ai-modal-overlay .wpjp-ai-modal .wpjp-ai-modal-header {
- background: #2271b1;
- padding: 15px 20px;
- color: #fff;
- font-size: 18px;
- font-weight: bold;
- }
-
- /* === CONTENT === */
- body .wpjp-ai-modal-overlay .wpjp-ai-modal .wpjp-ai-modal-content {
- padding: 20px;
- max-height: 500px;
- overflow-y: auto;
- }
-
- .wpjp-ai-field-group {
- margin-bottom: 15px;
- }
- .wpjp-ai-field-group label {
- font-weight: 600;
- margin-bottom: 5px;
- display: block;
- }
- .wpjp-ai-field-group input,
- .wpjp-ai-field-group select,
- .wpjp-ai-field-group textarea {
- width: 100%;
- padding: 8px;
- border-radius: 5px;
- }
-
- /* === ACCORDION === */
- .wpjp-ai-accordion-item {
- border: 1px solid #ddd;
- border-radius: 6px;
- margin-bottom: 12px;
- }
- .wpjp-ai-accordion-header {
- padding: 12px;
- background: #f6f7f7;
- cursor: pointer;
- font-weight: 600;
- }
- .wpjp-ai-accordion-body {
- display: none;
- padding: 15px;
- background: #fff;
- }
-
- /* === PREVIEW BOX === */
- body .wpjp-ai-modal-overlay .wpjp-ai-modal .wpjp-ai-preview-box {
- border: 1px solid #ccc;
- background: #fafafa;
- padding: 15px;
- margin-top: 20px;
- border-radius: 6px;
- white-space: pre-wrap;
- }
-
- /* === FOOTER BUTTONS === */
- body .wpjp-ai-modal-overlay .wpjp-ai-modal .wpjp-ai-modal-footer {
- padding: 15px 20px;
- background: #f1f1f1;
- text-align: right;
- }
- body .wpjp-ai-modal-overlay .wpjp-ai-modal .wpjp-ai-btn {
- padding: 8px 18px;
- border-radius: 6px;
- cursor: pointer;
- }
- body .wpjp-ai-modal-overlay .wpjp-ai-modal .wpjp-ai-btn-primary {
- background: #2271b1;
- color: #fff;
- }
- body .wpjp-ai-modal-overlay .wpjp-ai-modal .wpjp-ai-btn-secondary {
- background: #bbb;
- }
- </style>
-
- <?php
- // ---------------------------------------
- // 2. JS
- // ---------------------------------------
- wp_register_script('wpjp-ai-js', '');
- wp_enqueue_script('wpjp-ai-js');
-
- $wpjobportal_js = "
- jQuery(document).ready(function($){
-
- /* OPEN MODAL */
- $('.wpjp-ai-generate-btn').on('click', function(e){
- e.preventDefault();
- $('.wpjp-ai-modal-overlay').fadeIn(200);
- });
-
- /* CLOSE MODAL */
- $(document).on('click', '.wpjp-ai-close-modal', function(){
- $('.wpjp-ai-modal-overlay').fadeOut(200);
- });
-
- /* ACCORDION */
- $('.wpjp-ai-accordion-header').on('click', function(){
- $(this).next('.wpjp-ai-accordion-body').slideToggle(200);
- });
-
- /* GENERATE PREVIEW (DEMO ONLY — replace with AJAX later) */
- $('#wpjp-ai-generate-preview').on('click', function(){
-
- let topic = $('#wpjp-ai-topic').val();
- let length = $('#wpjp-ai-length').val();
- let tone = $('#wpjp-ai-tone').val();
- let lang = $('#wpjp-ai-language').val();
- let style = $('#wpjp-ai-style').val();
- let include = $('#wpjp-ai-keywords').val();
-
- let preview =
- '--- AI Preview ---\n' +
- 'Topic: ' + topic + '\n' +
- 'Length: ' + length + '\n' +
- 'Tone: ' + tone + '\n' +
- 'Language: ' + lang + '\n' +
- 'Style: ' + style + '\n' +
- 'Keywords: ' + include + '\n\n' +
- 'Lorem ipsum generated sample...';
-
- $('.wpjp-ai-preview-box').text(preview);
- });
-
- /* INSERT INTO EDITOR */
- $('#wpjp-ai-insert-content').on('click', function(){
-
- let content = $('.wpjp-ai-preview-box').text();
-
- if (typeof tinyMCE !== 'undefined' && tinyMCE.activeEditor) {
- tinyMCE.activeEditor.execCommand('mceInsertContent', false, content);
- }
-
- let textarea = $('textarea.wp-editor-area');
- if (textarea.length) {
- textarea.val(textarea.val() + "\n" + content);
- }
-
- $('.wpjp-ai-modal-overlay').fadeOut(200);
- });
-
- });
- ";
- wp_add_inline_script('wpjp-ai-js', $wpjobportal_js);
- ?>
-
- <!-- AI CONTENT GENERATOR MODAL -->
- <div class="wpjp-ai-modal-overlay">
- <div class="wpjp-ai-modal">
-
- <div class="wpjp-ai-modal-header">
- <?php echo __('AI Content Generator', 'wp-job-portal'); ?>
- <span class="wpjp-ai-close-modal" style="float:right; cursor:pointer;">×</span>
- </div>
-
- <div class="wpjp-ai-modal-content">
-
- <!-- Accordion – Main Settings -->
- <div class="wpjp-ai-accordion-item">
- <div class="wpjp-ai-accordion-header">
- <?php echo __('Main Options', 'wp-job-portal'); ?>
- </div>
- <div class="wpjp-ai-accordion-body">
- <div class="wpjp-ai-field-group">
- <label><?php echo __('Topic / Prompt', 'wp-job-portal'); ?></label>
- <input id="wpjp-ai-topic" type="text">
- </div>
-
- <div class="wpjp-ai-field-group">
- <label><?php echo __('Content Length', 'wp-job-portal'); ?></label>
- <select id="wpjp-ai-length">
- <option value="short"><?php echo __('Short', 'wp-job-portal'); ?></option>
- <option value="medium"><?php echo __('Medium', 'wp-job-portal'); ?></option>
- <option value="long"><?php echo __('Long', 'wp-job-portal'); ?></option>
- </select>
- </div>
-
- <div class="wpjp-ai-field-group">
- <label><?php echo __('Tone', 'wp-job-portal'); ?></label>
- <select id="wpjp-ai-tone">
- <option value="formal"><?php echo __('Formal', 'wp-job-portal'); ?></option>
- <option value="friendly"><?php echo __('Friendly', 'wp-job-portal'); ?></option>
- <option value="professional"><?php echo __('Professional', 'wp-job-portal'); ?></option>
- </select>
- </div>
-
- </div>
- </div>
-
- <!-- More AI Advanced Settings -->
- <div class="wpjp-ai-accordion-item">
- <div class="wpjp-ai-accordion-header">
- <?php echo __('Advanced Options', 'wp-job-portal'); ?>
- </div>
- <div class="wpjp-ai-accordion-body">
-
- <div class="wpjp-ai-field-group">
- <label><?php echo __('Language', 'wp-job-portal'); ?></label>
- <select id="wpjp-ai-language">
- <option value="en"><?php echo __('English', 'wp-job-portal'); ?></option>
- <option value="es"><?php echo __('Spanish', 'wp-job-portal'); ?></option>
- <option value="fr"><?php echo __('French', 'wp-job-portal'); ?></option>
- <option value="de"><?php echo __('German', 'wp-job-portal'); ?></option>
- </select>
- </div>
-
- <div class="wpjp-ai-field-group">
- <label><?php echo __('Writing Style', 'wp-job-portal'); ?></label>
- <select id="wpjp-ai-style">
- <option value="blog"><?php echo __('Blog Article', 'wp-job-portal'); ?></option>
- <option value="technical"><?php echo __('Technical', 'wp-job-portal'); ?></option>
- <option value="marketing"><?php echo __('Marketing Copy', 'wp-job-portal'); ?></option>
- <option value="story"><?php echo __('Story / Creative', 'wp-job-portal'); ?></option>
- </select>
- </div>
-
- <div class="wpjp-ai-field-group">
- <label><?php echo __('Required Keywords', 'wp-job-portal'); ?></label>
- <input id="wpjp-ai-keywords" type="text" placeholder="<?php echo __('Comma separated', 'wp-job-portal'); ?>">
- </div>
-
- </div>
- </div>
-
- <!-- PREVIEW -->
- <div class="wpjp-ai-preview-box"></div>
-
- </div>
-
- <div class="wpjp-ai-modal-footer">
- <button class="wpjp-ai-btn wpjp-ai-btn-secondary wpjp-ai-close-modal">
- <?php echo __('Close', 'wp-job-portal'); ?>
- </button>
-
- <button id="wpjp-ai-generate-preview" class="wpjp-ai-btn wpjp-ai-btn-primary">
- <?php echo __('Generate Preview', 'wp-job-portal'); ?>
- </button>
-
- <button id="wpjp-ai-insert-content" class="wpjp-ai-btn wpjp-ai-btn-primary">
- <?php echo __('Insert into Editor', 'wp-job-portal'); ?>
- </button>
- </div>
-
- </div>
- </div>
--- a/wp-job-portal/includes/wpjobportal-hooks.php
+++ b/wp-job-portal/includes/wpjobportal-hooks.php
@@ -173,7 +173,11 @@
$wpjobportal_user_first = sanitize_text_field(WPJOBPORTALrequest::getVar("wpjobportal_user_first"));
$wpjobportal_user_last = sanitize_text_field(WPJOBPORTALrequest::getVar("wpjobportal_user_last"));
$wpjobportal_user_pass = wpjobportal::wpjobportal_sanitizeData(WPJOBPORTALrequest::getVar("wpjobportal_user_pass") );
- $wpjobportal_photo = sanitize_file_name($_FILES['photo']['name']);
+ if(!empty($_FILES['photo'])){
+ $wpjobportal_photo = sanitize_file_name($_FILES['photo']['name']);
+ }else{
+ $wpjobportal_photo = '';
+ }
$pass_confirm = wpjobportal::wpjobportal_sanitizeData(WPJOBPORTALrequest::getVar("wpjobportal_user_pass_confirm") );
// this is required for username checks
--- a/wp-job-portal/modules/activitylog/model.php
+++ b/wp-job-portal/modules/activitylog/model.php
@@ -488,7 +488,8 @@
$wpjobportal_entityname = esc_html(__('Email Template', 'wp-job-portal'));
$wpjobportal_linktext = $flag == 1 ? $columns['templatefor'] : $this->getEntityNameOrTitle($wpjobportal_id, 'templatefor', $wpjobportal_tablename);
$wpjobportal_path = "?page=wpjobportal_emailtemplate&wpjobportallt=formemailtemplte&wpjobportalid=$wpjobportal_id";
- $wpjobportal_html = "<a href=" . esc_url($wpjobportal_path) . " target='".esc_attr($wpjobportal_target)."''><strong>" . esc_html($wpjobportal_linktext) . "</strong></a>";
+ $wpjobportal_html = "<strong>" . esc_html($wpjobportal_linktext) . "</strong>";
+ //$wpjobportal_html = "<a href=" . esc_url($wpjobportal_path) . " target='".esc_attr($wpjobportal_target)."''><strong>" . esc_html($wpjobportal_linktext) . "</strong></a>";
break;
//tables that have name as column
case 'companies':
--- a/wp-job-portal/modules/configuration/tmpl/admin_configurations.php
+++ b/wp-job-portal/modules/configuration/tmpl/admin_configurations.php
@@ -1345,7 +1345,7 @@
$usedTags.append(
`<span class="template-tag">
${tag}
- <i class="fas fa-times template-tag-remove" data-tag="${tag}"></i>
+ <span class="template-tag-remove" data-tag="${tag}">X</span>
</span>`
);
});
--- a/wp-job-portal/modules/emailtemplate/model.php
+++ b/wp-job-portal/modules/emailtemplate/model.php
@@ -959,7 +959,8 @@
$wpjobportal_senderEmail = $wpjobportal_config_array['mailfromaddress'];
$wpjobportal_senderName = $wpjobportal_config_array['mailfromname'];
// package status changed mail to User/agency
- if( ($record->userid ? $wpjobportal_emailstatus->agency : $wpjobportal_emailstatus->user) == 1 ){
+ //if( ($record->userid ? $wpjobportal_emailstatus->agency : $wpjobportal_emailstatus->user) == 1 ){ // log error agency is undefined
+ if( $wpjobportal_emailstatus->user == 1 ){
$this->sendEmail($receiveremail, $wpjobportal_msgSubject, $wpjobportal_msgBody, $wpjobportal_senderEmail, $wpjobportal_senderName, '');
}
break;
--- a/wp-job-portal/modules/fieldordering/model.php
+++ b/wp-job-portal/modules/fieldordering/model.php
@@ -598,7 +598,7 @@
if($wpjobportal_data['fieldfor'] == 3){
if(!isset($wpjobportal_data['section']) && isset($wpjobportal_data['section_value'])){
$wpjobportal_data['section'] = $wpjobportal_data['section_value'];
- }elseif($wpjobportal_data['section'] == '' && isset($wpjobportal_data['section_value'])){
+ }elseif(empty($wpjobportal_data['section']) && isset($wpjobportal_data['section_value'])){ // log error fix
$wpjobportal_data['section'] = $wpjobportal_data['section_value'];
}
--- a/wp-job-portal/modules/job/tmpl/admin_jobs.php
+++ b/wp-job-portal/modules/job/tmpl/admin_jobs.php
@@ -239,7 +239,7 @@
<!-- page content -->
<div id="wpjobportal-admin-wrapper" class="p0 bg-n bs-n">
<div id="js_ajax_pleasewait" style="display:none;">
- <img src="<?php echo esc_url(WPJOBPORTAL_PLUGIN_URL); ?>includes/images/pleasewait.gif"/>
+ <img src="<?php echo esc_url(WPJOBPORTAL_PLUGIN_URL); ?>includes/images/spinning-wheel.gif"/>
</div>
<p id="js_jobcopid" style="display:none;">
<?php echo esc_html(__('Job Copied Successfully', 'wp-job-portal')); ?>
--- a/wp-job-portal/modules/jobapply/model.php
+++ b/wp-job-portal/modules/jobapply/model.php
@@ -355,7 +355,8 @@
return $wpjobportal_html;
}
- function getJobApplyDetailByid(){
+ /* may not in used
+ function getJobApplyDetailByid(){
$wpjobportal_id = WPJOBPORTALrequest::getVar('id');
$wpjobportal_pageid = WPJOBPORTALrequest::getVar('pageid');
$wpjobportal_content="";
@@ -415,7 +416,7 @@
}
$wpjobportal_array = array('title' => "", 'wpjobportal_content' => $wpjobportal_content);
return wp_json_encode($wpjobportal_array);
- }
+ }*/
function getApplyNowByJobid() {
$wpjobportal_nonce = WPJOBPORTALrequest::getVar('js_nonce');
@@ -908,8 +909,12 @@
}
}
$return = WPJOBPORTAL_SAVED;
- //if($quick_apply == 0){ // package system calculation ignored in case of quickapply
- $wpjobportal_submitType = wpjobportal::$_config->getConfigValue('submission_type');
+ $wpjobportal_visitor_can_apply_to_job = wpjobportal::$_config->getConfigurationByConfigName('visitor_can_apply_to_job');
+ // package system checks need to ignored for visitor job apply
+ $wpjobportal_submitType = wpjobportal::$_config->getConfigValue('submission_type'); // was showing as undefined in below cases
+ if(WPJOBPORTALincluder::getObjectClass('user')->isguest() && $wpjobportal_visitor_can_apply_to_job == 1){
+ $wpjobportal_data['status'] = 1;// job apply status 1 in case of visitor apply on job
+ }else{
if(in_array('credits', wpjobportal::$_active_addons)){
if($wpjobportal_submitType == 2){
# Perlisting
@@ -955,9 +960,7 @@
$wpjobportal_data['status'] = 1;
}
}
- // }else{
- // $wpjobportal_data['status'] = 1;// job apply status 1 in case of quick job apply
- // }
+ }
$wpjobportal_data = wpjobportal::wpjobportal_sanitizeData($wpjobportal_data);
if (!$wpjobportal_row->bind($wpjobportal_data)) {
--- a/wp-job-portal/modules/resume/controller.php
+++ b/wp-job-portal/modules/resume/controller.php
@@ -136,7 +136,7 @@
//$wpjobportal_layout = 'viewresume';
$wpjobportal_resumeid = '';
try {
- if (current_user_can('manage_options') || (WPJOBPORTALincluder::getObjectClass('user')->isemployer() && $wpjobportal_empflag == 1 || wpjobportal::$_config->getConfigurationByConfigName('visitorview_emp_viewresume') == 1) || WPJOBPORTALincluder::getObjectClass('user')->isjobseeker() ) {
+ if (current_user_can('manage_options') || (WPJOBPORTALincluder::getObjectClass('user')->isemployer() && $wpjobportal_empflag == 1) || wpjobportal::$_config->getConfigurationByConfigName('visitorview_emp_viewresume') == 1 || WPJOBPORTALincluder::getObjectClass('user')->isjobseeker() ) {
$wpjobportal_resumeid = WPJOBPORTALrequest::getVar('wpjobportalid');
$wpjobportal_socialid = WPJOBPORTALrequest::getVar('jsscid');
//check for the social id
--- a/wp-job-portal/modules/slug/model.php
+++ b/wp-job-portal/modules/slug/model.php
@@ -129,7 +129,7 @@
$wpjobportal_html .= '<div class="popup-field-wrapper">
<div class="popup-field-title">' . esc_html(__('Slug','wp-job-portal')).' '. esc_html(__('Name', 'wp-job-portal')) . ' <span style="color: red;"> *</span></div>
- <div class="popup-field-obj">' . WPJOBPORTALformfield::text('slugedit', isset($wpjobportal_slug) ? wpjobportalphplib::wpJP_trim($wpjobportal_slug) : 'text', '', array('class' => 'inputbox one', 'data-validation' => 'required')) . '</div>
+ <div class="popup-field-obj">' . WPJOBPORTALformfield::text('slugedit', isset($wpjobportal_slug) ? wpjobportalphplib::wpJP_trim($wpjobportal_slug) : 'text', array('class' => 'inputbox one', 'data-validation' => 'required')) . '</div>
</div>';
$wpjobportal_html .='<div class="popup-act-btn-wrp">
' . WPJOBPORTALformfield::button('save', esc_html(__('Save', 'wp-job-portal')), array('class' => 'button savebutton popup-act-btn','onClick'=>'getFieldValue();'));
--- a/wp-job-portal/modules/wpjobportal/model.php
+++ b/wp-job-portal/modules/wpjobportal/model.php
@@ -650,7 +650,7 @@
return array(
'wp-job-portal-elegantdesign' => array('title' => esc_html(__('Elegant Design','wp-job-portal')), 'price' => 0, 'status' => 1),
'wp-job-portal-addressdata' => array('title' => esc_html(__('Address Data','wp-job-portal')), 'price' => 0, 'status' => 1),
- 'wp-job-portal-sociallogin' => array('title' => esc_html(__('Social Login','wp-job-portal')), 'price' => 0, 'status' => 1),
+ //'wp-job-portal-sociallogin' => array('title' => esc_html(__('Social Login','wp-job-portal')), 'price' => 0, 'status' => 1),
'wp-job-portal-visitorapplyjob' => array('title' => esc_html(__('visitor apply job','wp-job-portal')), 'price' => 0, 'status' => 1),
'wp-job-portal-multicompany' => array('title' => esc_html(__('Multi Company','wp-job-portal')), 'price' => 0, 'status' => 1),
'wp-job-portal-featuredcompany' => array('title' => esc_html(__('featured company','wp-job-portal')), 'price' => 0, 'status' => 1),
--- a/wp-job-portal/wp-job-portal.php
+++ b/wp-job-portal/wp-job-portal.php
@@ -3,14 +3,14 @@
/**
* @package WP JOB PORTAL
* @author Ahmad Bilal
- * @version 2.4.4
+ * @version 2.4.5
*/
/*
* Plugin Name: WP Job Portal
* Plugin URI: https://wpjobportal.com/
* Description: WP Job Portal is WordPress’s best job board plugin — easy to use, highly configurable, and built to support both job seekers and employers. AI-powered add-ons offers smart job & resume search, and personalized recommendations.
* Author: WP Job Portal
- * Version: 2.4.4
+ * Version: 2.4.5
* Text Domain: wp-job-portal
* Domain Path: /languages
* Author URI: https://wpjobportal.com/
@@ -80,7 +80,7 @@
self::$_data = array();
self::$_error_flag = null;
self::$_error_flag_message = null;
- self::$_currentversion = '244';
+ self::$_currentversion = '245';
self::$_addon_query = array('select'=>'','join'=>'','where'=>'');
self::$_common = WPJOBPORTALincluder::getJSModel('common');
self::$_config = WPJOBPORTALincluder::getJSModel('configuration');
@@ -190,7 +190,7 @@
if( $plugin == $our_plugin ) {
update_option('wpjp_currentversion', self::$_currentversion);
include_once WPJOBPORTAL_PLUGIN_PATH . 'includes/updates/updates.php';
- WPJOBPORTALupdates::checkUpdates('244');
+ WPJOBPORTALupdates::checkUpdates('245');
// restore colors data
require(WPJOBPORTAL_PLUGIN_PATH . 'includes/css/style_color.php');
@@ -1505,7 +1505,7 @@
update_option('wpjp_currentversion', wpjobportal::$_currentversion);
include_once WPJOBPORTAL_PLUGIN_PATH . 'includes/updates/updates.php';
- WPJOBPORTALupdates::checkUpdates('244');
+ WPJOBPORTALupdates::checkUpdates('245');
// restore colors data