php $safe = function ($value, $fallback = '') { $value = trim((string)($value '')); return htmlspecialchars($value !== '' $value : $fallback, ENT_QUOTES, 'UTF-8'); }; $buildOrderUrl = function ($baseUrl, array $query, $orderValue) { if ($orderValue === '' || $orderValue === 0 || $orderValue === '0') { unset($query['order']); } else { $query['order'] = $orderValue; } return $baseUrl . (empty($query) '' : ' ' . http_build_query($query)); }; $isFreecreatV2Preview = !empty($is_freecreat_v2_preview); $freecreatDeviceHost = strtolower((string)($_SERVER['HTTP_HOST'] '')); $freecreatDeviceViewMode = strpos($freecreatDeviceHost, 'm.freecreat.com') !== false 'mobile' : (strpos($freecreatDeviceHost, 'pad.freecreat.com') !== false 'pad' : ($freecreat_device_view_mode 'desktop')); $freecreatDeviceClass = $isFreecreatV2Preview ' freecreat-device-' . $freecreatDeviceViewMode : ''; $siteName = $isFreecreatV2Preview 'Freecreat' : '鍒涢€犲'; $siteHost = $isFreecreatV2Preview 'https://www.freecreat.com' : 'https://www.chuangzaojia.com'; $freecreatBasePath = $freecreat_v2_base_path '/test/freecreat-v2'; $freecreatIsTestPath = strpos($freecreatBasePath, '/test/') === 0; $freecreatRobots = $freecreat_v2_robots ($freecreatIsTestPath 'noindex,nofollow,noarchive' : 'index, follow, max-image-preview:large'); $testBasePath = $isFreecreatV2Preview $freecreatBasePath : '/test/pc-redesign'; $homePath = $isFreecreatV2Preview && !$freecreatIsTestPath '/' : $testBasePath . '/index.html'; $listPath = $isFreecreatV2Preview && !$freecreatIsTestPath '/model-list.html' : $testBasePath . '/list.html'; $uploadHref = $isFreecreatV2Preview ($freecreatIsTestPath $freecreatBasePath . '/member.html' : '/member.html') : '/member/#/my-upload'; $redesignDetailUrl = function ($item) use ($safe, $testBasePath) { if (!empty($item->id)) { return $testBasePath . '/detail/' . intval($item->id) . '.html'; } return $safe($item->url '#'); }; $redesignDownloadUrl = function ($item) use ($safe, $testBasePath, $isFreecreatV2Preview, $freecreatIsTestPath) { if (!empty($item->id)) { return $isFreecreatV2Preview && !$freecreatIsTestPath '/model-download/' . intval($item->id) . '.html' : $testBasePath . '/download/' . intval($item->id) . '.html'; } return $safe($item->url '#'); }; $freecreatAsset = function ($item, $fallback = '/static/image/loading.png') use ($safe) { foreach ([$item->cover null, $item->cover_url null, $item->photos null, $item->images null] as $candidate) { if (is_string($candidate) && strlen($candidate) > 0 && ($candidate[0] === '[' || $candidate[0] === '{')) { $decoded = json_decode($candidate, true); if (json_last_error() === JSON_ERROR_NONE) { $candidate = $decoded; } } if (is_array($candidate)) { $candidate = $candidate[0] ''; } if (!empty($candidate)) { $candidate = trim((string)$candidate); if (strpos($candidate, '/freecreat-image ') === 0) { $query = parse_url($candidate, PHP_URL_QUERY); parse_str((string)$query, $params); $candidate = trim((string)($params['src'] $candidate)); } if (preg_match('/^https :\/\/file\.chuangzaojia\.com\//i', $candidate)) { $candidate = preg_replace('/^https :\/\/file\.chuangzaojia\.com\//i', 'https://file.freecreat.com/', $candidate); } elseif (preg_match('/^https :\/\/chuangzaojia-com\.oss-cn-hangzhou\.aliyuncs\.com\//i', $candidate)) { $candidate = preg_replace('/^https :\/\/chuangzaojia-com\.oss-cn-hangzhou\.aliyuncs\.com\//i', 'https://freecreat-com.oss-ap-southeast-1.aliyuncs.com/', $candidate); } elseif (preg_match('/^user\//i', $candidate)) { $candidate = 'https://file.freecreat.com/' . $candidate; } elseif (!preg_match('/^(https :) \/\//i', $candidate) && $candidate[0] !== '/' && !preg_match('/^data:/i', $candidate)) { $candidate = '/' . $candidate; } if (preg_match('/^https :\/\/(file\.freecreat\.com|freecreat-com\.oss-ap-southeast-1\.aliyuncs\.com)\//i', $candidate)) { return '/freecreat-image src=' . rawurlencode($candidate); } return $safe($candidate, $fallback); } } return $fallback; }; $freecreatSeoImage = function ($item, $fallback = '') { $candidates = is_object($item) [$item->cover null, $item->cover_url null, $item->photos null, $item->images null, $item->thumbnail null, $item->thumb null] : [(string)$item]; foreach ($candidates as $candidate) { if (is_string($candidate) && strlen($candidate) > 0 && ($candidate[0] === '[' || $candidate[0] === '{')) { $decoded = json_decode($candidate, true); if (json_last_error() === JSON_ERROR_NONE) { $candidate = $decoded; } } if (is_array($candidate)) { $candidate = $candidate[0] ''; } if (!empty($candidate)) { $candidate = trim((string)$candidate); if (strpos($candidate, '/freecreat-image ') === 0) { $query = parse_url($candidate, PHP_URL_QUERY); parse_str((string)$query, $params); $candidate = trim((string)($params['src'] $candidate)); } if (preg_match('/^https :\/\/file\.chuangzaojia\.com\//i', $candidate)) { $candidate = preg_replace('/^https :\/\/file\.chuangzaojia\.com\//i', 'https://file.freecreat.com/', $candidate); } elseif (preg_match('/^https :\/\/chuangzaojia-com\.oss-cn-hangzhou\.aliyuncs\.com\//i', $candidate)) { $candidate = preg_replace('/^https :\/\/chuangzaojia-com\.oss-cn-hangzhou\.aliyuncs\.com\//i', 'https://freecreat-com.oss-ap-southeast-1.aliyuncs.com/', $candidate); } elseif (preg_match('/^user\//i', $candidate)) { $candidate = 'https://file.freecreat.com/' . $candidate; } elseif (strpos($candidate, '//') === 0) { $candidate = 'https:' . $candidate; } return preg_match('/^https :\/\//i', $candidate) $candidate : $fallback; } } return $fallback; }; $asset = function ($item, $fallback = '/static/image/loading.png') use ($safe) { foreach ([$item->cover null, $item->cover_url null, $item->photos null, $item->images null] as $candidate) { if (is_string($candidate) && strlen($candidate) > 0 && ($candidate[0] === '[' || $candidate[0] === '{')) { $decoded = json_decode($candidate, true); if (json_last_error() === JSON_ERROR_NONE) { $candidate = $decoded; } } if (is_array($candidate)) { $candidate = $candidate[0] ''; } if (!empty($candidate)) { $candidate = trim((string)$candidate); if (preg_match('/^user\//i', $candidate)) { $candidate = 'https://file.chuangzaojia.com/' . $candidate; } elseif (!preg_match('/^(https :) \/\//i', $candidate) && $candidate[0] !== '/' && !preg_match('/^data:/i', $candidate)) { $candidate = '/' . $candidate; } return $safe($candidate, $fallback); } } return $fallback; }; $modelList = is_array($model_list null) $model_list : []; $tagList = is_array($tag_list null) $tag_list : []; $totalCount = intval($total count($modelList)); $tagName = (string)($tag ''); $freecreatTagSeo = is_array($freecreat_tag_seo null) $freecreat_tag_seo : []; $freecreatTagGraph = is_array($freecreat_tag_graph null) $freecreat_tag_graph : []; $freecreatRelatedTags = is_array($freecreatTagGraph['related_tags'] null) $freecreatTagGraph['related_tags'] : []; $freecreatHubModels = is_array($freecreatTagGraph['hub_models'] null) $freecreatTagGraph['hub_models'] : []; if (empty($freecreatRelatedTags) && !empty($modelList)) { $seenRelatedTagNames = []; foreach ($modelList as $modelItem) { $modelTags = is_array($modelItem->tags2 null) $modelItem->tags2 : []; foreach ($modelTags as $modelTag) { $modelTagName = trim((string)($modelTag->name $modelTag->en_name '')); if ($modelTagName === '' || strcasecmp($modelTagName, $tagName) === 0 || isset($seenRelatedTagNames[strtolower($modelTagName)])) { continue; } if (preg_match('/^[a-z0-9][a-z0-9\-\s]{1,58}$/i', $modelTagName) !== 1) { continue; } $seenRelatedTagNames[strtolower($modelTagName)] = true; $freecreatRelatedTags[] = [ 'name' => $modelTagName, 'score' => max(1, 12 - count($freecreatRelatedTags)), 'signals' => ['co_occurrence' => 1, 'jaccard' => 0, 'category_boost' => 0, 'popularity_boost' => 0, 'freshness_boost' => 0], ]; if (count($freecreatRelatedTags) >= 12) { break 2; } } } } if (empty($freecreatHubModels) && !empty($modelList)) { $freecreatHubModels = array_slice($modelList, 0, 10); } $freecreatTagFaqItems = is_array($freecreatTagSeo['seo_faq_items'] null) $freecreatTagSeo['seo_faq_items'] : []; $freecreatTagFormats = is_array($freecreatTagSeo['seo_related_formats'] null) $freecreatTagSeo['seo_related_formats'] : ['GLB', 'FBX', 'OBJ', 'STL']; $freecreatTagUseCases = is_array($freecreatTagSeo['seo_use_cases'] null) $freecreatTagSeo['seo_use_cases'] : []; $freecreatTagTitle = $freecreatTagSeo['title'] ('Free ' . $tagName . ' 3D Models Download - Freecreat'); $freecreatTagH1 = $freecreatTagSeo['h1'] ('Free ' . $tagName . ' 3D Models Download'); $freecreatTagKeywordH1 = trim($tagName); if ($freecreatTagKeywordH1 !== '' && stripos($freecreatTagKeywordH1, '3d model') === false) { $freecreatTagKeywordH1 .= ' 3D model'; } $freecreatTagDescription = $freecreatTagSeo['description'] ('Browse downloadable 3D models tagged with ' . $tagName . ' on Freecreat.'); $freecreatTagIntro = $freecreatTagSeo['seo_intro'] $freecreatTagDescription; $preUrl = $pre_url ($testBasePath . '/tags/' . rawurlencode($tagName)); $canonicalPath = $preUrl; if ($isFreecreatV2Preview && !$freecreatIsTestPath) { $canonicalPath = '/3d-model/' . rawurlencode($tagName); } $query = is_array($query null) $query : []; $order = (string)($order ''); $orderItems = $isFreecreatV2Preview [ '' => 'Recommended', '1' => 'Relevance', '2' => 'Newest', '3' => 'Downloads', '4' => 'Favorites', '5' => 'Views', ] : [ '' => 'Recommended', '1' => 'Relevance', '2' => 'Newest', '3' => 'Downloads', '4' => 'Favorites', '5' => 'Views', ]; $pageTitle = $isFreecreatV2Preview $freecreatTagTitle : ($page_title ($tagName . ' 3D models')); $pageDescription = $isFreecreatV2Preview $freecreatTagDescription : ($page_description ($tagName . ' 3D model collection.')); $canonicalUrl = $siteHost . $canonicalPath; $tagKeywords = implode(',', array_values(array_unique(array_filter($isFreecreatV2Preview [$tagName, $tagName . ' 3D models', '3D model download', 'Freecreat'] : [$tagName, $tagName . '3D妯″瀷', '3D妯″瀷涓嬭浇', 'AR妯″瀷', '鍒涢€犲'])))); $firstCover = count($modelList) > 0 ($isFreecreatV2Preview $freecreatAsset($modelList[0]) : $asset($modelList[0])) : ($isFreecreatV2Preview 'https://www.freecreat.com/static/sg2025/images/logo.png' : 'https://www.chuangzaojia.com/static/image/logo40.png'); $firstSeoCover = count($modelList) > 0 ($isFreecreatV2Preview $freecreatSeoImage($modelList[0], htmlspecialchars_decode($firstCover, ENT_QUOTES)) : htmlspecialchars_decode($asset($modelList[0]), ENT_QUOTES)) : ($isFreecreatV2Preview 'https://www.freecreat.com/static/sg2025/images/logo.png' : 'https://www.chuangzaojia.com/static/image/logo40.png'); $detailFallbackTitle = $isFreecreatV2Preview '3D Model' : '3D妯″瀷'; $priceFallback = $isFreecreatV2Preview 'Ready to preview' : '绌洪棿绱犳潗'; $extractYoutubeId = function ($value) { $value = trim((string)($value '')); if ($value === '') return ''; if (preg_match('~^[A-Za-z0-9_-]{11}$~', $value)) return $value; if (preg_match('~( :youtube\.com/( :watch\ v=|embed/|shorts/)|youtu\.be/)([A-Za-z0-9_-]{11})~', $value, $m)) return $m[1]; $parts = parse_url($value); if (!empty($parts['query'])) { parse_str($parts['query'], $query); if (!empty($query['v']) && preg_match('~^[A-Za-z0-9_-]{11}$~', $query['v'])) return $query['v']; } return ''; }; $buildFreecreatVideoItems = function ($items, $limit = 8) use ($extractYoutubeId, $freecreatAsset) { $items = array_values(array_filter(is_array($items) $items : [])); $videos = []; $seen = []; foreach ($items as $item) { $id = intval($item->id 0); if ($id <= 0 || isset($seen[$id])) continue; $raw = implode(' ', array_filter([ $item->youtube_video_id '', $item->youtube_id '', $item->video_youtube_id '', $item->youtube_url '', $item->youtube_embed_url '', $item->video_url '', $item->video_embed_url '', $item->preview_video_url '', ])); $youtubeId = $extractYoutubeId($raw); if ($youtubeId === '') continue; $title = trim((string)($item->en_title $item->zone_title '')); if ($title === '') $title = trim((string)($item->video_title $item->title $item->name '3D Model')); $title = preg_replace('/\s+3D Model\s+(Download|-) .*/i', '', $title); $thumb = ''; if (isset($modelAsset) && is_callable($modelAsset)) { $thumb = $modelAsset($item); } if ($thumb === '' || $thumb === '/static/image/loading.png') { $thumb = trim((string)($item->video_thumbnail_url $item->youtube_thumbnail_url '')); } if ($thumb === '') { $thumb = 'https://i.ytimg.com/vi/' . $youtubeId . '/hqdefault.jpg'; } elseif (preg_match('/^https :\/\/(file\.freecreat\.com|freecreat-com\.oss-ap-southeast-1\.aliyuncs\.com)\//i', $thumb)) { $thumb = '/freecreat-image src=' . rawurlencode($thumb); } $videos[] = ['id' => $id, 'title' => $title, 'thumb' => $thumb, 'url' => '/video/' . $id . '.html']; $seen[$id] = true; if (count($videos) >= $limit) break; } return $videos; }; $tagRelatedVideos = $isFreecreatV2Preview $buildFreecreatVideoItems(array_merge($modelList, $freecreatHubModels, is_array($freecreat_video_model_list null) $freecreat_video_model_list : []), 8) : []; $priceSuffix = $isFreecreatV2Preview ? '' : ' 鍒涢€犲竵'; >
< php $metaTitle = $isFreecreatV2Preview $freecreatTagTitle : ($seo['title'] ($pageTitle . ' - ' . $siteName)); > < php $metaDescription = $isFreecreatV2Preview $pageDescription : ($seo['description'] $pageDescription); > < php $metaKeywords = $isFreecreatV2Preview $tagKeywords : ($seo['keywords'] $tagKeywords); >< = $freecreatDeviceViewMode === 'pad' 'Use tag pages as spatial moodboards: compare related models, open 3D previews, and prepare AR or XR presentation flows.' : 'Tag pages are tuned for quick mobile discovery, so each model can lead into 3D View, room AR or XR headset handoff.' >
< = $safe($metaDescription) >
< php if ($isFreecreatV2Preview && !empty($freecreatTagIntro)): >< = $safe($freecreatTagIntro) >
< php endif; >Freecreat model pages may include production-friendly files for preview, editing, rendering, AR, XR, and 3D printing.
Helpful notes before choosing a < = $safe($tagName) > model.
< = $safe($faqItem['answer'] '') >
Watch video previews from models in this tag before opening 3D View or downloading files.