WP Job Manager - Version 1.34.2

Version Description

  • Enhancement: New filter to skip validation for application field.
  • Enhancement: New method for clearing fields.
  • Fix: Improve TwentyTwenty theme compatibility (@JuanchoPestana)
  • Fix: Issue in RSS feed with empty query parameters.
  • Fix: Issue on Jobs page with empty query parameters.
  • Fix: Conflict with search query parameters on Jobs page.
  • Fix: Ensuring hidden jobs do not display in RSS feed.
  • Fix: Image validation when posting a job.
  • Fix: JS error in file upload.
  • Fix: Removed extra whitespace in textarea settings fields.
  • Fix: Several untranslatable strings are now translatable.
  • Fix: CC header in emails.
  • Fix: Search category query sanitization.
  • Fix: Remove PHP notices. (@truongwp)
Download this release

Release Info

Developer alexsanford1
Plugin Icon 128x128 WP Job Manager
Version 1.34.2
Comparing to
See all releases

Code changes from version 1.34.1 to 1.34.2

Files changed (33) hide show
  1. assets/js/ajax-file-upload.min.js +1 -1
  2. changelog.txt +16 -0
  3. includes/abstracts/abstract-wp-job-manager-form.php +7 -0
  4. includes/admin/class-wp-job-manager-cpt.php +1 -1
  5. includes/admin/class-wp-job-manager-settings.php +1 -3
  6. includes/admin/class-wp-job-manager-setup.php +1 -1
  7. includes/admin/views/html-admin-setup-step-3.php +1 -1
  8. includes/class-wp-job-manager-dependency-checker.php +1 -1
  9. includes/class-wp-job-manager-email-notifications.php +6 -3
  10. includes/class-wp-job-manager-geocode.php +1 -1
  11. includes/class-wp-job-manager-post-types.php +25 -4
  12. includes/class-wp-job-manager-shortcodes.php +18 -10
  13. includes/class-wp-job-manager-widget.php +1 -1
  14. includes/forms/class-wp-job-manager-form-submit-job.php +35 -19
  15. includes/helper/views/html-licence-key-error.php +2 -1
  16. includes/helper/views/html-licence-key-notice.php +2 -1
  17. includes/helper/views/html-licences.php +4 -3
  18. languages/wp-job-manager.pot +171 -99
  19. readme.txt +18 -2
  20. templates/account-signin.php +2 -0
  21. templates/emails/admin-new-job.php +2 -0
  22. templates/emails/admin-updated-job.php +2 -0
  23. templates/emails/employer-expiring-job.php +3 -0
  24. templates/emails/plain/admin-expiring-job.php +5 -2
  25. templates/emails/plain/admin-new-job.php +3 -1
  26. templates/emails/plain/admin-updated-job.php +3 -1
  27. templates/emails/plain/employer-expiring-job.php +5 -2
  28. templates/form-fields/wp-editor-field.php +25 -20
  29. templates/job-application-email.php +1 -0
  30. templates/job-submitted.php +3 -1
  31. templates/pagination.php +9 -0
  32. wp-job-manager-functions.php +67 -12
  33. wp-job-manager.php +2 -2
assets/js/ajax-file-upload.min.js CHANGED
@@ -1 +1 @@
1
- jQuery(function(e){e(".wp-job-manager-file-upload").each(function(){e(this).fileupload({dataType:"json",dropZone:e(this),url:job_manager_ajax_file_upload.ajax_url.toString().replace("%%endpoint%%","upload_file"),formData:{script:!0},change:function(){this.validation_errors=[]},add:function(a,i){var t=e(this),r=t.closest("form"),n=t.parent().find(".job-manager-uploaded-files"),o=[],l=!1,s=parseInt(t.data("file_limit"),10);if(void 0!==t.data("file_limit_left")?l=parseInt(t.data("file_limit_left"),10):void 0!==s&&(l=s-parseInt(n.children(".job-manager-uploaded-file").length,10),t.data("file_limit_left",l)),!1!==l&&l<=0){var d="Exceeded upload limit";t.data("file_limit_message")?d=t.data("file_limit_message"):"undefined"!=typeof job_manager_job_submission&&(d=job_manager_job_submission.i18n_over_upload_limit),d=d.replace("%d",s),o.push(d)}var _=e(this).data("file_types");if(_){var p=new RegExp("(.|/)("+_+")$","i");i.originalFiles[0].name.length&&!p.test(i.originalFiles[0].name)&&o.push(job_manager_ajax_file_upload.i18n_invalid_file_type+" "+_)}o.length>0?this.validation_errors=this.validation_errors.concat(o):(!1!==l&&t.data("file_limit_left",l-1),r.find(':input[type="submit"]').attr("disabled","disabled"),i.context=e('<progress value="" max="100"></progress>').appendTo(n),i.submit())},progress:function(e,a){var i=parseInt(a.loaded/a.total*100,10);a.context.val(i)},fail:function(a,i){var t=e(this),r=t.closest("form");i.errorThrown&&window.alert(i.errorThrown),i.context.remove(),r.find(':input[type="submit"]').removeAttr("disabled"),t.trigger("update_status")},done:function(a,i){var t=e(this),r=t.closest("form"),n=t.parent().find(".job-manager-uploaded-files"),o=t.attr("multiple")?1:0,l=["jpg","gif","png","jpeg","jpe"];i.context.remove(),void 0===i.result.success||i.result.success||this.validation_errors.push(i.result.data),e.each(i.result.files,function(a,i){if(i.error)this.validation_errors.push(i.error);else{var r;e.inArray(i.extension,l)>=0?(r=e.parseHTML(job_manager_ajax_file_upload.js_field_html_img),e(r).find(".job-manager-uploaded-file-preview img").attr("src",i.url)):(r=e.parseHTML(job_manager_ajax_file_upload.js_field_html),e(r).find(".job-manager-uploaded-file-name code").text(i.name)),e(r).find(".input-text").val(i.url),e(r).find(".input-text").attr("name","current_"+t.attr("name")),o?n.append(r):n.html(r)}}),this.validation_errors.length>0&&(this.validation_errors=this.validation_errors.filter(function(e,a,i){return i.indexOf(e)===a}),window.alert(this.validation_errors.join("\n"))),r.find(':input[type="submit"]').removeAttr("disabled"),t.trigger("update_status")}})})});
1
+ jQuery(function(e){e(".wp-job-manager-file-upload").each(function(){e(this).fileupload({dataType:"json",dropZone:e(this),url:job_manager_ajax_file_upload.ajax_url.toString().replace("%%endpoint%%","upload_file"),formData:{script:!0},change:function(){this.validation_errors=[]},add:function(a,i){var t=e(this),r=t.closest("form"),n=t.parent().find(".job-manager-uploaded-files"),o=[],l=!1,s=parseInt(t.data("file_limit"),10);if(void 0!==t.data("file_limit_left")?l=parseInt(t.data("file_limit_left"),10):void 0!==s&&(l=s-parseInt(n.children(".job-manager-uploaded-file").length,10),t.data("file_limit_left",l)),!1!==l&&l<=0){var d="Exceeded upload limit";t.data("file_limit_message")?d=t.data("file_limit_message"):"undefined"!=typeof job_manager_job_submission&&(d=job_manager_job_submission.i18n_over_upload_limit),d=d.replace("%d",s),o.push(d)}var _=e(this).data("file_types");if(_){var p=new RegExp("(.|/)("+_+")$","i");i.originalFiles[0].name.length&&!p.test(i.originalFiles[0].name)&&o.push(job_manager_ajax_file_upload.i18n_invalid_file_type+" "+_)}o.length>0?this.validation_errors=this.validation_errors.concat(o):(!1!==l&&t.data("file_limit_left",l-1),r.find(':input[type="submit"]').attr("disabled","disabled"),i.context=e('<progress value="" max="100"></progress>').appendTo(n),i.submit())},progress:function(e,a){var i=parseInt(a.loaded/a.total*100,10);a.context.val(i)},fail:function(a,i){var t=e(this),r=t.closest("form");i.errorThrown&&window.alert(i.errorThrown),i.context.remove(),r.find(':input[type="submit"]').removeAttr("disabled"),t.trigger("update_status")},done:function(a,i){var t=e(this),r=t.closest("form"),n=t.parent().find(".job-manager-uploaded-files"),o=t.attr("multiple")?1:0,l=["jpg","gif","png","jpeg","jpe"];i.context.remove(),void 0===i.result.success||i.result.success||this.validation_errors.push(i.result.data);var s=this;e.each(i.result.files,function(a,i){if(i.error)s.validation_errors.push(i.error);else{var r;e.inArray(i.extension,l)>=0?(r=e.parseHTML(job_manager_ajax_file_upload.js_field_html_img),e(r).find(".job-manager-uploaded-file-preview img").attr("src",i.url)):(r=e.parseHTML(job_manager_ajax_file_upload.js_field_html),e(r).find(".job-manager-uploaded-file-name code").text(i.name)),e(r).find(".input-text").val(i.url),e(r).find(".input-text").attr("name","current_"+t.attr("name")),o?n.append(r):n.html(r)}}),this.validation_errors.length>0&&(this.validation_errors=this.validation_errors.filter(function(e,a,i){return i.indexOf(e)===a}),window.alert(this.validation_errors.join("\n"))),r.find(':input[type="submit"]').removeAttr("disabled"),t.trigger("update_status")}})})});
changelog.txt CHANGED
@@ -1,3 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  = 1.34.1 =
2
  * Templates Updated: `job-submitted.php`, `job-dashboard.php`.
3
  * Enhancement: Email notifications are sent separately if multiple recipients are listed.
1
+ = 1.34.2 =
2
+ * Enhancement: New filter to skip validation for application field.
3
+ * Enhancement: New method for clearing fields.
4
+ * Fix: Improve TwentyTwenty theme compatibility (@JuanchoPestana)
5
+ * Fix: Issue in RSS feed with empty query parameters.
6
+ * Fix: Issue on Jobs page with empty query parameters.
7
+ * Fix: Conflict with search query parameters on Jobs page.
8
+ * Fix: Ensuring hidden jobs do not display in RSS feed.
9
+ * Fix: Image validation when posting a job.
10
+ * Fix: JS error in file upload.
11
+ * Fix: Removed extra whitespace in textarea settings fields.
12
+ * Fix: Several untranslatable strings are now translatable.
13
+ * Fix: CC header in emails.
14
+ * Fix: Search category query sanitization.
15
+ * Fix: Remove PHP notices. (@truongwp)
16
+
17
  = 1.34.1 =
18
  * Templates Updated: `job-submitted.php`, `job-dashboard.php`.
19
  * Enhancement: Email notifications are sent separately if multiple recipients are listed.
includes/abstracts/abstract-wp-job-manager-form.php CHANGED
@@ -298,6 +298,13 @@ abstract class WP_Job_Manager_Form {
298
  $this->fields = [];
299
  }
300
 
 
 
 
 
 
 
 
301
  /**
302
  * Enqueue the scripts for the form.
303
  */
298
  $this->fields = [];
299
  }
300
 
301
+ /**
302
+ * Clears form fields (resets to empty array)
303
+ */
304
+ public function clear_fields() {
305
+ $this->fields = [];
306
+ }
307
+
308
  /**
309
  * Enqueue the scripts for the form.
310
  */
