wpslug/includes/class-wpslug-validator.php
feibisi 2f929ed571 feat: 添加语义化拼音模式 (Semantic Pinyin)
- 新增 semantic_pinyin 转换模式
- 使用 WPMind AI 按词语分隔拼音
- 添加 convertSemanticPinyin() 方法
- WPMind 不可用时自动回退普通拼音
2026-02-02 11:59:47 +08:00

203 lines
No EOL
6.5 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
if (!defined('ABSPATH')) {
exit;
}
class WPSlug_Validator {
public static function validateBoolean($value) {
if (is_bool($value)) {
return $value;
}
if (is_string($value)) {
return ($value === '1' || strtolower($value) === 'true');
}
if (is_numeric($value)) {
return (int)$value === 1;
}
return false;
}
public static function validateInteger($value, $min = null, $max = null) {
$int_value = intval($value);
if ($min !== null && $int_value < $min) {
return $min;
}
if ($max !== null && $int_value > $max) {
return $max;
}
return $int_value;
}
public static function validateString($value, $max_length = 200) {
$string_value = sanitize_text_field($value);
if (strlen($string_value) > $max_length) {
return substr($string_value, 0, $max_length);
}
return $string_value;
}
public static function validateTextarea($value) {
return sanitize_textarea_field($value);
}
public static function validateArray($value, $default = array()) {
if (!is_array($value)) {
return $default;
}
$sanitized = array_map('sanitize_text_field', $value);
$filtered = array_filter($sanitized);
return array_slice($filtered, 0, 50);
}
public static function validateSelect($value, $valid_options, $default) {
return in_array($value, $valid_options, true) ? $value : $default;
}
public static function validateApiKey($value) {
return self::validateString($value, 200);
}
public static function validateSlug($slug) {
if (empty($slug)) {
return false;
}
if (strlen($slug) > 200) {
return false;
}
if (preg_match('/[^a-zA-Z0-9\-_\p{Han}]/u', $slug)) {
return false;
}
return true;
}
public static function validateLanguageCode($code) {
$valid_codes = array(
'auto', 'zh', 'zh-TW', 'en', 'es', 'fr', 'de', 'ja', 'ko', 'ru',
'ar', 'it', 'pt', 'nl', 'pl', 'tr', 'sv', 'da', 'no', 'fi', 'cs',
'hu', 'ro', 'bg', 'hr', 'sk', 'sl', 'et', 'lv', 'lt', 'mt', 'el', 'cy'
);
return in_array($code, $valid_codes, true) ? $code : 'auto';
}
public static function validatePostTypes($post_types) {
if (!is_array($post_types)) {
return array('post', 'page');
}
$all_post_types = get_post_types(array('public' => true));
$validated = array();
foreach ($post_types as $post_type) {
if (in_array($post_type, $all_post_types)) {
$validated[] = $post_type;
}
}
return empty($validated) ? array('post', 'page') : $validated;
}
public static function validateTaxonomies($taxonomies) {
if (!is_array($taxonomies)) {
return array('category', 'post_tag');
}
$all_taxonomies = get_taxonomies(array('public' => true));
$validated = array();
foreach ($taxonomies as $taxonomy) {
if (in_array($taxonomy, $all_taxonomies)) {
$validated[] = $taxonomy;
}
}
return empty($validated) ? array('category', 'post_tag') : $validated;
}
public static function validateConversionMode($mode) {
$valid_modes = array('pinyin', 'semantic_pinyin', 'transliteration', 'translation');
return self::validateSelect($mode, $valid_modes, 'pinyin');
}
public static function validateTranslationService($service) {
// 注意wpmind 服务需要在此列表中才能保存
$valid_services = array('none', 'google', 'baidu', 'wpmind');
return self::validateSelect($service, $valid_services, 'none');
}
public static function validateTransliterationMethod($method) {
$valid_methods = array('basic', 'iconv', 'intl');
return self::validateSelect($method, $valid_methods, 'basic');
}
public static function hasRequiredApiCredentials($options) {
$errors = array();
if ($options['conversion_mode'] === 'translation') {
$service = $options['translation_service'];
if ($service === 'google' && empty($options['google_api_key'])) {
$errors[] = __('Google API key is required for Google Translate service.', 'wpslug');
}
if ($service === 'baidu' && (empty($options['baidu_app_id']) || empty($options['baidu_secret_key']))) {
$errors[] = __('Baidu App ID and Secret Key are required for Baidu Translate service.', 'wpslug');
}
// WPMind 需要已配置
if ($service === 'wpmind') {
if (!function_exists('wpmind_is_available')) {
$errors[] = __('WPMind plugin is not installed.', 'wpslug');
} elseif (!wpmind_is_available()) {
$errors[] = __('WPMind is not configured. Please configure it in WPMind settings.', 'wpslug');
}
}
}
return empty($errors) ? true : $errors;
}
public static function validateSystemRequirements() {
$requirements = array(
'php_version' => version_compare(PHP_VERSION, '7.0', '>='),
'wordpress_version' => version_compare(get_bloginfo('version'), '5.0', '>='),
'mbstring_extension' => extension_loaded('mbstring'),
'json_extension' => extension_loaded('json')
);
$errors = array();
if (!$requirements['php_version']) {
$errors[] = __('PHP 7.0 or higher is required.', 'wpslug');
}
if (!$requirements['wordpress_version']) {
$errors[] = __('WordPress 5.0 or higher is required.', 'wpslug');
}
if (!$requirements['mbstring_extension']) {
$errors[] = __('PHP mbstring extension is required.', 'wpslug');
}
if (!$requirements['json_extension']) {
$errors[] = __('PHP JSON extension is required.', 'wpslug');
}
return empty($errors) ? true : $errors;
}
}