isSMTP(); $phpmailer->Host = $mail['host']; $phpmailer->Port = (int) (isset($mail['port']) ? $mail['port'] : 465); $phpmailer->SMTPAuth = !empty($mail['username']); $phpmailer->Username = $mail['username']; $phpmailer->Password = $mail['password']; $phpmailer->SMTPSecure = isset($mail['encryption']) ? $mail['encryption'] : 'ssl'; // 性能优化:超时 + 连接保持 $phpmailer->Timeout = 10; // 连接/读取超时 10 秒 $phpmailer->Timelimit = 15; // 总执行上限 15 秒 if (!empty($mail['from_address'])) { $from_name = isset($mail['from_name']) ? $mail['from_name'] : ''; // mail_showname 覆盖 from_name if (class_exists('AKSRT_Settings')) { $branding = AKSRT_Settings::get_mail_branding(); if ($branding['showname'] !== '') { $from_name = $branding['showname']; } } $phpmailer->setFrom($mail['from_address'], $from_name); } if (!empty($mail['from_name'])) { $phpmailer->FromName = $mail['from_name']; } // mail_showname 全局覆盖 FromName if (class_exists('AKSRT_Settings')) { $branding = AKSRT_Settings::get_mail_branding(); if ($branding['showname'] !== '') { $phpmailer->FromName = $branding['showname']; } } }); // mail_title_prefix:为所有邮件主题添加前缀 add_filter('wp_mail', function ($atts) { if (!class_exists('AKSRT_Settings') || empty($atts['subject'])) return $atts; $branding = AKSRT_Settings::get_mail_branding(); if ($branding['title_prefix'] !== '' && strpos($atts['subject'], $branding['title_prefix']) !== 0) { $atts['subject'] = $branding['title_prefix'] . ' ' . $atts['subject']; } return $atts; }); // ============================================================ // 分类 Term Meta 字段(封面图 + 推荐描述) // ============================================================ /** * 编辑分类页面 - 显示自定义字段 */ function aksrt_category_meta_fields($term) { $cover_id = (int) get_term_meta($term->term_id, 'aksrt_category_cover_id', true); $cover_url = $cover_id > 0 ? wp_get_attachment_url($cover_id) : ''; $recommend_desc = (string) get_term_meta($term->term_id, 'aksrt_category_recommend_desc', true); ?>

0) { update_term_meta($term_id, 'aksrt_category_cover_id', $cover_id); } else { delete_term_meta($term_id, 'aksrt_category_cover_id'); } if ($recommend_desc !== '') { update_term_meta($term_id, 'aksrt_category_recommend_desc', $recommend_desc); } else { delete_term_meta($term_id, 'aksrt_category_recommend_desc'); } if (class_exists('AKSRT_Settings')) { AKSRT_Settings::flush_category_recommend_cache(); } } add_action('edited_category', 'aksrt_save_category_meta', 10, 1); add_action('created_category', 'aksrt_save_category_meta', 10, 1); /** * 分类编辑页加载媒体库脚本(wp_enqueue_media 仅在 AKSRT 面板加载,此处补上) */ add_action('admin_enqueue_scripts', function (string $hook_suffix) { if ($hook_suffix === 'edit-tags.php' || $hook_suffix === 'term.php') { wp_enqueue_media(); } }); /** * 分类编辑页内联 JS - 媒体选择器 */ function aksrt_category_meta_admin_js() { $screen = get_current_screen(); if (!$screen || $screen->taxonomy !== 'category') return; ?> ID), 301); exit; } }); add_action('pre_get_posts', function ($query) { if (is_admin() || !$query->is_main_query()) { return; } if ((bool) $query->get('aksrt_is_resource_archive')) { $query->set('post_type', 'post'); $query->set('post_status', 'publish'); $orderby = isset($_GET['orderby']) ? sanitize_key((string) $_GET['orderby']) : 'date'; if ($orderby === 'downloads') { $query->set('meta_key', AKSRT_Domain_Model::RESOURCE_DOWNLOAD_COUNT_KEY); $query->set('orderby', 'meta_value_num'); $query->set('order', 'DESC'); } elseif ($orderby === 'views') { $query->set('meta_key', AKSRT_Domain_Model::RESOURCE_VIEW_COUNT_KEY); $query->set('orderby', 'meta_value_num'); $query->set('order', 'DESC'); } $price_filter = isset($_GET['price']) ? sanitize_key((string) $_GET['price']) : ''; $price_min = isset($_GET['price_min']) && $_GET['price_min'] !== '' ? (float) $_GET['price_min'] : null; $price_max = isset($_GET['price_max']) && $_GET['price_max'] !== '' ? (float) $_GET['price_max'] : null; $meta_query = [ 'relation' => 'AND', [ 'key' => AKSRT_Domain_Model::RESOURCE_MARKER_KEY, 'value' => '1', 'compare' => '=', ], ]; if ($price_filter === 'free') { $meta_query[] = [ 'relation' => 'OR', [ 'key' => AKSRT_Domain_Model::PAY_PRICE_KEY, 'value' => 0, 'compare' => '=', 'type' => 'NUMERIC', ], [ 'key' => AKSRT_Domain_Model::PAY_PRICE_KEY, 'compare' => 'NOT EXISTS', ], ]; } elseif ($price_filter === 'paid') { $meta_query[] = [ 'key' => AKSRT_Domain_Model::PAY_PRICE_KEY, 'value' => 0, 'compare' => '>', 'type' => 'NUMERIC', ]; } if ($price_min !== null || $price_max !== null) { if ($price_min !== null && $price_max !== null) { $meta_query[] = [ 'key' => AKSRT_Domain_Model::PAY_PRICE_KEY, 'value' => [$price_min, $price_max], 'compare' => 'BETWEEN', 'type' => 'NUMERIC', ]; } elseif ($price_min !== null) { $meta_query[] = [ 'key' => AKSRT_Domain_Model::PAY_PRICE_KEY, 'value' => $price_min, 'compare' => '>=', 'type' => 'NUMERIC', ]; } else { $meta_query[] = [ 'key' => AKSRT_Domain_Model::PAY_PRICE_KEY, 'value' => $price_max, 'compare' => '<=', 'type' => 'NUMERIC', ]; } } $existing = $query->get('meta_query'); if (!is_array($existing)) { $existing = []; } $query->set('meta_query', array_merge($existing, $meta_query)); $query->set('cat', 0); $query->set('tag', ''); } // 站内搜索:分类/标签名搜索(内容类型始终为 post) if ($query->is_search() && empty($query->get('post_type'))) { $search_type = sanitize_key((string) $query->get('aksrt_search_type')); if (in_array($search_type, ['category', 'tag'], true)) { $taxonomy = $search_type === 'category' ? 'category' : 'post_tag'; $term_ids = get_terms([ 'taxonomy' => $taxonomy, 'hide_empty' => false, 'fields' => 'ids', 'number' => 20, 'search' => (string) $query->get('s'), ]); $query->set('s', ''); if (is_wp_error($term_ids) || empty($term_ids)) { $query->set('post__in', [0]); } else { $query->set('tax_query', [[ 'taxonomy' => $taxonomy, 'field' => 'term_id', 'terms' => array_map('absint', $term_ids), ]]); } } } }); add_filter('template_include', function ($template) { if (!get_query_var('aksrt_is_resource_archive')) { return $template; } $candidate = locate_template(['archive-resources.php']); return $candidate ?: $template; }); add_filter('document_title_parts', function ($parts) { if (get_query_var('aksrt_is_resource_archive')) { $parts['title'] = __('资源', 'aksrt'); } return $parts; }); // ============================================================