includes/admin/class-wp-job-manager-cpt.php CHANGED
@@ -580,7 +580,7 @@ class WP_Job_Manager_CPT {
580
 
581
  the_company_logo();
582
  echo '</div>';
583
- echo '<button type="button" class="toggle-row"><span class="screen-reader-text">Show more details</span></button>';
584
  break;
585
  case 'job_location':
586
  the_job_location( true, $post );
580
 
581
  the_company_logo();
582
  echo '</div>';
583
+ echo '<button type="button" class="toggle-row"><span class="screen-reader-text">' . esc_html__( 'Show more details', 'wp-job-manager' ) . '</span></button>';
584
  break;
585
  case 'job_location':
586
  the_job_location( true, $post );
includes/admin/class-wp-job-manager-settings.php CHANGED
@@ -558,9 +558,7 @@ class WP_Job_Manager_Settings {
558
  echo implode( ' ', $attributes ) . ' '; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
559
  echo $placeholder; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
560
  ?>
561
- >
562
- <?php echo esc_textarea( $value ); ?>
563
- </textarea>
564
  <?php
565
 
566
  if ( ! empty( $option['desc'] ) ) {
558
  echo implode( ' ', $attributes ) . ' '; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
559
  echo $placeholder; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
560
  ?>
561
+ ><?php echo esc_textarea( $value ); ?></textarea>
 
 
562
  <?php
563
 
564
  if ( ! empty( $option['desc'] ) ) {
includes/admin/class-wp-job-manager-setup.php CHANGED
@@ -123,7 +123,7 @@ class WP_Job_Manager_Setup {
123
  ! isset( $_REQUEST['setup_wizard'] )
124
  || false === wp_verify_nonce( wp_unslash( $_REQUEST['setup_wizard'] ), 'step_3' ) // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Nonce should not be modified.
125
  ) {
126
- wp_die( 'Error in nonce. Try again.', 'wp-job-manager' );
127
  }
128
  $create_pages = isset( $_POST['wp-job-manager-create-page'] ) ? array_map( 'sanitize_text_field', wp_unslash( $_POST['wp-job-manager-create-page'] ) ) : [];
129
  $page_titles = isset( $_POST['wp-job-manager-page-title'] ) ? array_map( 'sanitize_text_field', wp_unslash( $_POST['wp-job-manager-page-title'] ) ) : [];
123
  ! isset( $_REQUEST['setup_wizard'] )
124
  || false === wp_verify_nonce( wp_unslash( $_REQUEST['setup_wizard'] ), 'step_3' ) // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Nonce should not be modified.
125
  ) {
126
+ wp_die( esc_html__( 'Error in nonce. Try again.', 'wp-job-manager' ), 'wp-job-manager' );
127
  }
128
  $create_pages = isset( $_POST['wp-job-manager-create-page'] ) ? array_map( 'sanitize_text_field', wp_unslash( $_POST['wp-job-manager-create-page'] ) ) : [];
129
  $page_titles = isset( $_POST['wp-job-manager-page-title'] ) ? array_map( 'sanitize_text_field', wp_unslash( $_POST['wp-job-manager-page-title'] ) ) : [];
includes/admin/views/html-admin-setup-step-3.php CHANGED
@@ -68,7 +68,7 @@ if ( ! defined( 'ABSPATH' ) ) {
68
  <ul>
69
  <li class="icon-review"><a href="https://wordpress.org/support/view/plugin-reviews/wp-job-manager#postform"><?php esc_html_e( 'Leave a positive review', 'wp-job-manager' ); ?></a></li>
70
  <li class="icon-localization"><a href="https://translate.wordpress.org/projects/wp-plugins/wp-job-manager"><?php esc_html_e( 'Contribute a localization', 'wp-job-manager' ); ?></a></li>
71
- <li class="icon-code"><a href="https://github.com/mikejolley/WP-Job-Manager"><?php esc_html_e( 'Contribute code or report a bug', 'wp-job-manager' ); ?></a></li>
72
  <li class="icon-forum"><a href="https://wordpress.org/support/plugin/wp-job-manager"><?php esc_html_e( 'Help other users on the forums', 'wp-job-manager' ); ?></a></li>
73
  </ul>
74
  </div>
68
  <ul>
69
  <li class="icon-review"><a href="https://wordpress.org/support/view/plugin-reviews/wp-job-manager#postform"><?php esc_html_e( 'Leave a positive review', 'wp-job-manager' ); ?></a></li>
70
  <li class="icon-localization"><a href="https://translate.wordpress.org/projects/wp-plugins/wp-job-manager"><?php esc_html_e( 'Contribute a localization', 'wp-job-manager' ); ?></a></li>
71
+ <li class="icon-code"><a href="https://github.com/Automattic/WP-Job-Manager/"><?php esc_html_e( 'Contribute code or report a bug', 'wp-job-manager' ); ?></a></li>
72
  <li class="icon-forum"><a href="https://wordpress.org/support/plugin/wp-job-manager"><?php esc_html_e( 'Help other users on the forums', 'wp-job-manager' ); ?></a></li>
73
  </ul>
74
  </div>
includes/class-wp-job-manager-dependency-checker.php CHANGED
@@ -115,7 +115,7 @@ class WP_Job_Manager_Dependency_Checker {
115
  $update_action_link = '';
116
  if ( current_user_can( 'update_core' ) ) {
117
  // translators: %s is the URL for the page where users can go to update WordPress.
118
- $update_action_link = ' ' . sprintf( 'Please <a href="%s">update WordPress</a> to avoid issues.', esc_url( self_admin_url( 'update-core.php' ) ) );
119
  }
120
 
121
  echo '<div class="error">';
115
  $update_action_link = '';
116
  if ( current_user_can( 'update_core' ) ) {
117
  // translators: %s is the URL for the page where users can go to update WordPress.
118
+ $update_action_link = ' ' . sprintf( __( 'Please <a href="%s">update WordPress</a> to avoid issues.', 'wp-job-manager' ), esc_url( self_admin_url( 'update-core.php' ) ) );
119
  }
120
 
121
  echo '<div class="error">';
includes/class-wp-job-manager-email-notifications.php CHANGED
@@ -770,7 +770,7 @@ final class WP_Job_Manager_Email_Notifications {
770
  }
771
 
772
  $args['headers'] = is_array( $args['headers'] ) ? $args['headers'] : [];
773
- $send_to = $args['to'];
774
  if ( ! is_array( $send_to ) ) {
775
  $send_to = array_filter( array_map( 'sanitize_email', preg_split( '/[,|;]\s?/', $send_to ) ) );
776
  }
@@ -790,11 +790,15 @@ final class WP_Job_Manager_Email_Notifications {
790
  */
791
  $args = apply_filters( "job_manager_email_{$email_notification_key}_args", $args, $email );
792
 
793
- $headers = $args['headers'];
794
  if ( ! empty( $args['from'] ) ) {
795
  $headers[] = 'From: ' . $args['from'];
796
  }
797
 
 
 
 
 
798
  if ( ! self::send_as_plain_text( $email_notification_key, $args ) ) {
799
  $headers[] = 'Content-Type: text/html';
800
  }
@@ -809,7 +813,6 @@ final class WP_Job_Manager_Email_Notifications {
809
  * @param array $args Email arguments for generating email.
810
  * @param string $content Email content.
811
  * @param array $headers Email headers.
812
- * @param
813
  */
814
  if ( ! apply_filters( 'job_manager_email_do_send_notification', true, $email, $args, $content, $headers ) ) {
815
  continue;
770
  }
771
 
772
  $args['headers'] = is_array( $args['headers'] ) ? $args['headers'] : [];
773
+ $send_to = $args['to'];
774
  if ( ! is_array( $send_to ) ) {
775
  $send_to = array_filter( array_map( 'sanitize_email', preg_split( '/[,|;]\s?/', $send_to ) ) );
776
  }
790
  */
791
  $args = apply_filters( "job_manager_email_{$email_notification_key}_args", $args, $email );
792
 
793
+ $headers = $args['headers'];
794
  if ( ! empty( $args['from'] ) ) {
795
  $headers[] = 'From: ' . $args['from'];
796
  }
797
 
798
+ if ( ! empty( $args['cc'] ) ) {
799
+ $headers[] = 'CC: ' . $args['cc'];
800
+ }
801
+
802
  if ( ! self::send_as_plain_text( $email_notification_key, $args ) ) {
803
  $headers[] = 'Content-Type: text/html';
804
  }
813
  * @param array $args Email arguments for generating email.
814
  * @param string $content Email content.
815
  * @param array $headers Email headers.
 
816
  */
817
  if ( ! apply_filters( 'job_manager_email_do_send_notification', true, $email, $args, $content, $headers ) ) {
818
  continue;
includes/class-wp-job-manager-geocode.php CHANGED
@@ -229,7 +229,7 @@ class WP_Job_Manager_Geocode {
229
  $result = wp_remote_retrieve_body( $result );
230
  $geocoded_address = json_decode( $result );
231
 
232
- if ( $geocoded_address->status ) {
233
  if ( 'ZERO_RESULTS' === $geocoded_address->status ) {
234
  throw new Exception( __( 'No results found', 'wp-job-manager' ) );
235
  } elseif ( 'OVER_QUERY_LIMIT' === $geocoded_address->status ) {
229
  $result = wp_remote_retrieve_body( $result );
230
  $geocoded_address = json_decode( $result );
231
 
232
+ if ( isset( $geocoded_address->status ) ) {
233
  if ( 'ZERO_RESULTS' === $geocoded_address->status ) {
234
  throw new Exception( __( 'No results found', 'wp-job-manager' ) );
235
  } elseif ( 'OVER_QUERY_LIMIT' === $geocoded_address->status ) {
includes/class-wp-job-manager-post-types.php CHANGED
@@ -549,9 +549,22 @@ class WP_Job_Manager_Post_Types {
549
  // phpcs:disable WordPress.Security.NonceVerification.Recommended -- Input used to filter public data in feed.
550
  $input_posts_per_page = isset( $_GET['posts_per_page'] ) ? absint( $_GET['posts_per_page'] ) : 10;
551
  $input_search_location = isset( $_GET['search_location'] ) ? sanitize_text_field( wp_unslash( $_GET['search_location'] ) ) : false;
552
- $input_job_types = isset( $_GET['job_types'] ) ? explode( ',', sanitize_text_field( wp_unslash( $_GET['job_types'] ) ) ) : false;
553
- $input_job_categories = isset( $_GET['job_categories'] ) ? explode( ',', sanitize_text_field( wp_unslash( $_GET['job_categories'] ) ) ) : false;
554
- $job_manager_keyword = isset( $_GET['search_keywords'] ) ? sanitize_text_field( wp_unslash( $_GET['search_keywords'] ) ) : '';
 
 
 
 
 
 
 
 
 
 
 
 
 
555
  // phpcs:enable WordPress.Security.NonceVerification.Recommended
556
 
557
  $query_args = [
@@ -577,6 +590,14 @@ class WP_Job_Manager_Post_Types {
577
  $query_args['meta_query'][] = $location_search;
578
  }
579
 
 
 
 
 
 
 
 
 
580
  if ( ! empty( $input_job_types ) ) {
581
  $query_args['tax_query'][] = [
582
  'taxonomy' => 'job_listing_type',
@@ -873,7 +894,7 @@ class WP_Job_Manager_Post_Types {
873
  *
874
  * @since 1.34.1
875
  *
876
- * @param int $job_id Job ID to check.
877
  * @return bool
878
  */
879
  public static function job_is_editable( $job_id ) {
549
  // phpcs:disable WordPress.Security.NonceVerification.Recommended -- Input used to filter public data in feed.
550
  $input_posts_per_page = isset( $_GET['posts_per_page'] ) ? absint( $_GET['posts_per_page'] ) : 10;
551
  $input_search_location = isset( $_GET['search_location'] ) ? sanitize_text_field( wp_unslash( $_GET['search_location'] ) ) : false;
552
+
553
+ if ( isset( $_GET['job_types'] ) ) {
554
+ $sanitized_job_types = sanitize_text_field( wp_unslash( $_GET['job_types'] ) );
555
+ $input_job_types = empty( $sanitized_job_types ) ? false : explode( ',', $sanitized_job_types );
556
+ } else {
557
+ $input_job_types = false;
558
+ }
559
+
560
+ if ( isset( $_GET['job_categories'] ) ) {
561
+ $sanitized_job_categories = sanitize_text_field( wp_unslash( $_GET['job_categories'] ) );
562
+ $input_job_categories = empty( $sanitized_job_categories ) ? false : explode( ',', $sanitized_job_categories );
563
+ } else {
564
+ $input_job_categories = false;
565
+ }
566
+
567
+ $job_manager_keyword = isset( $_GET['search_keywords'] ) ? sanitize_text_field( wp_unslash( $_GET['search_keywords'] ) ) : '';
568
  // phpcs:enable WordPress.Security.NonceVerification.Recommended
569
 
570
  $query_args = [
590
  $query_args['meta_query'][] = $location_search;
591
  }
592
 
593
+ // Hide filled positions from the job feed.
594
+ if ( 1 === absint( get_option( 'job_manager_hide_filled_positions' ) ) ) {
595
+ $query_args['meta_query'][] = [
596
+ 'key' => '_filled',
597
+ 'value' => '0',
598
+ ];
599
+ }
600
+
601
  if ( ! empty( $input_job_types ) ) {
602
  $query_args['tax_query'][] = [
603
  'taxonomy' => 'job_listing_type',
894
  *
895
  * @since 1.34.1
896
  *
897
+ * @param int $job_id Job ID to check.
898
  * @return bool
899
  */
900
  public static function job_is_editable( $job_id ) {
includes/class-wp-job-manager-shortcodes.php CHANGED
@@ -342,19 +342,26 @@ class WP_Job_Manager_Shortcodes {
342
  $atts['filled'] = ( is_bool( $atts['filled'] ) && $atts['filled'] ) || in_array( $atts['filled'], [ 1, '1', 'true', 'yes' ], true );
343
  }
344
 
 
 
 
345
  // Get keywords, location, category and type from querystring if set.
346
  // phpcs:disable WordPress.Security.NonceVerification.Recommended -- Input is used safely.
347
  if ( ! empty( $_GET['search_keywords'] ) ) {
348
- $atts['keywords'] = sanitize_text_field( wp_unslash( $_GET['search_keywords'] ) );
 
349
  }
350
  if ( ! empty( $_GET['search_location'] ) ) {
351
- $atts['location'] = sanitize_text_field( wp_unslash( $_GET['search_location'] ) );
 
352
  }
353
  if ( ! empty( $_GET['search_category'] ) ) {
354
  $atts['selected_category'] = sanitize_text_field( wp_unslash( $_GET['search_category'] ) );
 
355
  }
356
  if ( ! empty( $_GET['search_job_type'] ) ) {
357
  $atts['selected_job_types'] = sanitize_text_field( wp_unslash( $_GET['search_job_type'] ) );
 
358
  }
359
  // phpcs:enable WordPress.Security.NonceVerification.Recommended
360
 
@@ -379,14 +386,15 @@ class WP_Job_Manager_Shortcodes {
379
  }
380
 
381
  $data_attributes = [
382
- 'location' => $atts['location'],
383
- 'keywords' => $atts['keywords'],
384
- 'show_filters' => $atts['show_filters'] ? 'true' : 'false',
385
- 'show_pagination' => $atts['show_pagination'] ? 'true' : 'false',
386
- 'per_page' => $atts['per_page'],
387
- 'orderby' => $atts['orderby'],
388
- 'order' => $atts['order'],
389
- 'categories' => implode( ',', $atts['categories'] ),
 
390
  ];
391
 
392
  if ( $atts['show_filters'] ) {
342
  $atts['filled'] = ( is_bool( $atts['filled'] ) && $atts['filled'] ) || in_array( $atts['filled'], [ 1, '1', 'true', 'yes' ], true );
343
  }
344
 
345
+ // By default, use client-side state to populate form fields.
346
+ $disable_client_state = false;
347
+
348
  // Get keywords, location, category and type from querystring if set.
349
  // phpcs:disable WordPress.Security.NonceVerification.Recommended -- Input is used safely.
350
  if ( ! empty( $_GET['search_keywords'] ) ) {
351
+ $atts['keywords'] = sanitize_text_field( wp_unslash( $_GET['search_keywords'] ) );
352
+ $disable_client_state = true;
353
  }
354
  if ( ! empty( $_GET['search_location'] ) ) {
355
+ $atts['location'] = sanitize_text_field( wp_unslash( $_GET['search_location'] ) );
356
+ $disable_client_state = true;
357
  }
358
  if ( ! empty( $_GET['search_category'] ) ) {
359
  $atts['selected_category'] = sanitize_text_field( wp_unslash( $_GET['search_category'] ) );
360
+ $disable_client_state = true;
361
  }
362
  if ( ! empty( $_GET['search_job_type'] ) ) {
363
  $atts['selected_job_types'] = sanitize_text_field( wp_unslash( $_GET['search_job_type'] ) );
364
+ $disable_client_state = true;
365
  }
366
  // phpcs:enable WordPress.Security.NonceVerification.Recommended
367
 
386
  }
387
 
388
  $data_attributes = [
389
+ 'location' => $atts['location'],
390
+ 'keywords' => $atts['keywords'],
391
+ 'show_filters' => $atts['show_filters'] ? 'true' : 'false',
392
+ 'show_pagination' => $atts['show_pagination'] ? 'true' : 'false',
393
+ 'per_page' => $atts['per_page'],
394
+ 'orderby' => $atts['orderby'],
395
+ 'order' => $atts['order'],
396
+ 'categories' => implode( ',', $atts['categories'] ),
397
+ 'disable-form-state-storage' => $disable_client_state,
398
  ];
399
 
400
  if ( $atts['show_filters'] ) {
includes/class-wp-job-manager-widget.php CHANGED
@@ -130,7 +130,7 @@ class WP_Job_Manager_Widget extends WP_Widget {
130
  }
131
 
132
  foreach ( $this->settings as $key => $setting ) {
133
- $instance[ $key ] = sanitize_text_field( $new_instance[ $key ] );
134
  }
135
 
136
  $this->flush_widget_cache();
130
  }
131
 
132
  foreach ( $this->settings as $key => $setting ) {
133
+ $instance[ $key ] = isset( $new_instance[ $key ] ) ? sanitize_text_field( $new_instance[ $key ] ) : '';
134
  }
135
 
136
  $this->flush_widget_cache();
includes/forms/class-wp-job-manager-form-submit-job.php CHANGED
@@ -328,6 +328,22 @@ class WP_Job_Manager_Form_Submit_Job extends WP_Job_Manager_Form {
328
  return 1 === absint( get_option( 'job_manager_enable_recaptcha_job_submission' ) );
329
  }
330
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
331
  /**
332
  * Validates the posted fields.
333
  *
@@ -363,6 +379,24 @@ class WP_Job_Manager_Form_Submit_Job extends WP_Job_Manager_Form {
363
  }
364
  if ( ! empty( $check_value ) ) {
365
  foreach ( $check_value as $file_url ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
366
  if ( is_numeric( $file_url ) ) {
367
  continue;
368
  }
@@ -373,24 +407,6 @@ class WP_Job_Manager_Form_Submit_Job extends WP_Job_Manager_Form {
373
  }
374
  }
375
  }
376
- if ( 'file' === $field['type'] && ! empty( $field['allowed_mime_types'] ) ) {
377
- if ( is_array( $values[ $group_key ][ $key ] ) ) {
378
- $check_value = array_filter( $values[ $group_key ][ $key ] );
379
- } else {
380
- $check_value = array_filter( [ $values[ $group_key ][ $key ] ] );
381
- }
382
- if ( ! empty( $check_value ) ) {
383
- foreach ( $check_value as $file_url ) {
384
- $file_url = current( explode( '?', $file_url ) );
385
- $file_info = wp_check_filetype( $file_url );
386
-
387
- if ( ! is_numeric( $file_url ) && $file_info && ! in_array( $file_info['type'], $field['allowed_mime_types'], true ) ) {
388
- // translators: Placeholder %1$s is field label; %2$s is the file mime type; %3$s is the allowed mime-types.
389
- throw new Exception( sprintf( __( '"%1$s" (filetype %2$s) needs to be one of the following file types: %3$s', 'wp-job-manager' ), $field['label'], $file_info['ext'], implode( ', ', array_keys( $field['allowed_mime_types'] ) ) ) );
390
- }
391
- }
392
- }
393
- }
394
  if ( empty( $field['file_limit'] ) && empty( $field['multiple'] ) ) {
395
  $field['file_limit'] = 1;
396
  }
@@ -415,7 +431,7 @@ class WP_Job_Manager_Form_Submit_Job extends WP_Job_Manager_Form {
415
  }
416
 
417
  // Application method.
418
- if ( isset( $values['job']['application'] ) && ! empty( $values['job']['application'] ) ) {
419
  $allowed_application_method = get_option( 'job_manager_allowed_application_method', '' );
420
  $values['job']['application'] = str_replace( ' ', '+', $values['job']['application'] );
421
  switch ( $allowed_application_method ) {
328
  return 1 === absint( get_option( 'job_manager_enable_recaptcha_job_submission' ) );
329
  }
330
 
331
+ /**
332
+ * Checks if application field should use skip email / URL validation.
333
+ *
334
+ * @return bool
335
+ */
336
+ protected function should_application_field_skip_email_url_validation() {
337
+ /**
338
+ * Force application field to skip email / URL validation.
339
+ *
340
+ * @since 1.x.x
341
+ *
342
+ * @param bool $is_forced Whether the application field is forced to skip email / URL validation.
343
+ */
344
+ return apply_filters( 'job_manager_application_field_skip_email_url_validation', false );
345
+ }
346
+
347
  /**
348
  * Validates the posted fields.
349
  *
379
  }
380
  if ( ! empty( $check_value ) ) {
381
  foreach ( $check_value as $file_url ) {
382
+ // Check image path.
383
+ $baseurl = wp_upload_dir()['baseurl'];
384
+ if ( ! is_numeric( $file_url ) && 0 !== strpos( $file_url, $baseurl ) ) {
385
+ throw new Exception( __( 'Invalid image path.', 'wp-job-manager' ) );
386
+ }
387
+
388
+ // Check mime types.
389
+ if ( ! empty( $field['allowed_mime_types'] ) ) {
390
+ $file_url = current( explode( '?', $file_url ) );
391
+ $file_info = wp_check_filetype( $file_url );
392
+
393
+ if ( ! is_numeric( $file_url ) && $file_info && ! in_array( $file_info['type'], $field['allowed_mime_types'], true ) ) {
394
+ // translators: Placeholder %1$s is field label; %2$s is the file mime type; %3$s is the allowed mime-types.
395
+ throw new Exception( sprintf( __( '"%1$s" (filetype %2$s) needs to be one of the following file types: %3$s', 'wp-job-manager' ), $field['label'], $file_info['ext'], implode( ', ', array_keys( $field['allowed_mime_types'] ) ) ) );
396
+ }
397
+ }
398
+
399
+ // Check if attachment is valid.
400
  if ( is_numeric( $file_url ) ) {
401
  continue;
402
  }
407
  }
408
  }
409
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
410
  if ( empty( $field['file_limit'] ) && empty( $field['multiple'] ) ) {
411
  $field['file_limit'] = 1;
412
  }
431
  }
432
 
433
  // Application method.
434
+ if ( ! $this->should_application_field_skip_email_url_validation() && isset( $values['job']['application'] ) && ! empty( $values['job']['application'] ) ) {
435
  $allowed_application_method = get_option( 'job_manager_allowed_application_method', '' );
436
  $values['job']['application'] = str_replace( ' ', '+', $values['job']['application'] );
437
  switch ( $allowed_application_method ) {
includes/helper/views/html-licence-key-error.php CHANGED
@@ -11,5 +11,6 @@ if ( ! defined( 'ABSPATH' ) ) {
11
  ?>
12
  <div class="error">
13
  <p class="wpjm-updater-dismiss" style="float:right;"><a href="<?php echo esc_url( wp_nonce_url( add_query_arg( 'dismiss-wpjm-licence-notice', $product_slug ), 'dismiss-wpjm-licence-notice', '_wpjm_nonce' ) ); ?>"><?php esc_html_e( 'Hide notice', 'wp-job-manager' ); ?></a></p>
14
- <p><?php printf( 'There is a problem with the license for "%s". Please <a href="%s">manage the license</a> to check for a solution and continue receiving updates.', esc_html( $plugin_data['Name'] ), esc_url( admin_url( 'edit.php?post_type=job_listing&page=job-manager-addons&section=helper#' . sanitize_title( $product_slug . '_row' ) ) ) ); ?></p>
 
15
  </div>
11
  ?>
12
  <div class="error">
13
  <p class="wpjm-updater-dismiss" style="float:right;"><a href="<?php echo esc_url( wp_nonce_url( add_query_arg( 'dismiss-wpjm-licence-notice', $product_slug ), 'dismiss-wpjm-licence-notice', '_wpjm_nonce' ) ); ?>"><?php esc_html_e( 'Hide notice', 'wp-job-manager' ); ?></a></p>
14
+ <?php // translators: %1$s is the plugin name, %2$s is the license setting page URL. ?>
15
+ <p><?php printf( wp_kses_post( __( 'There is a problem with the license for "%1$s". Please <a href="%2$s">manage the license</a> to check for a solution and continue receiving updates.', 'wp-job-manager' ) ), esc_html( $plugin_data['Name'] ), esc_url( admin_url( 'edit.php?post_type=job_listing&page=job-manager-addons&section=helper#' . sanitize_title( $product_slug . '_row' ) ) ) ); ?></p>
16
  </div>
includes/helper/views/html-licence-key-notice.php CHANGED
@@ -11,5 +11,6 @@ if ( ! defined( 'ABSPATH' ) ) {
11
  ?>
12
  <div class="updated">
13
  <p class="wpjm-updater-dismiss" style="float:right;"><a href="<?php echo esc_url( wp_nonce_url( add_query_arg( 'dismiss-wpjm-licence-notice', $product_slug ), 'dismiss-wpjm-licence-notice', '_wpjm_nonce' ) ); ?>"><?php esc_html_e( 'Hide notice', 'wp-job-manager' ); ?></a></p>
14
- <p><?php printf( '<a href="%s">Please enter your license key</a> to get updates for "%s".', esc_url( admin_url( 'edit.php?post_type=job_listing&page=job-manager-addons&section=helper#' . sanitize_title( $product_slug . '_row' ) ) ), esc_html( $plugin_data['Name'] ) ); ?></p>
 
15
  </div>
11
  ?>
12
  <div class="updated">
13
  <p class="wpjm-updater-dismiss" style="float:right;"><a href="<?php echo esc_url( wp_nonce_url( add_query_arg( 'dismiss-wpjm-licence-notice', $product_slug ), 'dismiss-wpjm-licence-notice', '_wpjm_nonce' ) ); ?>"><?php esc_html_e( 'Hide notice', 'wp-job-manager' ); ?></a></p>
14
+ <?php // translators: %1$s is the license setting page URL, %2$s is the plugin name. ?>
15
+ <p><?php printf( wp_kses_post( __( '<a href="%1$s">Please enter your license key</a> to get updates for "%2$s".', 'wp-job-manager' ) ), esc_url( admin_url( 'edit.php?post_type=job_listing&page=job-manager-addons&section=helper#' . sanitize_title( $product_slug . '_row' ) ) ), esc_html( $plugin_data['Name'] ) ); ?></p>
16
  </div>
includes/helper/views/html-licences.php CHANGED
@@ -57,7 +57,7 @@ if ( ! defined( 'ABSPATH' ) ) {
57
  <input type="text" disabled="disabled" id="<?php echo esc_attr( sanitize_title( $product_slug ) ); ?>_licence_key" name="licence_key" placeholder="XXXX-XXXX-XXXX-XXXX" value="<?php echo esc_attr( $licence['licence_key'] ); ?>"/>
58
  </label>
59
  <label for="<?php echo esc_attr( sanitize_title( $product_slug ) ); ?>_email"><?php esc_html_e( 'Email', 'wp-job-manager' ); ?>:
60
- <input type="email" disabled="disabled" id="<?php echo esc_attr( sanitize_title( $product_slug ) ); ?>_email" name="email" placeholder="Email address" value="<?php echo esc_attr( $licence['email'] ); ?>"/>
61
  </label>
62
 
63
  <input type="submit" class="button" name="submit" value="<?php esc_attr_e( 'Deactivate License', 'wp-job-manager' ); ?>" />
@@ -70,7 +70,7 @@ if ( ! defined( 'ABSPATH' ) ) {
70
  <input type="text" id="<?php echo esc_attr( sanitize_title( $product_slug ) ); ?>_licence_key" name="licence_key" placeholder="XXXX-XXXX-XXXX-XXXX"/>
71
  </label>
72
  <label for="<?php echo esc_attr( sanitize_title( $product_slug ) ); ?>_email"><?php esc_html_e( 'Email', 'wp-job-manager' ); ?>:
73
- <input type="email" id="<?php echo esc_attr( sanitize_title( $product_slug ) ); ?>_email" name="email" placeholder="Email address" value="<?php echo esc_attr( get_option( 'admin_email' ) ); ?>"/>
74
  </label>
75
  <input type="submit" class="button" name="submit" value="<?php esc_attr_e( 'Activate License', 'wp-job-manager' ); ?>" />
76
  <?php
@@ -80,7 +80,8 @@ if ( ! defined( 'ABSPATH' ) ) {
80
  </div>
81
  </div>
82
  <?php endforeach; ?>
83
- <div class="notice notice-info inline"><p><?php printf( 'Lost your license key? <a href="%s">Retrieve it here</a>.', 'https://wpjobmanager.com/lost-licence-key/' ); ?></p></div>
 
84
  <?php else : ?>
85
  <div class="notice notice-warning inline"><p><?php esc_html_e( 'No plugins are activated that have licenses managed by WP Job Manager.', 'wp-job-manager' ); ?></p></div>
86
  <?php endif; ?>
57
  <input type="text" disabled="disabled" id="<?php echo esc_attr( sanitize_title( $product_slug ) ); ?>_licence_key" name="licence_key" placeholder="XXXX-XXXX-XXXX-XXXX" value="<?php echo esc_attr( $licence['licence_key'] ); ?>"/>
58
  </label>
59
  <label for="<?php echo esc_attr( sanitize_title( $product_slug ) ); ?>_email"><?php esc_html_e( 'Email', 'wp-job-manager' ); ?>:
60
+ <input type="email" disabled="disabled" id="<?php echo esc_attr( sanitize_title( $product_slug ) ); ?>_email" name="email" placeholder="<?php esc_attr_e( 'Email address', 'wp-job-manager' ); ?>" value="<?php echo esc_attr( $licence['email'] ); ?>"/>
61
  </label>
62
 
63
  <input type="submit" class="button" name="submit" value="<?php esc_attr_e( 'Deactivate License', 'wp-job-manager' ); ?>" />
70
  <input type="text" id="<?php echo esc_attr( sanitize_title( $product_slug ) ); ?>_licence_key" name="licence_key" placeholder="XXXX-XXXX-XXXX-XXXX"/>
71
  </label>
72
  <label for="<?php echo esc_attr( sanitize_title( $product_slug ) ); ?>_email"><?php esc_html_e( 'Email', 'wp-job-manager' ); ?>:
73
+ <input type="email" id="<?php echo esc_attr( sanitize_title( $product_slug ) ); ?>_email" name="email" placeholder="<?php esc_attr_e( 'Email address', 'wp-job-manager' ); ?>" value="<?php echo esc_attr( get_option( 'admin_email' ) ); ?>"/>
74
  </label>
75
  <input type="submit" class="button" name="submit" value="<?php esc_attr_e( 'Activate License', 'wp-job-manager' ); ?>" />
76
  <?php
80
  </div>
81
  </div>
82
  <?php endforeach; ?>
83
+ <?php // translators: Placeholder %s is the lost license key URL. ?>
84
+ <div class="notice notice-info inline"><p><?php printf( wp_kses_post( __( 'Lost your license key? <a href="%s">Retrieve it here</a>.', 'wp-job-manager' ) ), 'https://wpjobmanager.com/lost-licence-key/' ); ?></p></div>
85
  <?php else : ?>
86
  <div class="notice notice-warning inline"><p><?php esc_html_e( 'No plugins are activated that have licenses managed by WP Job Manager.', 'wp-job-manager' ); ?></p></div>
87
  <?php endif; ?>
languages/wp-job-manager.pot CHANGED
@@ -1,14 +1,14 @@
1
- # Copyright (C) 2019 Automattic
2
  # This file is distributed under the GPL2+.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: WP Job Manager 1.34.1\n"
6
  "Report-Msgid-Bugs-To: https://github.com/Automattic/WP-Job-Manager/issues\n"
7
- "POT-Creation-Date: 2019-10-30 18:24:14+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=utf-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
11
- "PO-Revision-Date: 2019-MO-DA HO:MI+ZONE\n"
12
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13
  "Language-Team: LANGUAGE <EMAIL@ADDRESS>\n"
14
  "X-Generator: grunt-wp-i18n 1.0.3\n"
@@ -23,8 +23,8 @@ msgstr ""
23
  msgid "<a href=\"%s\">Switch to primary language</a> to edit this setting."
24
  msgstr ""
25
 
26
- #: includes/abstracts/abstract-wp-job-manager-form.php:371
27
- #: includes/abstracts/abstract-wp-job-manager-form.php:387
28
  #. translators: Placeholder is for the label of the reCAPTCHA field.
29
  #. translators: %s is the name of the form validation that failed.
30
  msgid "\"%s\" check failed. Please try again."
@@ -201,7 +201,7 @@ msgstr ""
201
 
202
  #: includes/admin/class-wp-job-manager-cpt.php:497
203
  #: includes/class-wp-job-manager-email-notifications.php:270
204
- #: includes/class-wp-job-manager-post-types.php:1254
205
  #: includes/forms/class-wp-job-manager-form-submit-job.php:213
206
  #: includes/widgets/class-wp-job-manager-widget-recent-jobs.php:46
207
  #: templates/job-filters.php:35 templates/job-filters.php:36
@@ -243,6 +243,10 @@ msgstr ""
243
  msgid "ID: %d"
244
  msgstr ""
245
 
 
 
 
 
246
  #: includes/admin/class-wp-job-manager-cpt.php:613
247
  #. translators: %s placeholder is the username of the user.
248
  msgid "by a guest"
@@ -712,11 +716,11 @@ msgstr ""
712
  msgid "Save Changes"
713
  msgstr ""
714
 
715
- #: includes/admin/class-wp-job-manager-settings.php:643
716
  msgid "--no page--"
717
  msgstr ""
718
 
719
- #: includes/admin/class-wp-job-manager-settings.php:649
720
  msgid "Select a page&hellip;"
721
  msgstr ""
722
 
@@ -724,6 +728,10 @@ msgstr ""
724
  msgid "Setup"
725
  msgstr ""
726
 
 
 
 
 
727
  #: includes/admin/class-wp-job-manager-taxonomy-meta.php:87
728
  #: includes/admin/class-wp-job-manager-taxonomy-meta.php:110
729
  #: includes/admin/class-wp-job-manager-taxonomy-meta.php:129
@@ -1012,27 +1020,27 @@ msgid "Company Logo"
1012
  msgstr ""
1013
 
1014
  #: includes/class-wp-job-manager-data-exporter.php:52
1015
- #: includes/class-wp-job-manager-post-types.php:1273
1016
  msgid "Company Name"
1017
  msgstr ""
1018
 
1019
  #: includes/class-wp-job-manager-data-exporter.php:53
1020
- #: includes/class-wp-job-manager-post-types.php:1281
1021
  msgid "Company Website"
1022
  msgstr ""
1023
 
1024
  #: includes/class-wp-job-manager-data-exporter.php:54
1025
- #: includes/class-wp-job-manager-post-types.php:1290
1026
  msgid "Company Tagline"
1027
  msgstr ""
1028
 
1029
  #: includes/class-wp-job-manager-data-exporter.php:55
1030
- #: includes/class-wp-job-manager-post-types.php:1298
1031
  msgid "Company Twitter"
1032
  msgstr ""
1033
 
1034
  #: includes/class-wp-job-manager-data-exporter.php:56
1035
- #: includes/class-wp-job-manager-post-types.php:1306
1036
  msgid "Company Video"
1037
  msgstr ""
1038
 
@@ -1057,9 +1065,13 @@ msgstr ""
1057
  msgid "(opens in a new tab)"
1058
  msgstr ""
1059
 
1060
- #: includes/class-wp-job-manager-dependency-checker.php:122
1061
  #. translators: %s is the URL for the page where users can go to update
1062
  #. WordPress.
 
 
 
 
1063
  msgid "<strong>WP Job Manager</strong> requires a more recent version of WordPress."
1064
  msgstr ""
1065
 
@@ -1301,78 +1313,78 @@ msgid_plural "Preview <span class=\"count\">(%s)</span>"
1301
  msgstr[0] ""
1302
  msgstr[1] ""
1303
 
1304
- #: includes/class-wp-job-manager-post-types.php:1241
1305
  #: includes/forms/class-wp-job-manager-form-submit-job.php:190
1306
  msgid "Application email/URL"
1307
  msgstr ""
1308
 
1309
- #: includes/class-wp-job-manager-post-types.php:1242
1310
  #: includes/forms/class-wp-job-manager-form-submit-job.php:191
1311
  msgid "Enter an email address or website URL"
1312
  msgstr ""
1313
 
1314
- #: includes/class-wp-job-manager-post-types.php:1245
1315
  #: includes/forms/class-wp-job-manager-form-submit-job.php:180
1316
  msgid "Application email"
1317
  msgstr ""
1318
 
1319
- #: includes/class-wp-job-manager-post-types.php:1246
1320
  #: includes/forms/class-wp-job-manager-form-submit-job.php:181
1321
  msgid "you@example.com"
1322
  msgstr ""
1323
 
1324
- #: includes/class-wp-job-manager-post-types.php:1248
1325
  #: includes/forms/class-wp-job-manager-form-submit-job.php:185
1326
  msgid "Application URL"
1327
  msgstr ""
1328
 
1329
- #: includes/class-wp-job-manager-post-types.php:1249
1330
  #: includes/forms/class-wp-job-manager-form-submit-job.php:186
1331
  msgid "https://"
1332
  msgstr ""
1333
 
1334
- #: includes/class-wp-job-manager-post-types.php:1255
1335
  #: includes/forms/class-wp-job-manager-form-submit-job.php:217
1336
  msgid "e.g. \"London\""
1337
  msgstr ""
1338
 
1339
- #: includes/class-wp-job-manager-post-types.php:1256
1340
  msgid "Leave this blank if the location is not important."
1341
  msgstr ""
1342
 
1343
- #: includes/class-wp-job-manager-post-types.php:1265
1344
  msgid ""
1345
  "This field is required for the \"application\" area to appear beneath the "
1346
  "listing."
1347
  msgstr ""
1348
 
1349
- #: includes/class-wp-job-manager-post-types.php:1291
1350
  msgid "Brief description about the company"
1351
  msgstr ""
1352
 
1353
- #: includes/class-wp-job-manager-post-types.php:1307
1354
  msgid "URL to the company video"
1355
  msgstr ""
1356
 
1357
- #: includes/class-wp-job-manager-post-types.php:1316
1358
  msgid "Position Filled"
1359
  msgstr ""
1360
 
1361
- #: includes/class-wp-job-manager-post-types.php:1322
1362
  msgid "Filled listings will no longer accept applications."
1363
  msgstr ""
1364
 
1365
- #: includes/class-wp-job-manager-post-types.php:1325
1366
  msgid "Featured Listing"
1367
  msgstr ""
1368
 
1369
- #: includes/class-wp-job-manager-post-types.php:1327
1370
  msgid ""
1371
  "Featured listings will be sticky during searches, and can be styled "
1372
  "differently."
1373
  msgstr ""
1374
 
1375
- #: includes/class-wp-job-manager-post-types.php:1335
1376
  msgid "Listing Expiry Date"
1377
  msgstr ""
1378
 
@@ -1423,8 +1435,8 @@ msgstr ""
1423
  msgid "Listing Expires"
1424
  msgstr ""
1425
 
1426
- #: includes/class-wp-job-manager-shortcodes.php:415
1427
- #: includes/class-wp-job-manager-shortcodes.php:453
1428
  msgid "Load more listings"
1429
  msgstr ""
1430
 
@@ -1470,7 +1482,7 @@ msgid "Invalid file type. Accepted types:"
1470
  msgstr ""
1471
 
1472
  #: includes/class-wp-job-manager.php:439
1473
- #: includes/forms/class-wp-job-manager-form-submit-job.php:406
1474
  #. translators: Placeholder %d is the number of files to that users are limited
1475
  #. to.
1476
  msgid "You are only allowed to upload a maximum of %d files."
@@ -1574,7 +1586,7 @@ msgid "Submit Details"
1574
  msgstr ""
1575
 
1576
  #: includes/forms/class-wp-job-manager-form-submit-job.php:88
1577
- #: includes/forms/class-wp-job-manager-form-submit-job.php:562
1578
  #: templates/job-preview.php:30
1579
  msgid "Preview"
1580
  msgstr ""
@@ -1640,22 +1652,22 @@ msgstr ""
1640
  msgid "Logo"
1641
  msgstr ""
1642
 
1643
- #: includes/forms/class-wp-job-manager-form-submit-job.php:343
1644
  #. translators: Placeholder %s is the label for the required field.
1645
  msgid "%s is a required field"
1646
  msgstr ""
1647
 
1648
- #: includes/forms/class-wp-job-manager-form-submit-job.php:354
1649
  #. translators: Placeholder %s is the field label that is did not validate.
1650
  msgid "%s is invalid"
1651
  msgstr ""
1652
 
1653
- #: includes/forms/class-wp-job-manager-form-submit-job.php:371
1654
- msgid "Invalid attachment provided."
1655
  msgstr ""
1656
 
1657
- #: includes/forms/class-wp-job-manager-form-submit-job.php:389
1658
- #: wp-job-manager-functions.php:1308
1659
  #. translators: Placeholder %1$s is field label; %2$s is the file mime type;
1660
  #. %3$s is the allowed mime-types.
1661
  #. translators: %1$s is the file field label; %2$s is the file type; %3$s is
@@ -1663,48 +1675,52 @@ msgstr ""
1663
  msgid "\"%1$s\" (filetype %2$s) needs to be one of the following file types: %3$s"
1664
  msgstr ""
1665
 
1666
- #: includes/forms/class-wp-job-manager-form-submit-job.php:424
 
 
 
 
1667
  msgid "Please enter a valid application email address"
1668
  msgstr ""
1669
 
1670
- #: includes/forms/class-wp-job-manager-form-submit-job.php:433
1671
  msgid "Please enter a valid application URL"
1672
  msgstr ""
1673
 
1674
- #: includes/forms/class-wp-job-manager-form-submit-job.php:443
1675
  msgid "Please enter a valid application email address or URL"
1676
  msgstr ""
1677
 
1678
- #: includes/forms/class-wp-job-manager-form-submit-job.php:621
1679
  msgid "Please enter a username."
1680
  msgstr ""
1681
 
1682
- #: includes/forms/class-wp-job-manager-form-submit-job.php:625
1683
  msgid "Please enter a password."
1684
  msgstr ""
1685
 
1686
- #: includes/forms/class-wp-job-manager-form-submit-job.php:629
1687
  msgid "Please enter your email address."
1688
  msgstr ""
1689
 
1690
- #: includes/forms/class-wp-job-manager-form-submit-job.php:635
1691
  msgid "Passwords must match."
1692
  msgstr ""
1693
 
1694
- #: includes/forms/class-wp-job-manager-form-submit-job.php:641
1695
  #. translators: Placeholder %s is the password hint.
1696
  msgid "Invalid Password: %s"
1697
  msgstr ""
1698
 
1699
- #: includes/forms/class-wp-job-manager-form-submit-job.php:643
1700
  msgid "Password is not valid."
1701
  msgstr ""
1702
 
1703
- #: includes/forms/class-wp-job-manager-form-submit-job.php:666
1704
  msgid "You must be signed in to post a new listing."
1705
  msgstr ""
1706
 
1707
- #: includes/forms/class-wp-job-manager-form-submit-job.php:689
1708
  #. translators: placeholder is the URL to the job dashboard page.
1709
  msgid ""
1710
  "Draft was saved. Job listing drafts can be resumed from the <a "
@@ -1755,6 +1771,21 @@ msgstr ""
1755
  msgid "Hide notice"
1756
  msgstr ""
1757
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1758
  #: includes/helper/views/html-licences.php:56
1759
  #: includes/helper/views/html-licences.php:69
1760
  msgid "License"
@@ -1765,11 +1796,21 @@ msgstr ""
1765
  msgid "Email"
1766
  msgstr ""
1767
 
 
 
 
 
 
1768
  #: includes/helper/views/html-licences.php:63
1769
  msgid "Deactivate License"
1770
  msgstr ""
1771
 
1772
- #: includes/helper/views/html-licences.php:85
 
 
 
 
 
1773
  msgid "No plugins are activated that have licenses managed by WP Job Manager."
1774
  msgstr ""
1775
 
@@ -1863,41 +1904,43 @@ msgstr ""
1863
  msgid "Your account"
1864
  msgstr ""
1865
 
1866
- #: templates/account-signin.php:25
 
1867
  msgid "You are currently signed in as <strong>%s</strong>."
1868
  msgstr ""
1869
 
1870
- #: templates/account-signin.php:28
1871
  msgid "Sign out"
1872
  msgstr ""
1873
 
1874
- #: templates/account-signin.php:39
1875
  msgid "Have an account?"
1876
  msgstr ""
1877
 
1878
- #: templates/account-signin.php:41 templates/job-dashboard-login.php:20
1879
  msgid "Sign in"
1880
  msgstr ""
1881
 
1882
- #: templates/account-signin.php:45
 
1883
  msgid ""
1884
  "If you don't have an account you can %screate one below by entering your "
1885
  "email address/username."
1886
  msgstr ""
1887
 
1888
- #: templates/account-signin.php:45
1889
  msgid "optionally"
1890
  msgstr ""
1891
 
1892
- #: templates/account-signin.php:47
1893
  msgid "Your account details will be confirmed via email."
1894
  msgstr ""
1895
 
1896
- #: templates/account-signin.php:52
1897
  msgid "You must sign in to create a new listing."
1898
  msgstr ""
1899
 
1900
- #: templates/account-signin.php:63 templates/job-submit.php:43
1901
  #: templates/job-submit.php:60
1902
  msgid "(optional)"
1903
  msgstr ""
@@ -1939,81 +1982,104 @@ msgstr ""
1939
  msgid "Visit <a href=\"%s\">WordPress admin</a> to manage the listing."
1940
  msgstr ""
1941
 
1942
- #: templates/emails/admin-new-job.php:26
 
 
1943
  msgid "A new job listing has been submitted to <a href=\"%s\">%s</a>."
1944
  msgstr ""
1945
 
1946
- #: templates/emails/admin-new-job.php:33
1947
- #: templates/emails/plain/admin-new-job.php:26
1948
  msgid "It has been published and is now available to the public."
1949
  msgstr ""
1950
 
1951
- #: templates/emails/admin-new-job.php:38
 
1952
  msgid ""
1953
  "It is awaiting approval by an administrator in <a href=\"%s\">WordPress "
1954
  "admin</a>."
1955
  msgstr ""
1956
 
1957
- #: templates/emails/admin-updated-job.php:25
 
 
1958
  msgid "A job listing has been updated on <a href=\"%s\">%s</a>."
1959
  msgstr ""
1960
 
1961
- #: templates/emails/admin-updated-job.php:28
1962
- #: templates/emails/plain/admin-updated-job.php:26
1963
  msgid "The changes have been published and are now available to the public."
1964
  msgstr ""
1965
 
1966
- #: templates/emails/admin-updated-job.php:32
 
1967
  msgid ""
1968
  "The job listing is not publicly available until the changes are approved by "
1969
  "an administrator in the site's <a href=\"%s\">WordPress admin</a>."
1970
  msgstr ""
1971
 
1972
- #: templates/emails/employer-expiring-job.php:32
 
 
1973
  msgid "The following job listing is expiring today from <a href=\"%s\">%s</a>."
1974
  msgstr ""
1975
 
1976
- #: templates/emails/employer-expiring-job.php:40
 
 
1977
  msgid "The following job listing is expiring soon from <a href=\"%s\">%s</a>."
1978
  msgstr ""
1979
 
1980
- #: templates/emails/employer-expiring-job.php:48
 
1981
  msgid "Visit the <a href=\"%s\">job listing dashboard</a> to manage the listing."
1982
  msgstr ""
1983
 
1984
- #: templates/emails/plain/admin-expiring-job.php:30
1985
- #: templates/emails/plain/employer-expiring-job.php:29
1986
- msgid "The following job listing is expiring today from %s (%s)."
 
 
1987
  msgstr ""
1988
 
1989
- #: templates/emails/plain/admin-expiring-job.php:36
1990
- #: templates/emails/plain/employer-expiring-job.php:31
1991
- msgid "The following job listing is expiring soon from %s (%s)."
 
 
1992
  msgstr ""
1993
 
1994
- #: templates/emails/plain/admin-expiring-job.php:43
 
1995
  msgid "Visit WordPress admin (%s) to manage the listing."
1996
  msgstr ""
1997
 
1998
- #: templates/emails/plain/admin-new-job.php:23
1999
- msgid "A new job listing has been submitted to %s (%s)."
 
 
2000
  msgstr ""
2001
 
2002
- #: templates/emails/plain/admin-new-job.php:29
 
2003
  msgid "It is awaiting approval by an administrator in WordPress admin (%s)."
2004
  msgstr ""
2005
 
2006
- #: templates/emails/plain/admin-updated-job.php:23
2007
- msgid "A job listing has been updated on %s (%s)."
 
 
2008
  msgstr ""
2009
 
2010
- #: templates/emails/plain/admin-updated-job.php:29
 
2011
  msgid ""
2012
  "The job listing is not publicly available until the changes are approved by "
2013
  "an administrator in the site's WordPress admin (%s)."
2014
  msgstr ""
2015
 
2016
- #: templates/emails/plain/employer-expiring-job.php:33
 
2017
  msgid "Visit the job listing dashboard (%s) to manage the listing."
2018
  msgstr ""
2019
 
@@ -2022,12 +2088,12 @@ msgid "Maximum file size: %s."
2022
  msgstr ""
2023
 
2024
  #: templates/form-fields/multiselect-field.php:20
2025
- #: wp-job-manager-functions.php:1087
2026
  msgid "No results match"
2027
  msgstr ""
2028
 
2029
  #: templates/form-fields/multiselect-field.php:20
2030
- #: wp-job-manager-functions.php:1088
2031
  msgid "Select Some Options"
2032
  msgstr ""
2033
 
@@ -2036,7 +2102,8 @@ msgstr ""
2036
  msgid "remove"
2037
  msgstr ""
2038
 
2039
- #: templates/job-application-email.php:18
 
2040
  msgid ""
2041
  "To apply for this job <strong>email your details to</strong> <a "
2042
  "class=\"job_application_email\" href=\"mailto:%1$s%2$s\">%1$s</a>"
@@ -2132,11 +2199,16 @@ msgstr ""
2132
  msgid "Save Draft"
2133
  msgstr ""
2134
 
2135
- #: templates/job-submitted.php:24
2136
- msgid "%s listed successfully. To view your listing <a href=\"%s\">click here</a>."
 
 
 
 
2137
  msgstr ""
2138
 
2139
- #: templates/job-submitted.php:33
 
2140
  msgid "%s submitted successfully. Your listing will be visible once approved."
2141
  msgstr ""
2142
 
@@ -2196,11 +2268,11 @@ msgstr ""
2196
  msgid "Passwords must be at least 8 characters long."
2197
  msgstr ""
2198
 
2199
- #: wp-job-manager-functions.php:1086
2200
  msgid "Choose a category&hellip;"
2201
  msgstr ""
2202
 
2203
- #: wp-job-manager-functions.php:1311
2204
  #. translators: %s is the list of allowed file types.
2205
  msgid "Uploaded files need to be one of the following file types: %s"
2206
  msgstr ""
@@ -2294,19 +2366,19 @@ msgid "Searching&hellip;"
2294
  msgstr ""
2295
 
2296
  #: includes/admin/class-wp-job-manager-permalink-settings.php:108
2297
- #: includes/class-wp-job-manager-post-types.php:976
2298
  msgctxt "Job permalink - resave permalinks after changing this"
2299
  msgid "job"
2300
  msgstr ""
2301
 
2302
  #: includes/admin/class-wp-job-manager-permalink-settings.php:117
2303
- #: includes/class-wp-job-manager-post-types.php:977
2304
  msgctxt "Job category slug - resave permalinks after changing this"
2305
  msgid "job-category"
2306
  msgstr ""
2307
 
2308
  #: includes/admin/class-wp-job-manager-permalink-settings.php:126
2309
- #: includes/class-wp-job-manager-post-types.php:978
2310
  msgctxt "Job type slug - resave permalinks after changing this"
2311
  msgid "job-type"
2312
  msgstr ""
@@ -2358,7 +2430,7 @@ msgctxt "post status"
2358
  msgid "Active"
2359
  msgstr ""
2360
 
2361
- #: includes/class-wp-job-manager-post-types.php:960
2362
  msgctxt "Post type archive slug - resave permalinks after changing this"
2363
  msgid "jobs"
2364
  msgstr ""
1
+ # Copyright (C) 2020 Automattic
2
  # This file is distributed under the GPL2+.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: WP Job Manager 1.34.2\n"
6
  "Report-Msgid-Bugs-To: https://github.com/Automattic/WP-Job-Manager/issues\n"
7
+ "POT-Creation-Date: 2020-05-28 16:26:54+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=utf-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
11
+ "PO-Revision-Date: 2020-MO-DA HO:MI+ZONE\n"
12
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13
  "Language-Team: LANGUAGE <EMAIL@ADDRESS>\n"
14
  "X-Generator: grunt-wp-i18n 1.0.3\n"
23
  msgid "<a href=\"%s\">Switch to primary language</a> to edit this setting."
24
  msgstr ""
25
 
26
+ #: includes/abstracts/abstract-wp-job-manager-form.php:378
27
+ #: includes/abstracts/abstract-wp-job-manager-form.php:394
28
  #. translators: Placeholder is for the label of the reCAPTCHA field.
29
  #. translators: %s is the name of the form validation that failed.
30
  msgid "\"%s\" check failed. Please try again."
201
 
202
  #: includes/admin/class-wp-job-manager-cpt.php:497
203
  #: includes/class-wp-job-manager-email-notifications.php:270
204
+ #: includes/class-wp-job-manager-post-types.php:1275
205
  #: includes/forms/class-wp-job-manager-form-submit-job.php:213
206
  #: includes/widgets/class-wp-job-manager-widget-recent-jobs.php:46
207
  #: templates/job-filters.php:35 templates/job-filters.php:36
243
  msgid "ID: %d"
244
  msgstr ""
245
 
246
+ #: includes/admin/class-wp-job-manager-cpt.php:583
247
+ msgid "Show more details"
248
+ msgstr ""
249
+
250
  #: includes/admin/class-wp-job-manager-cpt.php:613
251
  #. translators: %s placeholder is the username of the user.
252
  msgid "by a guest"
716
  msgid "Save Changes"
717
  msgstr ""
718
 
719
+ #: includes/admin/class-wp-job-manager-settings.php:641
720
  msgid "--no page--"
721
  msgstr ""
722
 
723
+ #: includes/admin/class-wp-job-manager-settings.php:647
724
  msgid "Select a page&hellip;"
725
  msgstr ""
726
 
728
  msgid "Setup"
729
  msgstr ""
730
 
731
+ #: includes/admin/class-wp-job-manager-setup.php:126
732
+ msgid "Error in nonce. Try again."
733
+ msgstr ""
734
+
735
  #: includes/admin/class-wp-job-manager-taxonomy-meta.php:87
736
  #: includes/admin/class-wp-job-manager-taxonomy-meta.php:110
737
  #: includes/admin/class-wp-job-manager-taxonomy-meta.php:129
1020
  msgstr ""
1021
 
1022
  #: includes/class-wp-job-manager-data-exporter.php:52
1023
+ #: includes/class-wp-job-manager-post-types.php:1294
1024
  msgid "Company Name"
1025
  msgstr ""
1026
 
1027
  #: includes/class-wp-job-manager-data-exporter.php:53
1028
+ #: includes/class-wp-job-manager-post-types.php:1302
1029
  msgid "Company Website"
1030
  msgstr ""
1031
 
1032
  #: includes/class-wp-job-manager-data-exporter.php:54
1033
+ #: includes/class-wp-job-manager-post-types.php:1311
1034
  msgid "Company Tagline"
1035
  msgstr ""
1036
 
1037
  #: includes/class-wp-job-manager-data-exporter.php:55
1038
+ #: includes/class-wp-job-manager-post-types.php:1319
1039
  msgid "Company Twitter"
1040
  msgstr ""
1041
 
1042
  #: includes/class-wp-job-manager-data-exporter.php:56
1043
+ #: includes/class-wp-job-manager-post-types.php:1327
1044
  msgid "Company Video"
1045
  msgstr ""
1046
 
1065
  msgid "(opens in a new tab)"
1066
  msgstr ""
1067
 
1068
+ #: includes/class-wp-job-manager-dependency-checker.php:118
1069
  #. translators: %s is the URL for the page where users can go to update
1070
  #. WordPress.
1071
+ msgid "Please <a href=\"%s\">update WordPress</a> to avoid issues."
1072
+ msgstr ""
1073
+
1074
+ #: includes/class-wp-job-manager-dependency-checker.php:122
1075
  msgid "<strong>WP Job Manager</strong> requires a more recent version of WordPress."
1076
  msgstr ""
1077
 
1313
  msgstr[0] ""
1314
  msgstr[1] ""
1315
 
1316
+ #: includes/class-wp-job-manager-post-types.php:1262
1317
  #: includes/forms/class-wp-job-manager-form-submit-job.php:190
1318
  msgid "Application email/URL"
1319
  msgstr ""
1320
 
1321
+ #: includes/class-wp-job-manager-post-types.php:1263
1322
  #: includes/forms/class-wp-job-manager-form-submit-job.php:191
1323
  msgid "Enter an email address or website URL"
1324
  msgstr ""
1325
 
1326
+ #: includes/class-wp-job-manager-post-types.php:1266
1327
  #: includes/forms/class-wp-job-manager-form-submit-job.php:180
1328
  msgid "Application email"
1329
  msgstr ""
1330
 
1331
+ #: includes/class-wp-job-manager-post-types.php:1267
1332
  #: includes/forms/class-wp-job-manager-form-submit-job.php:181
1333
  msgid "you@example.com"
1334
  msgstr ""
1335
 
1336
+ #: includes/class-wp-job-manager-post-types.php:1269
1337
  #: includes/forms/class-wp-job-manager-form-submit-job.php:185
1338
  msgid "Application URL"
1339
  msgstr ""
1340
 
1341
+ #: includes/class-wp-job-manager-post-types.php:1270
1342
  #: includes/forms/class-wp-job-manager-form-submit-job.php:186
1343
  msgid "https://"
1344
  msgstr ""
1345
 
1346
+ #: includes/class-wp-job-manager-post-types.php:1276
1347
  #: includes/forms/class-wp-job-manager-form-submit-job.php:217
1348
  msgid "e.g. \"London\""
1349
  msgstr ""
1350
 
1351
+ #: includes/class-wp-job-manager-post-types.php:1277
1352
  msgid "Leave this blank if the location is not important."
1353
  msgstr ""
1354
 
1355
+ #: includes/class-wp-job-manager-post-types.php:1286
1356
  msgid ""
1357
  "This field is required for the \"application\" area to appear beneath the "
1358
  "listing."
1359
  msgstr ""
1360
 
1361
+ #: includes/class-wp-job-manager-post-types.php:1312
1362
  msgid "Brief description about the company"
1363
  msgstr ""
1364
 
1365
+ #: includes/class-wp-job-manager-post-types.php:1328
1366
  msgid "URL to the company video"
1367
  msgstr ""
1368
 
1369
+ #: includes/class-wp-job-manager-post-types.php:1337
1370
  msgid "Position Filled"
1371
  msgstr ""
1372
 
1373
+ #: includes/class-wp-job-manager-post-types.php:1343
1374
  msgid "Filled listings will no longer accept applications."
1375
  msgstr ""
1376
 
1377
+ #: includes/class-wp-job-manager-post-types.php:1346
1378
  msgid "Featured Listing"
1379
  msgstr ""
1380
 
1381
+ #: includes/class-wp-job-manager-post-types.php:1348
1382
  msgid ""
1383
  "Featured listings will be sticky during searches, and can be styled "
1384
  "differently."
1385
  msgstr ""
1386
 
1387
+ #: includes/class-wp-job-manager-post-types.php:1356
1388
  msgid "Listing Expiry Date"
1389
  msgstr ""
1390
 
1435
  msgid "Listing Expires"
1436
  msgstr ""
1437
 
1438
+ #: includes/class-wp-job-manager-shortcodes.php:423
1439
+ #: includes/class-wp-job-manager-shortcodes.php:461
1440
  msgid "Load more listings"
1441
  msgstr ""
1442
 
1482
  msgstr ""
1483
 
1484
  #: includes/class-wp-job-manager.php:439
1485
+ #: includes/forms/class-wp-job-manager-form-submit-job.php:422
1486
  #. translators: Placeholder %d is the number of files to that users are limited
1487
  #. to.
1488
  msgid "You are only allowed to upload a maximum of %d files."
1586
  msgstr ""
1587
 
1588
  #: includes/forms/class-wp-job-manager-form-submit-job.php:88
1589
+ #: includes/forms/class-wp-job-manager-form-submit-job.php:578
1590
  #: templates/job-preview.php:30
1591
  msgid "Preview"
1592
  msgstr ""
1652
  msgid "Logo"
1653
  msgstr ""
1654
 
1655
+ #: includes/forms/class-wp-job-manager-form-submit-job.php:359
1656
  #. translators: Placeholder %s is the label for the required field.
1657
  msgid "%s is a required field"
1658
  msgstr ""
1659
 
1660
+ #: includes/forms/class-wp-job-manager-form-submit-job.php:370
1661
  #. translators: Placeholder %s is the field label that is did not validate.
1662
  msgid "%s is invalid"
1663
  msgstr ""
1664
 
1665
+ #: includes/forms/class-wp-job-manager-form-submit-job.php:385
1666
+ msgid "Invalid image path."
1667
  msgstr ""
1668
 
1669
+ #: includes/forms/class-wp-job-manager-form-submit-job.php:395
1670
+ #: wp-job-manager-functions.php:1363
1671
  #. translators: Placeholder %1$s is field label; %2$s is the file mime type;
1672
  #. %3$s is the allowed mime-types.
1673
  #. translators: %1$s is the file field label; %2$s is the file type; %3$s is
1675
  msgid "\"%1$s\" (filetype %2$s) needs to be one of the following file types: %3$s"
1676
  msgstr ""
1677
 
1678
+ #: includes/forms/class-wp-job-manager-form-submit-job.php:405
1679
+ msgid "Invalid attachment provided."
1680
+ msgstr ""
1681
+
1682
+ #: includes/forms/class-wp-job-manager-form-submit-job.php:440
1683
  msgid "Please enter a valid application email address"
1684
  msgstr ""
1685
 
1686
+ #: includes/forms/class-wp-job-manager-form-submit-job.php:449
1687
  msgid "Please enter a valid application URL"
1688
  msgstr ""
1689
 
1690
+ #: includes/forms/class-wp-job-manager-form-submit-job.php:459
1691
  msgid "Please enter a valid application email address or URL"
1692
  msgstr ""
1693
 
1694
+ #: includes/forms/class-wp-job-manager-form-submit-job.php:637
1695
  msgid "Please enter a username."
1696
  msgstr ""
1697
 
1698
+ #: includes/forms/class-wp-job-manager-form-submit-job.php:641
1699
  msgid "Please enter a password."
1700
  msgstr ""
1701
 
1702
+ #: includes/forms/class-wp-job-manager-form-submit-job.php:645
1703
  msgid "Please enter your email address."
1704
  msgstr ""
1705
 
1706
+ #: includes/forms/class-wp-job-manager-form-submit-job.php:651
1707
  msgid "Passwords must match."
1708
  msgstr ""
1709
 
1710
+ #: includes/forms/class-wp-job-manager-form-submit-job.php:657
1711
  #. translators: Placeholder %s is the password hint.
1712
  msgid "Invalid Password: %s"
1713
  msgstr ""
1714
 
1715
+ #: includes/forms/class-wp-job-manager-form-submit-job.php:659
1716
  msgid "Password is not valid."
1717
  msgstr ""
1718
 
1719
+ #: includes/forms/class-wp-job-manager-form-submit-job.php:682
1720
  msgid "You must be signed in to post a new listing."
1721
  msgstr ""
1722
 
1723
+ #: includes/forms/class-wp-job-manager-form-submit-job.php:705
1724
  #. translators: placeholder is the URL to the job dashboard page.
1725
  msgid ""
1726
  "Draft was saved. Job listing drafts can be resumed from the <a "
1771
  msgid "Hide notice"
1772
  msgstr ""
1773
 
1774
+ #: includes/helper/views/html-licence-key-error.php:15
1775
+ #. translators: %1$s is the plugin name, %2$s is the license setting page URL.
1776
+ msgid ""
1777
+ "There is a problem with the license for \"%1$s\". Please <a "
1778
+ "href=\"%2$s\">manage the license</a> to check for a solution and continue "
1779
+ "receiving updates."
1780
+ msgstr ""
1781
+
1782
+ #: includes/helper/views/html-licence-key-notice.php:15
1783
+ #. translators: %1$s is the license setting page URL, %2$s is the plugin name.
1784
+ msgid ""
1785
+ "<a href=\"%1$s\">Please enter your license key</a> to get updates for "
1786
+ "\"%2$s\"."
1787
+ msgstr ""
1788
+
1789
  #: includes/helper/views/html-licences.php:56
1790
  #: includes/helper/views/html-licences.php:69
1791
  msgid "License"
1796
  msgid "Email"
1797
  msgstr ""
1798
 
1799
+ #: includes/helper/views/html-licences.php:60
1800
+ #: includes/helper/views/html-licences.php:73
1801
+ msgid "Email address"
1802
+ msgstr ""
1803
+
1804
  #: includes/helper/views/html-licences.php:63
1805
  msgid "Deactivate License"
1806
  msgstr ""
1807
 
1808
+ #: includes/helper/views/html-licences.php:84
1809
+ #. translators: Placeholder %s is the lost license key URL.
1810
+ msgid "Lost your license key? <a href=\"%s\">Retrieve it here</a>."
1811
+ msgstr ""
1812
+
1813
+ #: includes/helper/views/html-licences.php:86
1814
  msgid "No plugins are activated that have licenses managed by WP Job Manager."
1815
  msgstr ""
1816
 
1904
  msgid "Your account"
1905
  msgstr ""
1906
 
1907
+ #: templates/account-signin.php:26
1908
+ #. translators: Placeholder %s is the username.
1909
  msgid "You are currently signed in as <strong>%s</strong>."
1910
  msgstr ""
1911
 
1912
+ #: templates/account-signin.php:29
1913
  msgid "Sign out"
1914
  msgstr ""
1915
 
1916
+ #: templates/account-signin.php:40
1917
  msgid "Have an account?"
1918
  msgstr ""
1919
 
1920
+ #: templates/account-signin.php:42 templates/job-dashboard-login.php:20
1921
  msgid "Sign in"
1922
  msgstr ""
1923
 
1924
+ #: templates/account-signin.php:47
1925
+ #. translators: Placeholder %s is the optionally text.
1926
  msgid ""
1927
  "If you don't have an account you can %screate one below by entering your "
1928
  "email address/username."
1929
  msgstr ""
1930
 
1931
+ #: templates/account-signin.php:47
1932
  msgid "optionally"
1933
  msgstr ""
1934
 
1935
+ #: templates/account-signin.php:49
1936
  msgid "Your account details will be confirmed via email."
1937
  msgstr ""
1938
 
1939
+ #: templates/account-signin.php:54
1940
  msgid "You must sign in to create a new listing."
1941
  msgstr ""
1942
 
1943
+ #: templates/account-signin.php:65 templates/job-submit.php:43
1944
  #: templates/job-submit.php:60
1945
  msgid "(optional)"
1946
  msgstr ""
1982
  msgid "Visit <a href=\"%s\">WordPress admin</a> to manage the listing."
1983
  msgstr ""
1984
 
1985
+ #: templates/emails/admin-new-job.php:27
1986
+ #. translators: %1$s placeholder is URL to the blog. %2$s placeholder is the
1987
+ #. name of the site.
1988
  msgid "A new job listing has been submitted to <a href=\"%s\">%s</a>."
1989
  msgstr ""
1990
 
1991
+ #: templates/emails/admin-new-job.php:34
1992
+ #: templates/emails/plain/admin-new-job.php:27
1993
  msgid "It has been published and is now available to the public."
1994
  msgstr ""
1995
 
1996
+ #: templates/emails/admin-new-job.php:40
1997
+ #. translators: Placeholder %s is the admin job listings URL.
1998
  msgid ""
1999
  "It is awaiting approval by an administrator in <a href=\"%s\">WordPress "
2000
  "admin</a>."
2001
  msgstr ""
2002
 
2003
+ #: templates/emails/admin-updated-job.php:26
2004
+ #. translators: %1$s placeholder is URL to the blog. %2$s placeholder is the
2005
+ #. name of the site.
2006
  msgid "A job listing has been updated on <a href=\"%s\">%s</a>."
2007
  msgstr ""
2008
 
2009
+ #: templates/emails/admin-updated-job.php:29
2010
+ #: templates/emails/plain/admin-updated-job.php:27
2011
  msgid "The changes have been published and are now available to the public."
2012
  msgstr ""
2013
 
2014
+ #: templates/emails/admin-updated-job.php:34
2015
+ #. translators: Placeholder %s is the admin job listings URL.
2016
  msgid ""
2017
  "The job listing is not publicly available until the changes are approved by "
2018
  "an administrator in the site's <a href=\"%s\">WordPress admin</a>."
2019
  msgstr ""
2020
 
2021
+ #: templates/emails/employer-expiring-job.php:33
2022
+ #. translators: %1$s placeholder is URL to the blog. %2$s placeholder is the
2023
+ #. name of the site.
2024
  msgid "The following job listing is expiring today from <a href=\"%s\">%s</a>."
2025
  msgstr ""
2026
 
2027
+ #: templates/emails/employer-expiring-job.php:42
2028
+ #. translators: %1$s placeholder is URL to the blog. %2$s placeholder is the
2029
+ #. name of the site.
2030
  msgid "The following job listing is expiring soon from <a href=\"%s\">%s</a>."
2031
  msgstr ""
2032
 
2033
+ #: templates/emails/employer-expiring-job.php:51
2034
+ #. translators: Placeholder %s is the job listing dashboard URL.
2035
  msgid "Visit the <a href=\"%s\">job listing dashboard</a> to manage the listing."
2036
  msgstr ""
2037
 
2038
+ #: templates/emails/plain/admin-expiring-job.php:31
2039
+ #: templates/emails/plain/employer-expiring-job.php:30
2040
+ #. translators: %1$s placeholder is the name of the site, %2$s placeholder is
2041
+ #. URL to the blog.
2042
+ msgid "The following job listing is expiring today from %1$s (%2$s)."
2043
  msgstr ""
2044
 
2045
+ #: templates/emails/plain/admin-expiring-job.php:38
2046
+ #: templates/emails/plain/employer-expiring-job.php:33
2047
+ #. translators: %1$s placeholder is the name of the site, %2$s placeholder is
2048
+ #. URL to the blog.
2049
+ msgid "The following job listing is expiring soon from %1$s (%2$s)."
2050
  msgstr ""
2051
 
2052
+ #: templates/emails/plain/admin-expiring-job.php:46
2053
+ #. translators: Placeholder %s is the edit job URL.
2054
  msgid "Visit WordPress admin (%s) to manage the listing."
2055
  msgstr ""
2056
 
2057
+ #: templates/emails/plain/admin-new-job.php:24
2058
+ #. translators: %1$s placeholder is the name of the site, %2$s placeholder is
2059
+ #. URL to the blog.
2060
+ msgid "A new job listing has been submitted to %1$s (%2$s)."
2061
  msgstr ""
2062
 
2063
+ #: templates/emails/plain/admin-new-job.php:31
2064
+ #. translators: Placeholder %s is the admin job listings URL.
2065
  msgid "It is awaiting approval by an administrator in WordPress admin (%s)."
2066
  msgstr ""
2067
 
2068
+ #: templates/emails/plain/admin-updated-job.php:24
2069
+ #. translators: %1$s placeholder is the name of the site, %2$s placeholder is
2070
+ #. URL to the blog.
2071
+ msgid "A job listing has been updated on %1$s (%2$s)."
2072
  msgstr ""
2073
 
2074
+ #: templates/emails/plain/admin-updated-job.php:31
2075
+ #. translators: Placeholder %s is the admin job listings URL.
2076
  msgid ""
2077
  "The job listing is not publicly available until the changes are approved by "
2078
  "an administrator in the site's WordPress admin (%s)."
2079
  msgstr ""
2080
 
2081
+ #: templates/emails/plain/employer-expiring-job.php:36
2082
+ #. translators: Placeholder %s is the job listing dashboard URL.
2083
  msgid "Visit the job listing dashboard (%s) to manage the listing."
2084
  msgstr ""
2085
 
2088
  msgstr ""
2089
 
2090
  #: templates/form-fields/multiselect-field.php:20
2091
+ #: wp-job-manager-functions.php:1130
2092
  msgid "No results match"
2093
  msgstr ""
2094
 
2095
  #: templates/form-fields/multiselect-field.php:20
2096
+ #: wp-job-manager-functions.php:1131
2097
  msgid "Select Some Options"
2098
  msgstr ""
2099
 
2102
  msgid "remove"
2103
  msgstr ""
2104
 
2105
+ #: templates/job-application-email.php:19
2106
+ #. translators: %1$s is the email address, %2$s is the subject query args.
2107
  msgid ""
2108
  "To apply for this job <strong>email your details to</strong> <a "
2109
  "class=\"job_application_email\" href=\"mailto:%1$s%2$s\">%1$s</a>"
2199
  msgid "Save Draft"
2200
  msgstr ""
2201
 
2202
+ #: templates/job-submitted.php:25
2203
+ #. translators: %1$s is the job listing post type name, %2$s is the job listing
2204
+ #. URL.
2205
+ msgid ""
2206
+ "%1$s listed successfully. To view your listing <a href=\"%2$s\">click "
2207
+ "here</a>."
2208
  msgstr ""
2209
 
2210
+ #: templates/job-submitted.php:35
2211
+ #. translators: Placeholder %s is the job listing post type name.
2212
  msgid "%s submitted successfully. Your listing will be visible once approved."
2213
  msgstr ""
2214
 
2268
  msgid "Passwords must be at least 8 characters long."
2269
  msgstr ""
2270
 
2271
+ #: wp-job-manager-functions.php:1129
2272
  msgid "Choose a category&hellip;"
2273
  msgstr ""
2274
 
2275
+ #: wp-job-manager-functions.php:1366
2276
  #. translators: %s is the list of allowed file types.
2277
  msgid "Uploaded files need to be one of the following file types: %s"
2278
  msgstr ""
2366
  msgstr ""
2367
 
2368
  #: includes/admin/class-wp-job-manager-permalink-settings.php:108
2369
+ #: includes/class-wp-job-manager-post-types.php:997
2370
  msgctxt "Job permalink - resave permalinks after changing this"
2371
  msgid "job"
2372
  msgstr ""
2373
 
2374
  #: includes/admin/class-wp-job-manager-permalink-settings.php:117
2375
+ #: includes/class-wp-job-manager-post-types.php:998
2376
  msgctxt "Job category slug - resave permalinks after changing this"
2377
  msgid "job-category"
2378
  msgstr ""
2379
 
2380
  #: includes/admin/class-wp-job-manager-permalink-settings.php:126
2381
+ #: includes/class-wp-job-manager-post-types.php:999
2382
  msgctxt "Job type slug - resave permalinks after changing this"
2383
  msgid "job-type"
2384
  msgstr ""
2430
  msgid "Active"
2431
  msgstr ""
2432
 
2433
+ #: includes/class-wp-job-manager-post-types.php:981
2434
  msgctxt "Post type archive slug - resave permalinks after changing this"
2435
  msgid "jobs"
2436
  msgstr ""
readme.txt CHANGED
@@ -4,7 +4,7 @@ Tags: job manager, job listing, job board, job management, job lists, job list,
4
  Requires at least: 4.9
5
  Tested up to: 5.4
6
  Requires PHP: 5.6
7
- Stable tag: 1.34.1
8
  License: GPLv3
9
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
10
 
@@ -23,7 +23,7 @@ WP Job Manager is a **lightweight** job listing plugin for adding job-board like
23
  * Each listing can be tied to an email or website address so that job seekers can apply to the jobs.
24
  * Searches also display RSS links to allow job seekers to be alerted to new jobs matching their search.
25
  * Allow logged in employers to view, edit, mark filled, or delete their active job listings.
26
- * Developer friendly code Custom Post Types, endpoints & template files.
27
 
28
  The plugin comes with several shortcodes to output jobs in various formats, and since its built with Custom Post Types you are free to extend it further through themes.
29
 
@@ -153,6 +153,22 @@ It then creates a database based on the parameters passed to it.
153
 
154
  == Changelog ==
155
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
156
  = 1.34.1 =
157
  * Templates Updated: `job-submitted.php`, `job-dashboard.php`.
158
  * Enhancement: Email notifications are sent separately if multiple recipients are listed.
4
  Requires at least: 4.9
5
  Tested up to: 5.4
6
  Requires PHP: 5.6
7
+ Stable tag: 1.34.2
8
  License: GPLv3
9
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
10
 
23
  * Each listing can be tied to an email or website address so that job seekers can apply to the jobs.
24
  * Searches also display RSS links to allow job seekers to be alerted to new jobs matching their search.
25
  * Allow logged in employers to view, edit, mark filled, or delete their active job listings.
26
+ * Developer friendly code - Custom Post Types, endpoints & template files.
27
 
28
  The plugin comes with several shortcodes to output jobs in various formats, and since its built with Custom Post Types you are free to extend it further through themes.
29
 
153
 
154
  == Changelog ==
155
 
156
+ = 1.34.2 =
157
+ * Enhancement: New filter to skip validation for application field.
158
+ * Enhancement: New method for clearing fields.
159
+ * Fix: Improve TwentyTwenty theme compatibility (@JuanchoPestana)
160
+ * Fix: Issue in RSS feed with empty query parameters.
161
+ * Fix: Issue on Jobs page with empty query parameters.
162
+ * Fix: Conflict with search query parameters on Jobs page.
163
+ * Fix: Ensuring hidden jobs do not display in RSS feed.
164
+ * Fix: Image validation when posting a job.
165
+ * Fix: JS error in file upload.
166
+ * Fix: Removed extra whitespace in textarea settings fields.
167
+ * Fix: Several untranslatable strings are now translatable.
168
+ * Fix: CC header in emails.
169
+ * Fix: Search category query sanitization.
170
+ * Fix: Remove PHP notices. (@truongwp)
171
+
172
  = 1.34.1 =
173
  * Templates Updated: `job-submitted.php`, `job-dashboard.php`.
174
  * Enhancement: Email notifications are sent separately if multiple recipients are listed.
templates/account-signin.php CHANGED
@@ -22,6 +22,7 @@ if ( ! defined( 'ABSPATH' ) ) {
22
  <div class="field account-sign-in">
23
  <?php
24
  $user = wp_get_current_user();
 
25
  printf( wp_kses_post( __( 'You are currently signed in as <strong>%s</strong>.', 'wp-job-manager' ) ), esc_html( $user->user_login ) );
26
  ?>
27
 
@@ -42,6 +43,7 @@ if ( ! defined( 'ABSPATH' ) ) {
42
 
43
  <?php if ( $registration_enabled ) : ?>
44
 
 
45
  <?php printf( esc_html__( 'If you don\'t have an account you can %screate one below by entering your email address/username.', 'wp-job-manager' ), $account_required ? '' : esc_html__( 'optionally', 'wp-job-manager' ) . ' ' ); ?>
46
  <?php if ( $use_standard_password_email ) : ?>
47
  <?php printf( esc_html__( 'Your account details will be confirmed via email.', 'wp-job-manager' ) ); ?>
22
  <div class="field account-sign-in">
23
  <?php
24
  $user = wp_get_current_user();
25
+ // translators: Placeholder %s is the username.
26
  printf( wp_kses_post( __( 'You are currently signed in as <strong>%s</strong>.', 'wp-job-manager' ) ), esc_html( $user->user_login ) );
27
  ?>
28
 
43
 
44
  <?php if ( $registration_enabled ) : ?>
45
 
46
+ <?php // translators: Placeholder %s is the optionally text. ?>
47
  <?php printf( esc_html__( 'If you don\'t have an account you can %screate one below by entering your email address/username.', 'wp-job-manager' ), $account_required ? '' : esc_html__( 'optionally', 'wp-job-manager' ) . ' ' ); ?>
48
  <?php if ( $use_standard_password_email ) : ?>
49
  <?php printf( esc_html__( 'Your account details will be confirmed via email.', 'wp-job-manager' ) ); ?>
templates/emails/admin-new-job.php CHANGED
@@ -23,6 +23,7 @@ $job = $args['job'];
23
  <p><?php
24
  echo wp_kses_post(
25
  sprintf(
 
26
  __( 'A new job listing has been submitted to <a href="%s">%s</a>.', 'wp-job-manager' ),
27
  home_url(),
28
  get_bloginfo( 'name' )
@@ -35,6 +36,7 @@ $job = $args['job'];
35
  case 'pending':
36
  echo wp_kses_post(
37
  sprintf(
 
38
  ' ' . __( 'It is awaiting approval by an administrator in <a href="%s">WordPress admin</a>.','wp-job-manager' ),
39
  esc_url( admin_url( 'edit.php?post_type=job_listing' ) )
40
  )
23
  <p><?php
24
  echo wp_kses_post(
25
  sprintf(
26
+ // translators: %1$s placeholder is URL to the blog. %2$s placeholder is the name of the site.
27
  __( 'A new job listing has been submitted to <a href="%s">%s</a>.', 'wp-job-manager' ),
28
  home_url(),
29
  get_bloginfo( 'name' )
36
  case 'pending':
37
  echo wp_kses_post(
38
  sprintf(
39
+ // translators: Placeholder %s is the admin job listings URL.
40
  ' ' . __( 'It is awaiting approval by an administrator in <a href="%s">WordPress admin</a>.','wp-job-manager' ),
41
  esc_url( admin_url( 'edit.php?post_type=job_listing' ) )
42
  )
templates/emails/admin-updated-job.php CHANGED
@@ -22,6 +22,7 @@ $job = $args['job'];
22
  ?>
23
  <p><?php
24
  echo wp_kses_post(
 
25
  sprintf( __( 'A job listing has been updated on <a href="%s">%s</a>.', 'wp-job-manager' ), home_url(), esc_html( get_bloginfo( 'name' ) ) ) );
26
  switch ( $job->post_status ) {
27
  case 'publish':
@@ -29,6 +30,7 @@ $job = $args['job'];
29
  break;
30
  case 'pending':
31
  echo wp_kses_post( sprintf(
 
32
  ' ' . __( 'The job listing is not publicly available until the changes are approved by an administrator in the site\'s <a href="%s">WordPress admin</a>.', 'wp-job-manager' ),
33
  esc_url( admin_url( 'edit.php?post_type=job_listing' ) )
34
  ) );
22
  ?>
23
  <p><?php
24
  echo wp_kses_post(
25
+ // translators: %1$s placeholder is URL to the blog. %2$s placeholder is the name of the site.
26
  sprintf( __( 'A job listing has been updated on <a href="%s">%s</a>.', 'wp-job-manager' ), home_url(), esc_html( get_bloginfo( 'name' ) ) ) );
27
  switch ( $job->post_status ) {
28
  case 'publish':
30
  break;
31
  case 'pending':
32
  echo wp_kses_post( sprintf(
33
+ // translators: Placeholder %s is the admin job listings URL.
34
  ' ' . __( 'The job listing is not publicly available until the changes are approved by an administrator in the site\'s <a href="%s">WordPress admin</a>.', 'wp-job-manager' ),
35
  esc_url( admin_url( 'edit.php?post_type=job_listing' ) )
36
  ) );
templates/emails/employer-expiring-job.php CHANGED
@@ -29,6 +29,7 @@ echo '<p>';
29
  if ( $expiring_today ) {
30
  echo wp_kses_post(
31
  sprintf(
 
32
  __( 'The following job listing is expiring today from <a href="%s">%s</a>.', 'wp-job-manager' ),
33
  home_url(),
34
  get_bloginfo( 'name' )
@@ -37,6 +38,7 @@ if ( $expiring_today ) {
37
  } else {
38
  echo wp_kses_post(
39
  sprintf(
 
40
  __( 'The following job listing is expiring soon from <a href="%s">%s</a>.', 'wp-job-manager' ),
41
  home_url(),
42
  get_bloginfo( 'name' )
@@ -45,6 +47,7 @@ if ( $expiring_today ) {
45
  }
46
  echo wp_kses_post(
47
  sprintf(
 
48
  ' ' . __( 'Visit the <a href="%s">job listing dashboard</a> to manage the listing.', 'wp-job-manager' ),
49
  esc_url( job_manager_get_permalink( 'job_dashboard' ) )
50
  )
29
  if ( $expiring_today ) {
30
  echo wp_kses_post(
31
  sprintf(
32
+ // translators: %1$s placeholder is URL to the blog. %2$s placeholder is the name of the site.
33
  __( 'The following job listing is expiring today from <a href="%s">%s</a>.', 'wp-job-manager' ),
34
  home_url(),
35
  get_bloginfo( 'name' )
38
  } else {
39
  echo wp_kses_post(
40
  sprintf(
41
+ // translators: %1$s placeholder is URL to the blog. %2$s placeholder is the name of the site.
42
  __( 'The following job listing is expiring soon from <a href="%s">%s</a>.', 'wp-job-manager' ),
43
  home_url(),
44
  get_bloginfo( 'name' )
47
  }
48
  echo wp_kses_post(
49
  sprintf(
50
+ // translators: Placeholder %s is the job listing dashboard URL.
51
  ' ' . __( 'Visit the <a href="%s">job listing dashboard</a> to manage the listing.', 'wp-job-manager' ),
52
  esc_url( job_manager_get_permalink( 'job_dashboard' ) )
53
  )
templates/emails/plain/admin-expiring-job.php CHANGED
@@ -27,19 +27,22 @@ $expiring_today = $args['expiring_today'];
27
 
28
  if ( $expiring_today ) {
29
  printf(
30
- esc_html__( 'The following job listing is expiring today from %s (%s).', 'wp-job-manager' ),
 
31
  esc_html( get_bloginfo( 'name' ) ),
32
  esc_url( home_url() )
33
  );
34
  } else {
35
  printf(
36
- esc_html__( 'The following job listing is expiring soon from %s (%s).', 'wp-job-manager' ),
 
37
  esc_html( get_bloginfo( 'name' ) ),
38
  esc_url( home_url() )
39
  );
40
  }
41
  $edit_post_link = admin_url( sprintf( 'post.php?post=%d&amp;action=edit', $job->ID ) );
42
  printf(
 
43
  ' ' . esc_html__( 'Visit WordPress admin (%s) to manage the listing.', 'wp-job-manager' ),
44
  esc_url( $edit_post_link )
45
  );
27
 
28
  if ( $expiring_today ) {
29
  printf(
30
+ // translators: %1$s placeholder is the name of the site, %2$s placeholder is URL to the blog.
31
+ esc_html__( 'The following job listing is expiring today from %1$s (%2$s).', 'wp-job-manager' ),
32
  esc_html( get_bloginfo( 'name' ) ),
33
  esc_url( home_url() )
34
  );
35
  } else {
36
  printf(
37
+ // translators: %1$s placeholder is the name of the site, %2$s placeholder is URL to the blog.
38
+ esc_html__( 'The following job listing is expiring soon from %1$s (%2$s).', 'wp-job-manager' ),
39
  esc_html( get_bloginfo( 'name' ) ),
40
  esc_url( home_url() )
41
  );
42
  }
43
  $edit_post_link = admin_url( sprintf( 'post.php?post=%d&amp;action=edit', $job->ID ) );
44
  printf(
45
+ // translators: Placeholder %s is the edit job URL.
46
  ' ' . esc_html__( 'Visit WordPress admin (%s) to manage the listing.', 'wp-job-manager' ),
47
  esc_url( $edit_post_link )
48
  );
templates/emails/plain/admin-new-job.php CHANGED
@@ -20,12 +20,14 @@ if ( ! defined( 'ABSPATH' ) ) {
20
  */
21
  $job = $args['job'];
22
 
23
- printf( esc_html__( 'A new job listing has been submitted to %s (%s).', 'wp-job-manager' ), esc_html( get_bloginfo( 'name' ) ), esc_url( home_url() ) );
 
24
  switch ( $job->post_status ) {
25
  case 'publish':
26
  printf( ' ' . esc_html__( 'It has been published and is now available to the public.', 'wp-job-manager' ) );
27
  break;
28
  case 'pending':
 
29
  printf( ' ' . esc_html__( 'It is awaiting approval by an administrator in WordPress admin (%s).', 'wp-job-manager' ), esc_url( admin_url( 'edit.php?post_type=job_listing' ) ) );
30
  break;
31
  }
20
  */
21
  $job = $args['job'];
22
 
23
+ // translators: %1$s placeholder is the name of the site, %2$s placeholder is URL to the blog.
24
+ printf( esc_html__( 'A new job listing has been submitted to %1$s (%2$s).', 'wp-job-manager' ), esc_html( get_bloginfo( 'name' ) ), esc_url( home_url() ) );
25
  switch ( $job->post_status ) {
26
  case 'publish':
27
  printf( ' ' . esc_html__( 'It has been published and is now available to the public.', 'wp-job-manager' ) );
28
  break;
29
  case 'pending':
30
+ // translators: Placeholder %s is the admin job listings URL.
31
  printf( ' ' . esc_html__( 'It is awaiting approval by an administrator in WordPress admin (%s).', 'wp-job-manager' ), esc_url( admin_url( 'edit.php?post_type=job_listing' ) ) );
32
  break;
33
  }
templates/emails/plain/admin-updated-job.php CHANGED
@@ -20,12 +20,14 @@ if ( ! defined( 'ABSPATH' ) ) {
20
  */
21
  $job = $args['job'];
22
 
23
- printf( esc_html__( 'A job listing has been updated on %s (%s).', 'wp-job-manager' ), esc_html( get_bloginfo( 'name' ) ), esc_url( home_url() ) );
 
24
  switch ( $job->post_status ) {
25
  case 'publish':
26
  printf( ' ' . esc_html__( 'The changes have been published and are now available to the public.', 'wp-job-manager' ) );
27
  break;
28
  case 'pending':
 
29
  printf( ' ' . esc_html__( 'The job listing is not publicly available until the changes are approved by an administrator in the site\'s WordPress admin (%s).', 'wp-job-manager' ), esc_url( admin_url( 'edit.php?post_type=job_listing' ) ) );
30
  break;
31
  }
20
  */
21
  $job = $args['job'];
22
 
23
+ // translators: %1$s placeholder is the name of the site, %2$s placeholder is URL to the blog.
24
+ printf( esc_html__( 'A job listing has been updated on %1$s (%2$s).', 'wp-job-manager' ), esc_html( get_bloginfo( 'name' ) ), esc_url( home_url() ) );
25
  switch ( $job->post_status ) {
26
  case 'publish':
27
  printf( ' ' . esc_html__( 'The changes have been published and are now available to the public.', 'wp-job-manager' ) );
28
  break;
29
  case 'pending':
30
+ // translators: Placeholder %s is the admin job listings URL.
31
  printf( ' ' . esc_html__( 'The job listing is not publicly available until the changes are approved by an administrator in the site\'s WordPress admin (%s).', 'wp-job-manager' ), esc_url( admin_url( 'edit.php?post_type=job_listing' ) ) );
32
  break;
33
  }
templates/emails/plain/employer-expiring-job.php CHANGED
@@ -26,10 +26,13 @@ $job = $args['job'];
26
  $expiring_today = $args['expiring_today'];
27
 
28
  if ( $expiring_today ) {
29
- printf( esc_html__( 'The following job listing is expiring today from %s (%s).', 'wp-job-manager' ), esc_html( get_bloginfo( 'name' ) ), esc_url( home_url() ) );
 
30
  } else {
31
- printf( esc_html__( 'The following job listing is expiring soon from %s (%s).', 'wp-job-manager' ), esc_html( get_bloginfo( 'name' ) ), esc_url( home_url() ) );
 
32
  }
 
33
  printf( ' ' . esc_html__( 'Visit the job listing dashboard (%s) to manage the listing.', 'wp-job-manager' ), esc_url( job_manager_get_permalink( 'job_dashboard' ) ) );
34
 
35
  /**
26
  $expiring_today = $args['expiring_today'];
27
 
28
  if ( $expiring_today ) {
29
+ // translators: %1$s placeholder is the name of the site, %2$s placeholder is URL to the blog.
30
+ printf( esc_html__( 'The following job listing is expiring today from %1$s (%2$s).', 'wp-job-manager' ), esc_html( get_bloginfo( 'name' ) ), esc_url( home_url() ) );
31
  } else {
32
+ // translators: %1$s placeholder is the name of the site, %2$s placeholder is URL to the blog.
33
+ printf( esc_html__( 'The following job listing is expiring soon from %1$s (%2$s).', 'wp-job-manager' ), esc_html( get_bloginfo( 'name' ) ), esc_url( home_url() ) );
34
  }
35
+ // translators: Placeholder %s is the job listing dashboard URL.
36
  printf( ' ' . esc_html__( 'Visit the job listing dashboard (%s) to manage the listing.', 'wp-job-manager' ), esc_url( job_manager_get_permalink( 'job_dashboard' ) ) );
37
 
38
  /**
templates/form-fields/wp-editor-field.php CHANGED
@@ -15,24 +15,29 @@ if ( ! defined( 'ABSPATH' ) ) {
15
  exit; // Exit if accessed directly.
16
  }
17
 
18
- $editor = apply_filters( 'submit_job_form_wp_editor_args', [
19
- 'textarea_name' => isset( $field['name'] ) ? $field['name'] : $key,
20
- 'media_buttons' => false,
21
- 'textarea_rows' => 8,
22
- 'quicktags' => false,
23
- 'tinymce' => [
24
- 'plugins' => 'lists,paste,tabfocus,wplink,wordpress',
25
- 'paste_as_text' => true,
26
- 'paste_auto_cleanup_on_paste' => true,
27
- 'paste_remove_spans' => true,
28
- 'paste_remove_styles' => true,
29
- 'paste_remove_styles_if_webkit' => true,
30
- 'paste_strip_class_attributes' => true,
31
- 'toolbar1' => 'bold,italic,|,bullist,numlist,|,link,unlink,|,undo,redo',
32
- 'toolbar2' => '',
33
- 'toolbar3' => '',
34
- 'toolbar4' => ''
35
- ],
36
- ] );
 
 
 
 
37
  wp_editor( isset( $field['value'] ) ? wp_kses_post( $field['value'] ) : '', $key, $editor );
38
- if ( ! empty( $field['description'] ) ) : ?><small class="description"><?php echo wp_kses_post( $field['description'] ); ?></small><?php endif; ?>
 
15
  exit; // Exit if accessed directly.
16
  }
17
 
18
+ $editor = apply_filters(
19
+ 'submit_job_form_wp_editor_args',
20
+ [
21
+ 'textarea_name' => isset( $field['name'] ) ? $field['name'] : $key,
22
+ 'media_buttons' => false,
23
+ 'textarea_rows' => 8,
24
+ 'quicktags' => false,
25
+ 'editor_css' => '<style> .mce-top-part button { background-color: rgba(0,0,0,0.0) !important; } </style>',
26
+ 'tinymce' => [
27
+ 'plugins' => 'lists,paste,tabfocus,wplink,wordpress',
28
+ 'paste_as_text' => true,
29
+ 'paste_auto_cleanup_on_paste' => true,
30
+ 'paste_remove_spans' => true,
31
+ 'paste_remove_styles' => true,
32
+ 'paste_remove_styles_if_webkit' => true,
33
+ 'paste_strip_class_attributes' => true,
34
+ 'toolbar1' => 'bold,italic,|,bullist,numlist,|,link,unlink,|,undo,redo',
35
+ 'toolbar2' => '',
36
+ 'toolbar3' => '',
37
+ 'toolbar4' => '',
38
+ ],
39
+ ]
40
+ );
41
  wp_editor( isset( $field['value'] ) ? wp_kses_post( $field['value'] ) : '', $key, $editor );
42
+ if ( ! empty( $field['description'] ) ) :
43
+ ?><small class="description"><?php echo wp_kses_post( $field['description'] ); ?></small><?php endif; ?>
templates/job-application-email.php CHANGED
@@ -15,4 +15,5 @@ if ( ! defined( 'ABSPATH' ) ) {
15
  exit; // Exit if accessed directly.
16
  }
17
  ?>
 
18
  <p><?php printf( wp_kses_post( __( 'To apply for this job <strong>email your details to</strong> <a class="job_application_email" href="mailto:%1$s%2$s">%1$s</a>', 'wp-job-manager' ) ), esc_html( $apply->email ), '?subject=' . rawurlencode( $apply->subject ) ); ?></p>
15
  exit; // Exit if accessed directly.
16
  }
17
  ?>
18
+ <?php // translators: %1$s is the email address, %2$s is the subject query args. ?>
19
  <p><?php printf( wp_kses_post( __( 'To apply for this job <strong>email your details to</strong> <a class="job_application_email" href="mailto:%1$s%2$s">%1$s</a>', 'wp-job-manager' ) ), esc_html( $apply->email ), '?subject=' . rawurlencode( $apply->subject ) ); ?></p>
templates/job-submitted.php CHANGED
@@ -21,7 +21,8 @@ switch ( $job->post_status ) :
21
  case 'publish' :
22
  echo '<div class="job-manager-message">' . wp_kses_post(
23
  sprintf(
24
- __( '%s listed successfully. To view your listing <a href="%s">click here</a>.', 'wp-job-manager' ),
 
25
  esc_html( $wp_post_types['job_listing']->labels->singular_name ),
26
  get_permalink( $job->ID )
27
  )
@@ -30,6 +31,7 @@ switch ( $job->post_status ) :
30
  case 'pending' :
31
  echo '<div class="job-manager-message">' . wp_kses_post(
32
  sprintf(
 
33
  esc_html__( '%s submitted successfully. Your listing will be visible once approved.', 'wp-job-manager' ),
34
  esc_html( $wp_post_types['job_listing']->labels->singular_name )
35
  )
21
  case 'publish' :
22
  echo '<div class="job-manager-message">' . wp_kses_post(
23
  sprintf(
24
+ // translators: %1$s is the job listing post type name, %2$s is the job listing URL.
25
+ __( '%1$s listed successfully. To view your listing <a href="%2$s">click here</a>.', 'wp-job-manager' ),
26
  esc_html( $wp_post_types['job_listing']->labels->singular_name ),
27
  get_permalink( $job->ID )
28
  )
31
  case 'pending' :
32
  echo '<div class="job-manager-message">' . wp_kses_post(
33
  sprintf(
34
+ // translators: Placeholder %s is the job listing post type name.
35
  esc_html__( '%s submitted successfully. Your listing will be visible once approved.', 'wp-job-manager' ),
36
  esc_html( $wp_post_types['job_listing']->labels->singular_name )
37
  )
templates/pagination.php CHANGED
@@ -21,6 +21,15 @@ if ( $max_num_pages <= 1 ) {
21
  ?>
22
  <nav class="job-manager-pagination">
23
  <?php
 
 
 
 
 
 
 
 
 
24
  echo paginate_links( apply_filters( 'job_manager_pagination_args', [
25
  'base' => esc_url_raw( str_replace( 999999999, '%#%', get_pagenum_link( 999999999, false ) ) ),
26
  'format' => '',
21
  ?>
22
  <nav class="job-manager-pagination">
23
  <?php
24
+ /**
25
+ * Filter the paginated link for WP Job Manager catalog pages.
26
+ *
27
+ * @see https://codex.wordpress.org/Function_Reference/paginate_links
28
+ *
29
+ * @since 1.4.0
30
+ *
31
+ * @param array $args The pagination arguments.
32
+ */
33
  echo paginate_links( apply_filters( 'job_manager_pagination_args', [
34
  'base' => esc_url_raw( str_replace( 999999999, '%#%', get_pagenum_link( 999999999, false ) ) ),
35
  'format' => '',
wp-job-manager-functions.php CHANGED
@@ -1053,6 +1053,49 @@ function wpjm_published_submission_edits_require_moderation() {
1053
  return apply_filters( 'job_manager_published_submission_edits_require_moderation', $require_moderation );
1054
  }
1055
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1056
  /**
1057
  * Displays category select dropdown.
1058
  *
@@ -1094,6 +1137,10 @@ function job_manager_dropdown_categories( $args = '' ) {
1094
  $r['pad_counts'] = true;
1095
  }
1096
 
 
 
 
 
1097
  /** This filter is documented in wp-job-manager.php */
1098
  $r['lang'] = apply_filters( 'wpjm_lang', null );
1099
 
@@ -1102,18 +1149,26 @@ function job_manager_dropdown_categories( $args = '' ) {
1102
  $categories = get_transient( $categories_hash );
1103
 
1104
  if ( empty( $categories ) ) {
1105
- $categories = get_terms(
1106
- [
1107
- 'taxonomy' => $r['taxonomy'],
1108
- 'orderby' => $r['orderby'],
1109
- 'order' => $r['order'],
1110
- 'hide_empty' => $r['hide_empty'],
1111
- 'parent' => $r['parent'],
1112
- 'child_of' => $r['child_of'],
1113
- 'exclude' => $r['exclude'],
1114
- 'hierarchical' => $r['hierarchical'],
1115
- ]
1116
- );
 
 
 
 
 
 
 
 
1117
  set_transient( $categories_hash, $categories, DAY_IN_SECONDS * 7 );
1118
  }
1119
 
1053
  return apply_filters( 'job_manager_published_submission_edits_require_moderation', $require_moderation );
1054
  }
1055
 
1056
+ /**
1057
+ * Get the category slugs from the search query string.
1058
+ * The query string is made with the category slugs separate by commas.
1059
+ *
1060
+ * @since 1.34.2
1061
+ *
1062
+ * @return string[] $search_category_slugs Array of category slugs.
1063
+ */
1064
+ function wpjm_get_category_slugs_from_search_query_string() {
1065
+ $search_category_slugs = [];
1066
+
1067
+ if ( isset( $_GET['search_category'] ) && $_GET['search_category'] ) {
1068
+ $search_category_slugs = explode( ',', sanitize_text_field( wp_unslash( $_GET['search_category'] ) ) );
1069
+ }
1070
+
1071
+ return $search_category_slugs;
1072
+ }
1073
+
1074
+ /**
1075
+ * Get categories by slug.
1076
+ *
1077
+ * @since 1.34.2
1078
+ *
1079
+ * @param string[] $search_category_slugs Array of category slugs to search.
1080
+ * @param array $default_args Default args to search the term categories.
1081
+ * @param WP_Term[] $exclude_categories Array of categories to exclude.
1082
+ *
1083
+ * @return WP_Term[] $categories Array of categories.
1084
+ */
1085
+ function wpjm_get_categories_by_slug( $search_category_slugs, $default_args, $exclude_categories ) {
1086
+ $exclude_category_ids = wp_list_pluck( $exclude_categories, 'term_id' );
1087
+
1088
+ $args = [
1089
+ 'hide_empty' => false,
1090
+ 'slug' => $search_category_slugs,
1091
+ 'exclude' => $exclude_category_ids,
1092
+ ];
1093
+
1094
+ $args = wp_parse_args( $args, $default_args );
1095
+
1096
+ return get_terms( $args );
1097
+ }
1098
+
1099
  /**
1100
  * Displays category select dropdown.
1101
  *
1137
  $r['pad_counts'] = true;
1138
  }
1139
 
1140
+ if ( ! isset( $r['search_category_slugs'] ) ) {
1141
+ $r['search_category_slugs'] = wpjm_get_category_slugs_from_search_query_string();
1142
+ }
1143
+
1144
  /** This filter is documented in wp-job-manager.php */
1145
  $r['lang'] = apply_filters( 'wpjm_lang', null );
1146
 
1149
  $categories = get_transient( $categories_hash );
1150
 
1151
  if ( empty( $categories ) ) {
1152
+ $args = [
1153
+ 'taxonomy' => $r['taxonomy'],
1154
+ 'orderby' => $r['orderby'],
1155
+ 'order' => $r['order'],
1156
+ 'hide_empty' => $r['hide_empty'],
1157
+ 'parent' => $r['parent'],
1158
+ 'child_of' => $r['child_of'],
1159
+ 'exclude' => $r['exclude'],
1160
+ 'hierarchical' => $r['hierarchical'],
1161
+ ];
1162
+
1163
+ $categories = get_terms( $args );
1164
+
1165
+ if ( ! empty( $r['search_category_slugs'] ) ) {
1166
+ $categories = array_merge(
1167
+ $categories,
1168
+ wpjm_get_categories_by_slug( $r['search_category_slugs'], $args, $categories )
1169
+ );
1170
+ }
1171
+
1172
  set_transient( $categories_hash, $categories, DAY_IN_SECONDS * 7 );
1173
  }
1174
 
wp-job-manager.php CHANGED
@@ -3,7 +3,7 @@
3
  * Plugin Name: WP Job Manager
4
  * Plugin URI: https://wpjobmanager.com/
5
  * Description: Manage job listings from the WordPress admin panel, and allow users to post jobs directly to your site.
6
- * Version: 1.34.1
7
  * Author: Automattic
8
  * Author URI: https://wpjobmanager.com/
9
  * Requires at least: 4.9
@@ -21,7 +21,7 @@ if ( ! defined( 'ABSPATH' ) ) {
21
  }
22
 
23
  // Define constants.
24
- define( 'JOB_MANAGER_VERSION', '1.34.1' );
25
  define( 'JOB_MANAGER_PLUGIN_DIR', untrailingslashit( plugin_dir_path( __FILE__ ) ) );
26
  define( 'JOB_MANAGER_PLUGIN_URL', untrailingslashit( plugins_url( basename( plugin_dir_path( __FILE__ ) ), basename( __FILE__ ) ) ) );
27
  define( 'JOB_MANAGER_PLUGIN_BASENAME', plugin_basename( __FILE__ ) );
3
  * Plugin Name: WP Job Manager
4
  * Plugin URI: https://wpjobmanager.com/
5
  * Description: Manage job listings from the WordPress admin panel, and allow users to post jobs directly to your site.
6
+ * Version: 1.34.2
7
  * Author: Automattic
8
  * Author URI: https://wpjobmanager.com/
9
  * Requires at least: 4.9
21
  }
22
 
23
  // Define constants.
24
+ define( 'JOB_MANAGER_VERSION', '1.34.2' );
25
  define( 'JOB_MANAGER_PLUGIN_DIR', untrailingslashit( plugin_dir_path( __FILE__ ) ) );
26
  define( 'JOB_MANAGER_PLUGIN_URL', untrailingslashit( plugins_url( basename( plugin_dir_path( __FILE__ ) ), basename( __FILE__ ) ) ) );
27
  define( 'JOB_MANAGER_PLUGIN_BASENAME', plugin_basename( __FILE__ ) );