WP Job Manager - Version 1.39.0

Version Description

  • Enhancement: Download first-party plugin extension translations
  • Enhancement: Add integration to Yoast SEO schema (@jdevalk)
  • Fix: Make salary placeholder string translatable
Download this release

Release Info

Developer jakeom
Plugin Icon 128x128 WP Job Manager
Version 1.39.0
Comparing to
See all releases

Code changes from version 1.38.1 to 1.39.0

changelog.txt CHANGED
@@ -1,3 +1,8 @@
 
 
 
 
 
1
  = 1.38.1 =
2
  * Enhancement: Added support for WordPress.com marketplace
3
  * Change: Only perform application field validation when required or not empty (@tripflex)
1
+ = 1.39.0 =
2
+ * Enhancement: Download first-party plugin extension translations
3
+ * Enhancement: Add integration to Yoast SEO schema (@jdevalk)
4
+ * Fix: Make salary placeholder string translatable
5
+
6
  = 1.38.1 =
7
  * Enhancement: Added support for WordPress.com marketplace
8
  * Change: Only perform application field validation when required or not empty (@tripflex)
includes/3rd-party/yoast.php CHANGED
@@ -27,3 +27,19 @@ function wpjm_yoast_skip_filled_job_listings( $url, $type, $post ) {
27
  return $url;
28
  }
29
  add_action( 'wpseo_sitemap_entry', 'wpjm_yoast_skip_filled_job_listings', 10, 3 );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27
  return $url;
28
  }
29
  add_action( 'wpseo_sitemap_entry', 'wpjm_yoast_skip_filled_job_listings', 10, 3 );
