if ($args['search'] !== '' && is_string($args['search'])) { $options['search']['ACTONOMY']['OPTIONS']['sort'] = [ 'SCORE' => 'DESC', 'public_publish_date' => 'DESC' ]; } // Create OWS request $vacanciesRequest = [ "method" => "Otys.Services.VacancyService.getListEx", "params" => [ $options ] ]; // Do OWS API Call $vacanciesListResult = OtysApi::post($vacanciesRequest, $args['cache']); if (is_wp_error($vacanciesListResult)) { return $vacanciesListResult; } // If something went wrong and list output is not available, return a empty result if (!$vacanciesListResult || !isset($vacanciesListResult['listOutput'])) { return new WP_Error('vacancy_error', __('Could not retrieve vacancy list', 'otys-jobs-apply')); } // Get vacancy textfields $textFields = VacanciesDetailModel::getTextFields(); $customSlugIsActive = Routes::customSlugIsActive(); /* * Manipulate result */ foreach ($vacanciesListResult['listOutput'] as $key => $vacancy) { // Add textfields $vacanciesListResult['listOutput'][$key]['textFields'] = []; if (!is_wp_error($textFields) && !empty($textFields) && is_array($textFields)) { // Add textfields to result foreach ($textFields as $textField) { if (!isset($vacancy[$textField['owsName']])) { continue; } if ($textField['published']) { $vacanciesListResult['listOutput'][$key]['textFields'][$textField['owsName']] = [ 'title' => $vacancy[$textField['owsName']]['title'], 'text' => ($vacancy[$textField['owsName']]['text']) === null ? '' : $vacancy[$textField['owsName']]['text'] ]; } if ($vacancy[$textField['owsName']]['text'] == null) { $vacanciesListResult['listOutput'][$key][$textField['owsName']]['text'] = ''; } } } // Add apply url's $vacanciesListResult['listOutput'][$key]['url'] = Routes::get('vacancy-detail', [ 'slug' => $customSlugIsActive ? $vacancy['slug'][$website] : sanitize_title($vacancy['title']) . '-' . $vacancy['uid'] ]); $vacanciesListResult['listOutput'][$key]['applyUrl'] = Routes::get('vacancy-apply', [ 'slug' => $customSlugIsActive ? $vacancy['slug'][$website] : sanitize_title($vacancy['title']) . '-' . $vacancy['uid'] ]); // Check if there is a photo present and add a new variable including the entire url $vacanciesListResult['listOutput'][$key]['photoUrl'] = (isset($vacancy['photoFileName']) && $vacancy['photoFileName']) ? OtysApi::getImageUploadUrl() . $vacancy['photoFileName'] : null; // Add extra textfields to result $extraTextFieldsResult = []; foreach ($extraFields as $extraTextField) { $extraTextFieldsResult['extraInfo' . $extraTextField['fieldnum']] = $extraTextField; $extraTextFieldsResult['extraInfo' . $extraTextField['fieldnum']]['value'] = (string) $vacancy['extraInfo' . $extraTextField['fieldnum']]; } $vacanciesListResult['listOutput'][$key]['extraTextFields'] = $extraTextFieldsResult; // Add labels $vacanciesListResult['listOutput'][$key]['labels'] = []; if (isset($vacancy['matchCriteriaNames']) && is_array($vacancyLabels) && !empty($vacancyLabels)) { foreach ($vacancyLabels as $vacancyLabel) { // Add criteria if (strpos($vacancyLabel, 'C_') !== false) { $vacancyNameKey = str_replace('C_', 'matchCriteria_', $vacancyLabel); $criteriaName = array_key_exists($vacancyNameKey, $vacancy['matchCriteriaNames']) ? $vacancy['matchCriteriaNames'][$vacancyNameKey] : $vacancyLabel; $vacanciesListResult['listOutput'][$key]['labels'][$vacancyLabel] = [ 'name' => $criteriaName, 'values' => $vacancy[$vacancyNameKey] ]; } // Add categorie if ($vacancyLabel === 'category' && isset($vacancy['category']) && $vacancy['category'] !== NULL) { $vacanciesListResult['listOutput'][$key]['labels'][$vacancyLabel] = [ 'name' => __('Category', 'otys-jobs-apply'), 'values' => [$vacancy['category']] ]; } } } // Add image url's to gallery items if (isset($vacancy['PhotoGallery']) && !empty($vacancy['PhotoGallery'])) { foreach ($vacancy['PhotoGallery'] as $galleryKey => $galleryItem) { $vacanciesListResult['listOutput'][$key]['PhotoGallery'][$galleryKey]['photoUrl'] = OtysApi::getImageUploadUrl() . $galleryItem['photo']; $vacanciesListResult['listOutput'][$key]['PhotoGallery'][$galleryKey]['thumbnailUrl'] = OtysApi::getImageUploadUrl() . $galleryItem['thumbnail']; } } } return $vacanciesListResult; } /** * Get labels which should be shown * * @return array */ private static function getLabelsToShow(): array { $settingName = 'otys_option_vacancies_list_match_criteria_labels'; if (($matchCriteriaToShow = get_option($settingName, false)) === false || !is_array($matchCriteriaToShow)) { return []; } $filteredValues = array_filter($matchCriteriaToShow, function ($val) { return $val === 'true'; }); return is_array($filteredValues) ? array_keys($filteredValues) : []; } /** * Get extra fields for vacancies * * @return array|WP_Error */ public static function getExtraFields() { // Get current WordPress language $language = OtysApi::getLanguage(); // Define request $request = [ "method" => "Otys.Services.VacancyService.getExtraFieldsList", "params" => [ $language ] ]; // Do request $response = OtysApi::post($request, true, false); return $response; } /** * Summary of getListFilterAtts * @param mixed $atts * @return void */ public function getListFilterAtts(array $atts) { } /** * Validate shortcode attributes * * @param $params Params to be validated * @param $filtersAsArray Wheter to return the filter options as array * @return array * @since 1.0.0 */ public static function validateAtts(array $params = []): array { // Get validation for filters $filterValidation = VacanciesFiltersModel::getFiltersValidation(); // Add default validation $validationRules = array_merge_recursive( $filterValidation, [ 'search' => [ 'filter' => FILTER_CALLBACK, 'options' => function ($value) { if (!is_string($value) || $value === '') { return false; } return urldecode($value); } ], 'pc' => [ 'filter' => FILTER_CALLBACK, 'options' => function ($value) { if (!is_string($value) || $value === '') { return false; } return stripslashes($value); } ], 'pcm' => [ 'filter' => FILTER_VALIDATE_INT, 'options' => ['min_range' => 1, 'max_range' => 1000] ], 'premium' => FILTER_VALIDATE_BOOLEAN, 'perpage' => [ 'filter' => FILTER_VALIDATE_INT, 'options' => ['min_range' => 1, 'max_range' => 250] ], 'relation' => FILTER_SANITIZE_ENCODED, ] ); return static::doSanitiziation($params, $validationRules); } /** * Validate url parameters * * @param $params Params to be validated * @param $filtersAsArray Wheter to return the filter options as array * @return array * @since 1.0.0 */ public static function validateUrlParams(array $params = []): array { // Get validation for filters $filterValidation = VacanciesFiltersModel::getFiltersValidation(); // Add default validation $validationRules = array_merge_recursive( $filterValidation, [ 'search' => [ 'filter' => FILTER_CALLBACK, 'options' => function ($value) { if (!is_string($value) || $value === '') { return false; } return stripslashes(urldecode($value)); } ], 'pc' => [ 'filter' => FILTER_CALLBACK, 'options' => function ($value) { if (!is_string($value) || $value === '') { return false; } return stripslashes(urldecode($value)); }, ], 'pcm' => [ 'filter' => FILTER_VALIDATE_INT, 'options' => ['min_range' => 1, 'max_range' => 1000] ], 'plo' => [ 'filter' => FILTER_CALLBACK, 'options' => function ($option) { if (!is_string($option)) { return false; } return (array_key_exists($option, VacanciesGeoSearchModel::getCountries())) ? $option : false; } ], 'page-number' => [ 'filter' => FILTER_VALIDATE_INT, 'options' => ['min_range' => 1, 'max_range' => static::$maxPageNumbers] ] ] ); return static::doSanitiziation($params, $validationRules); } /** * Get attributes from [otys-vacancies-list] on the current global $post * * @return array Returns array of attributes if given */ public static function getAtts(): array { $atts = static::getShortcodeAttributes('otys-vacancies-list'); return $atts; } }