30
+
31
+ /**
32
+ * Links schema to Yoast SEO schema if Yoast SEO is loaded.
33
+ *
34
+ * @param array $data The schema data.
35
+ *
36
+ * @return array The schema data.
37
+ */
38
+ function wpjm_link_schema_to_yoast_schema( $data ) {
39
+ if ( function_exists( 'YoastSEO' ) ) {
40
+ $data['mainEntityOfPage'] = [ '@id' => YoastSEO()->meta->for_current_page()->canonical ];
41
+ $data['identifier']['value'] = YoastSEO()->meta->for_current_page()->canonical;
42
+ }
43
+ return $data;
44
+ }
45
+ add_filter( 'wpjm_get_job_listing_structured_data', 'wpjm_link_schema_to_yoast_schema' );
includes/class-wp-job-manager-post-types.php CHANGED
@@ -1599,7 +1599,7 @@ class WP_Job_Manager_Post_Types {
1599
  '_job_salary' => [
1600
  'label' => __( 'Salary', 'wp-job-manager' ),
1601
  'type' => 'text',
1602
- 'placeholder' => 'e.g. 20000',
1603
  'priority' => 13,
1604
  'description' => __( 'Add a salary field, this field is optional.', 'wp-job-manager' ),
1605
  'data_type' => 'string',
1599
  '_job_salary' => [
1600
  'label' => __( 'Salary', 'wp-job-manager' ),
1601
  'type' => 'text',
1602
+ 'placeholder' => __( 'e.g. 20000', 'wp-job-manager' ),
1603
  'priority' => 13,
1604
  'description' => __( 'Add a salary field, this field is optional.', 'wp-job-manager' ),
1605
  'data_type' => 'string',
includes/forms/class-wp-job-manager-form-submit-job.php CHANGED
@@ -269,7 +269,7 @@ class WP_Job_Manager_Form_Submit_Job extends WP_Job_Manager_Form {
269
  'label' => __( 'Salary', 'wp-job-manager' ),
270
  'type' => 'text',
271
  'required' => false,
272
- 'placeholder' => 'e.g. 20000',
273
  'priority' => 8,
274
  ],
275
  'job_salary_currency' => [
269
  'label' => __( 'Salary', 'wp-job-manager' ),
270
  'type' => 'text',
271
  'required' => false,
272
+ 'placeholder' => __( 'e.g. 20000', 'wp-job-manager' ),
273
  'priority' => 8,
274
  ],
275
  'job_salary_currency' => [
includes/helper/class-wp-job-manager-helper-language-packs.php ADDED
@@ -0,0 +1,189 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * File containing the class WP_Job_Manager_Helper_Language_Packs.
4
+ *
5
+ * @package wp-job-manager
6
+ */
7
+
8
+ if ( ! defined( 'ABSPATH' ) ) {
9
+ exit;
10
+ }
11
+
12
+ /**
13
+ * WP_Job_Manager_Helper_Language_Packs
14
+ */
15
+ class WP_Job_Manager_Helper_Language_Packs {
16
+ const TRANSLATION_UPDATES_URL = 'https://translate.wordpress.com/api/translations-updates/wp-job-manager';
17
+ const REMOTE_PACKAGE_TRANSIENT = 'wp-job-manager-translations-';
18
+
19
+ /**
20
+ * The plugin versions, keyed with the plugin slug.
21
+ *
22
+ * @var string[]
23
+ */
24
+ private $plugin_versions;
25
+
26
+ /**
27
+ * Locales to manage language packs for.
28
+ *
29
+ * @var string[]
30
+ */
31
+ private $locales;
32
+
33
+ /**
34
+ * Request cache of the language pack updates available.
35
+ *
36
+ * @var array|null
37
+ */
38
+ private $language_pack_updates_cache;
39
+
40
+ /**
41
+ * Class constructor.
42
+ *
43
+ * @param array[] $plugin_versions Plugin versions, keyed by plugin slug.
44
+ * @param string[] $locales Locales to manage language packs for.
45
+ */
46
+ public function __construct( array $plugin_versions, array $locales ) {
47
+ $this->plugin_versions = $plugin_versions;
48
+ $this->locales = $locales;
49
+
50
+ if ( empty( $plugin_versions ) || empty( $locales ) ) {
51
+ return;
52
+ }
53
+
54
+ add_filter( 'site_transient_update_plugins', [ $this, 'add_updated_translations' ] );
55
+ }
56
+
57
+ /**
58
+ * Adds the plugin's language pack updates to the `update_plugins` transient.
59
+ *
60
+ * @internal
61
+ *
62
+ * @param \stdClass $transient Current value of `update_plugins` transient.
63
+ * @return \stdClass
64
+ */
65
+ public function add_updated_translations( $transient ) {
66
+ if ( empty( $transient ) ) {
67
+ return $transient;
68
+ }
69
+
70
+ /**
71
+ * Allows for disabling language packs downloading.
72
+ *
73
+ * @since 1.39.0
74
+ *
75
+ * @param bool $disable_language_packs Whether to disable language packs. Default false.
76
+ */
77
+ if ( apply_filters( 'wp_job_manager_helper_disable_language_packs', false ) ) {
78
+ return $transient;
79
+ }
80
+
81
+ $translations = $this->get_language_pack_updates();
82
+ $transient->translations = array_merge( $transient->translations ?? [], $translations );
83
+
84
+ return $transient;
85
+ }
86
+
87
+ /**
88
+ * Get translations updates from our translation pack server.
89
+ *
90
+ * @return array Update data {plugin_slug => data}
91
+ */
92
+ private function get_language_pack_updates() {
93
+ if ( ! is_null( $this->language_pack_updates_cache ) ) {
94
+ return $this->language_pack_updates_cache;
95
+ }
96
+
97
+ if ( empty( $this->plugin_versions ) || empty( $this->locales ) ) {
98
+ return [];
99
+ }
100
+
101
+ // Check if we've cached this in the last day.
102
+ $transient_key = self::REMOTE_PACKAGE_TRANSIENT . md5( wp_json_encode( [ $this->plugin_versions, $this->locales ] ) );
103
+ $data = get_site_transient( $transient_key );
104
+ if ( false !== $data && is_array( $data ) ) {
105
+ return $this->parse_language_pack_translations( $data );
106
+ }
107
+
108
+ // Set the timeout for the request.
109
+ $timeout = 5;
110
+ if ( wp_doing_cron() ) {
111
+ $timeout = 30;
112
+ }
113
+
114
+ $plugins = [];
115
+ foreach ( $this->plugin_versions as $slug => $plugin_version ) {
116
+ $plugins[ $slug ] = [ 'version' => $plugin_version ];
117
+ }
118
+
119
+ $request_body = [
120
+ 'locales' => $this->locales,
121
+ 'plugins' => $plugins,
122
+ ];
123
+
124
+ $raw_response = wp_remote_post(
125
+ self::TRANSLATION_UPDATES_URL,
126
+ [
127
+ 'body' => wp_json_encode( $request_body ),
128
+ 'headers' => [ 'Content-Type: application/json' ],
129
+ 'timeout' => $timeout,
130
+ ]
131
+ );
132
+
133
+ // Something unexpected happened on the translation server side.
134
+ $response_code = wp_remote_retrieve_response_code( $raw_response );
135
+ if ( 200 !== $response_code ) {
136
+ return [];
137
+ }
138
+
139
+ $response = json_decode( wp_remote_retrieve_body( $raw_response ), true );
140
+ // API error, api returned but something was wrong.
141
+ if ( array_key_exists( 'success', $response ) && false === $response['success'] ) {
142
+ return [];
143
+ }
144
+
145
+ $this->language_pack_updates_cache = $this->parse_language_pack_translations( $response['data'] );
146
+ set_site_transient( $transient_key, $response['data'], DAY_IN_SECONDS );
147
+
148
+ return $this->language_pack_updates_cache;
149
+ }
150
+
151
+ /**
152
+ * Parse the language pack translations.
153
+ *
154
+ * @param array $update_data Update data from translate.wordpress.com.
155
+ *
156
+ * @return array
157
+ */
158
+ private function parse_language_pack_translations( $update_data ) {
159
+ $installed_translations = wp_get_installed_translations( 'plugins' );
160
+ $translations = [];
161
+
162
+ foreach ( $update_data as $plugin_name => $language_packs ) {
163
+ foreach ( $language_packs as $language_pack ) {
164
+ // Maybe we have this language pack already installed so lets check revision date.
165
+ if ( array_key_exists( $plugin_name, $installed_translations ) && array_key_exists( $language_pack['wp_locale'], $installed_translations[ $plugin_name ] ) ) {
166
+ $installed_translation_revision_time = new \DateTime( $installed_translations[ $plugin_name ][ $language_pack['wp_locale'] ]['PO-Revision-Date'] );
167
+ $new_translation_revision_time = new \DateTime( $language_pack['last_modified'] );
168
+
169
+ // Skip if translation language pack is not newer than what is installed already.
170
+ if ( $new_translation_revision_time <= $installed_translation_revision_time ) {
171
+ continue;
172
+ }
173
+ }
174
+
175
+ $translations[] = [
176
+ 'type' => 'plugin',
177
+ 'slug' => $plugin_name,
178
+ 'language' => $language_pack['wp_locale'],
179
+ 'version' => $language_pack['version'],
180
+ 'updated' => $language_pack['last_modified'],
181
+ 'package' => $language_pack['package'],
182
+ 'autoupdate' => true,
183
+ ];
184
+ }
185
+ }
186
+
187
+ return $translations;
188
+ }
189
+ }
includes/helper/class-wp-job-manager-helper.php CHANGED
@@ -30,6 +30,13 @@ class WP_Job_Manager_Helper {
30
  */
31
  protected $api;
32
 
 
 
 
 
 
 
 
33
  /**
34
  * The single instance of the class.
35
  *
@@ -66,6 +73,7 @@ class WP_Job_Manager_Helper {
66
  public function init() {
67
  include_once dirname( __FILE__ ) . '/class-wp-job-manager-helper-options.php';
68
  include_once dirname( __FILE__ ) . '/class-wp-job-manager-helper-api.php';
 
69
 
70
  $this->api = WP_Job_Manager_Helper_API::instance();
71
 
@@ -85,11 +93,55 @@ class WP_Job_Manager_Helper {
85
  * Initializes admin-only actions.
86
  */
87
  public function admin_init() {
 
88
  add_action( 'plugin_action_links', [ $this, 'plugin_links' ], 10, 2 );
89
  add_action( 'admin_notices', [ $this, 'licence_error_notices' ] );
90
  $this->handle_admin_request();
91
  }
92
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
93
  /**
94
  * Handles special tasks on admin requests.
95
  */
@@ -171,22 +223,20 @@ class WP_Job_Manager_Helper {
171
  */
172
  private function get_plugin_version( $plugin_filename ) {
173
  $plugin_data = $this->get_licence_managed_plugin( $plugin_filename );
174
- if ( ! $plugin_data ) {
175
  return false;
176
  }
 
177
  $product_slug = $plugin_data['_product_slug'];
178
  $licence = $this->get_plugin_licence( $product_slug );
179
- if ( ! $licence || empty( $licence['licence_key'] ) ) {
180
- return false;
181
- }
182
 
183
  $response = $this->api->plugin_update_check(
184
  [
185
  'plugin_name' => $plugin_data['Name'],
186
  'version' => $plugin_data['Version'],
187
  'api_product_id' => $product_slug,
188
- 'licence_key' => $licence['licence_key'],
189
- 'email' => $licence['email'],
190
  ]
191
  );
192
 
@@ -594,7 +644,7 @@ class WP_Job_Manager_Helper {
594
  }
595
 
596
  $errors = ! empty( $response['errors'] ) ? $response['errors'] : [];
597
- $allowed_errors = [ 'no_activation', 'expired_key', 'expiring_soon' ];
598
  $ignored_errors = array_diff( array_keys( $errors ), $allowed_errors );
599
 
600
  foreach ( $ignored_errors as $key ) {
30
  */
31
  protected $api;
32
 
33
+ /**
34
+ * Language Pack helper.
35
+ *
36
+ * @var WP_Job_Manager_Helper_Language_Packs
37
+ */
38
+ private $language_pack_helper;
39
+
40
  /**
41
  * The single instance of the class.
42
  *
73
  public function init() {
74
  include_once dirname( __FILE__ ) . '/class-wp-job-manager-helper-options.php';
75
  include_once dirname( __FILE__ ) . '/class-wp-job-manager-helper-api.php';
76
+ include_once dirname( __FILE__ ) . '/class-wp-job-manager-helper-language-packs.php';
77
 
78
  $this->api = WP_Job_Manager_Helper_API::instance();
79
 
93
  * Initializes admin-only actions.
94
  */
95
  public function admin_init() {
96
+ $this->load_language_pack_helper();
97
  add_action( 'plugin_action_links', [ $this, 'plugin_links' ], 10, 2 );
98
  add_action( 'admin_notices', [ $this, 'licence_error_notices' ] );
99
  $this->handle_admin_request();
100
  }
101
 
102
+ /**
103
+ * Load the language pack helper.
104
+ */
105
+ private function load_language_pack_helper() {
106
+ if ( $this->language_pack_helper ) {
107
+ return;
108
+ }
109
+
110
+ $this->language_pack_helper = new WP_Job_Manager_Helper_Language_Packs( $this->get_plugin_versions(), $this->get_site_locales() );
111
+ }
112
+
113
+ /**
114
+ * Get the versions for the installed managed plugins, keyed with the plugin slug.
115
+ *
116
+ * @return string[]
117
+ */
118
+ private function get_plugin_versions() {
119
+ return array_filter(
120
+ array_map(
121
+ function( $plugin ) {
122
+ return $plugin['Version'];
123
+ },
124
+ $this->get_installed_plugins( false )
125
+ )
126
+ );
127
+ }
128
+
129
+ /**
130
+ * Get the locales used in the site.
131
+ *
132
+ * @return string[]
133
+ */
134
+ private function get_site_locales() {
135
+ $locales = array_values( get_available_languages() );
136
+
137
+ /** This action is documented in WordPress core's wp-includes/update.php */
138
+ // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound
139
+ $locales = apply_filters( 'plugins_update_check_locales', $locales );
140
+ $locales = array_unique( $locales );
141
+
142
+ return $locales;
143
+ }
144
+
145
  /**
146
  * Handles special tasks on admin requests.
147
  */
223
  */
224
  private function get_plugin_version( $plugin_filename ) {
225
  $plugin_data = $this->get_licence_managed_plugin( $plugin_filename );
226
+ if ( ! $plugin_data || empty( $plugin_data['_product_slug'] ) ) {
227
  return false;
228
  }
229
+
230
  $product_slug = $plugin_data['_product_slug'];
231
  $licence = $this->get_plugin_licence( $product_slug );
 
 
 
232
 
233
  $response = $this->api->plugin_update_check(
234
  [
235
  'plugin_name' => $plugin_data['Name'],
236
  'version' => $plugin_data['Version'],
237
  'api_product_id' => $product_slug,
238
+ 'licence_key' => $licence['licence_key'] ?? null,
239
+ 'email' => $licence['email'] ?? null,
240
  ]
241
  );
242
 
644
  }
645
 
646
  $errors = ! empty( $response['errors'] ) ? $response['errors'] : [];
647
+ $allowed_errors = [ 'no_activation', 'expired_key', 'expiring_soon', 'update_available' ];
648
  $ignored_errors = array_diff( array_keys( $errors ), $allowed_errors );
649
 
650
  foreach ( $ignored_errors as $key ) {
languages/wp-job-manager.pot CHANGED
@@ -2,16 +2,16 @@
2
  # This file is distributed under the GPL2+.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: WP Job Manager 1.38.1\n"
6
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-job-manager/\n"
7
  "Last-Translator: \n"
8
  "Language-Team: \n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
- "POT-Creation-Date: 2022-10-25T15:40:11+00:00\n"
13
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
14
- "X-Generator: WP-CLI 2.7.1\n"
15
  "X-Domain: wp-job-manager\n"
16
 
17
  #. Plugin Name of the plugin
@@ -1556,6 +1556,11 @@ msgstr ""
1556
  msgid "Select if this is a remote position."
1557
  msgstr ""
1558
 
 
 
 
 
 
1559
  #: includes/class-wp-job-manager-post-types.php:1604
1560
  msgid "Add a salary field, this field is optional."
1561
  msgstr ""
@@ -1917,42 +1922,42 @@ msgstr ""
1917
  msgid "Draft was saved. Job listing drafts can be resumed from the <a href=\"%s\">job dashboard</a>."
1918
  msgstr ""
1919
 
1920
- #: includes/helper/class-wp-job-manager-helper.php:279
1921
  msgid "Manage License (Requires Attention)"
1922
  msgstr ""
1923
 
1924
- #: includes/helper/class-wp-job-manager-helper.php:282
1925
- #: tests/php/tests/includes/helper/test_class.wp-job-manager-helper.php:262
1926
  msgid "Manage License"
1927
  msgstr ""
1928
 
1929
- #: includes/helper/class-wp-job-manager-helper.php:285
1930
  #: includes/helper/views/html-licences.php:76
1931
- #: tests/php/tests/includes/helper/test_class.wp-job-manager-helper.php:278
1932
  msgid "Activate License"
1933
  msgstr ""
1934
 
1935
- #: includes/helper/class-wp-job-manager-helper.php:494
1936
  msgid "Please enter a valid license key and email address in order to activate this plugin's license."
1937
  msgstr ""
1938
 
1939
- #: includes/helper/class-wp-job-manager-helper.php:526
1940
  msgid "Connection failed to the License Key API server - possible server issue."
1941
  msgstr ""
1942
 
1943
- #: includes/helper/class-wp-job-manager-helper.php:535
1944
  msgid "Plugin license has been activated."
1945
  msgstr ""
1946
 
1947
- #: includes/helper/class-wp-job-manager-helper.php:538
1948
  msgid "An unknown error occurred while attempting to activate the license"
1949
  msgstr ""
1950
 
1951
- #: includes/helper/class-wp-job-manager-helper.php:558
1952
  msgid "license is not active."
1953
  msgstr ""
1954
 
1955
- #: includes/helper/class-wp-job-manager-helper.php:574
1956
  msgid "Plugin license has been deactivated."
1957
  msgstr ""
1958
 
2
  # This file is distributed under the GPL2+.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: WP Job Manager 1.39.0\n"
6
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-job-manager/\n"
7
  "Last-Translator: \n"
8
  "Language-Team: \n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
+ "POT-Creation-Date: 2022-12-13T10:58:37+00:00\n"
13
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
14
+ "X-Generator: WP-CLI 2.6.0\n"
15
  "X-Domain: wp-job-manager\n"
16
 
17
  #. Plugin Name of the plugin
1556
  msgid "Select if this is a remote position."
1557
  msgstr ""
1558
 
1559
+ #: includes/class-wp-job-manager-post-types.php:1602
1560
+ #: includes/forms/class-wp-job-manager-form-submit-job.php:272
1561
+ msgid "e.g. 20000"
1562
+ msgstr ""
1563
+
1564
  #: includes/class-wp-job-manager-post-types.php:1604
1565
  msgid "Add a salary field, this field is optional."
1566
  msgstr ""
1922
  msgid "Draft was saved. Job listing drafts can be resumed from the <a href=\"%s\">job dashboard</a>."
1923
  msgstr ""
1924
 
1925
+ #: includes/helper/class-wp-job-manager-helper.php:329
1926
  msgid "Manage License (Requires Attention)"
1927
  msgstr ""
1928
 
1929
+ #: includes/helper/class-wp-job-manager-helper.php:332
1930
+ #: tests/php/tests/includes/helper/test_class.wp-job-manager-helper.php:243
1931
  msgid "Manage License"
1932
  msgstr ""
1933
 
1934
+ #: includes/helper/class-wp-job-manager-helper.php:335
1935
  #: includes/helper/views/html-licences.php:76
1936
+ #: tests/php/tests/includes/helper/test_class.wp-job-manager-helper.php:259
1937
  msgid "Activate License"
1938
  msgstr ""
1939
 
1940
+ #: includes/helper/class-wp-job-manager-helper.php:544
1941
  msgid "Please enter a valid license key and email address in order to activate this plugin's license."
1942
  msgstr ""
1943
 
1944
+ #: includes/helper/class-wp-job-manager-helper.php:576
1945
  msgid "Connection failed to the License Key API server - possible server issue."
1946
  msgstr ""
1947
 
1948
+ #: includes/helper/class-wp-job-manager-helper.php:585
1949
  msgid "Plugin license has been activated."
1950
  msgstr ""
1951
 
1952
+ #: includes/helper/class-wp-job-manager-helper.php:588
1953
  msgid "An unknown error occurred while attempting to activate the license"
1954
  msgstr ""
1955
 
1956
+ #: includes/helper/class-wp-job-manager-helper.php:608
1957
  msgid "license is not active."
1958
  msgstr ""
1959
 
1960
+ #: includes/helper/class-wp-job-manager-helper.php:624
1961
  msgid "Plugin license has been deactivated."
1962
  msgstr ""
1963
 
readme.txt CHANGED
@@ -2,9 +2,9 @@
2
  Contributors: mikejolley, automattic, adamkheckler, alexsanford1, annezazu, cena, chaselivingston, csonnek, davor.altman, donnapep, donncha, drawmyface, erania-pinnera, fjorgemota, jacobshere, jakeom, jeherve, jenhooks, jgs, jonryan, kraftbj, lamdayap, lschuyler, macmanx, nancythanki, orangesareorange, rachelsquirrel, renathoc, ryancowles, richardmtl, scarstocea
3
  Tags: job manager, job listing, job board, job management, job lists, job list, job, jobs, company, hiring, employment, employer, employees, candidate, freelance, internship, job listings, positions, board, application, hiring, listing, manager, recruiting, recruitment, talent
4
  Requires at least: 5.8
5
- Tested up to: 6.0
6
  Requires PHP: 7.2
7
- Stable tag: 1.38.1
8
  License: GPLv3
9
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
10
 
@@ -153,6 +153,11 @@ It then creates a database based on the parameters passed to it.
153
 
154
  == Changelog ==
155
 
 
 
 
 
 
156
  = 1.38.1 =
157
  * Enhancement: Added support for WordPress.com marketplace
158
  * Change: Only perform application field validation when required or not empty (@tripflex)
2
  Contributors: mikejolley, automattic, adamkheckler, alexsanford1, annezazu, cena, chaselivingston, csonnek, davor.altman, donnapep, donncha, drawmyface, erania-pinnera, fjorgemota, jacobshere, jakeom, jeherve, jenhooks, jgs, jonryan, kraftbj, lamdayap, lschuyler, macmanx, nancythanki, orangesareorange, rachelsquirrel, renathoc, ryancowles, richardmtl, scarstocea
3
  Tags: job manager, job listing, job board, job management, job lists, job list, job, jobs, company, hiring, employment, employer, employees, candidate, freelance, internship, job listings, positions, board, application, hiring, listing, manager, recruiting, recruitment, talent
4
  Requires at least: 5.8
5
+ Tested up to: 6.1
6
  Requires PHP: 7.2
7
+ Stable tag: 1.39.0
8
  License: GPLv3
9
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
10
 
153
 
154
  == Changelog ==
155
 
156
+ = 1.39.0 =
157
+ * Enhancement: Download first-party plugin extension translations
158
+ * Enhancement: Add integration to Yoast SEO schema (@jdevalk)
159
+ * Fix: Make salary placeholder string translatable
160
+
161
  = 1.38.1 =
162
  * Enhancement: Added support for WordPress.com marketplace
163
  * Change: Only perform application field validation when required or not empty (@tripflex)
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.38.1
7
  * Author: Automattic
8
  * Author URI: https://wpjobmanager.com/
9
  * Requires at least: 5.8
@@ -21,7 +21,7 @@ if ( ! defined( 'ABSPATH' ) ) {
21
  }
22
 
23
  // Define constants.
24
- define( 'JOB_MANAGER_VERSION', '1.38.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.39.0
7
  * Author: Automattic
8
  * Author URI: https://wpjobmanager.com/
9
  * Requires at least: 5.8
21
  }
22
 
23
  // Define constants.
24
+ define( 'JOB_MANAGER_VERSION', '1.39.0' );
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__ ) );