/* =========================================================
FICHA · SEO / META / JSON-LD
========================================================= */
if (!function_exists('cez_seo_clean_text')) {
function cez_seo_clean_text($value, int $limit = 0): string {
$text = trim(preg_replace('/\s+/u', ' ', strip_tags((string)$value)));
if ($limit > 0 && function_exists('mb_strlen') && mb_strlen($text, 'UTF-8') > $limit) {
$text = rtrim(mb_substr($text, 0, $limit - 1, 'UTF-8')) . '…';
} elseif ($limit > 0 && strlen($text) > $limit) {
$text = rtrim(substr($text, 0, $limit - 1)) . '…';
}
return $text;
}
}
if (!function_exists('cez_seo_companies_from_row')) {
function cez_seo_companies_from_row(array $r, int $max = 3): array {
$out = [];
foreach (['compania','compania2','compania3','compania4','compania5','compania6'] as $field) {
foreach (explode(',', (string)($r[$field] ?? '')) as $name) {
$name = trim($name);
if ($name !== '' && !in_array($name, $out, true)) { $out[] = $name; }
}
}
return array_slice($out, 0, $max);
}
}
if (!function_exists('cez_seo_platforms_from_codes')) {
function cez_seo_platforms_from_codes(array $codes, array $sisToSistemaMap = [], int $max = 6): array {
$out = [];
foreach ($codes as $code) {
$code = trim((string)$code);
if ($code === '') { continue; }
$label = trim((string)($sisToSistemaMap[$code] ?? $code));
if ($label !== '' && !in_array($label, $out, true)) { $out[] = $label; }
}
return array_slice($out, 0, $max);
}
}
if (!function_exists('cez_ficha_meta_description')) {
function cez_ficha_meta_description(array $r, array $context = []): string {
$isEn = (($context['l'] ?? null) === 'en');
$pg = trim((string)($context['pg'] ?? ''));
$item = trim((string)($context['itemDescription'] ?? ''));
$name = trim((string)($r['nombre'] ?? ''));
$subtitle = trim((string)($r['subtitulo'] ?? ''));
$fullName = trim($name . ($subtitle !== '' ? ' - ' . $subtitle : ''));
$companies = cez_seo_companies_from_row($r, 2);
$companyText = implode(' / ', $companies);
$yearText = trim((string)($context['anos_string'] ?? ''));
$platforms = cez_seo_platforms_from_codes((array)($context['platforms'] ?? []), (array)($context['sisToSistemaMap'] ?? []), 5);
$platformText = implode(', ', $platforms);
$features = [];
if ($pg === '') {
if (!empty($r['comentario'])) { $features[] = $isEn ? 'review' : 'análisis'; }
if ((int)($context['totalDescargasFicha'] ?? 0) > 0) { $features[] = $isEn ? 'downloads' : 'descargas'; }
if ((int)($r['rscreens'] ?? 0) > 0) { $features[] = $isEn ? 'screenshots' : 'pantallas'; }
if ((int)($r['rcovers'] ?? 0) > 0) { $features[] = $isEn ? 'covers' : 'carátulas'; }
if ((int)($r['rmanual'] ?? 0) > 0) { $features[] = $isEn ? 'manuals' : 'manuales'; }
if ((int)($context['rmags'] ?? 0) > 0) { $features[] = $isEn ? 'magazine reviews' : 'revistas'; }
$features[] = $isEn ? 'credits' : 'créditos';
}
if ($pg !== '' && $item !== '') {
$desc = $isEn
? $item . ' of ' . $fullName . '. Additional material and information from Computer Emuzone'
: $item . ' de ' . $fullName . '. Material e información complementaria en Computer Emuzone';
} else {
$featureText = implode(', ', array_values(array_unique($features)));
$desc = $isEn
? 'Game card of ' . $fullName . ($featureText ? ': ' . $featureText : '')
: 'Ficha de ' . $fullName . ($featureText ? ': ' . $featureText : '');
}
$tail = [];
if ($companyText !== '') { $tail[] = $companyText; }
if ($yearText !== '') { $tail[] = $yearText; }
if ($platformText !== '') { $tail[] = ($isEn ? 'for ' : 'para ') . $platformText; }
if ($tail) { $desc .= '. ' . implode(', ', $tail) . '.'; }
return cez_seo_clean_text($desc, 165);
}
}
if (!function_exists('cez_ficha_jsonld')) {
function cez_ficha_jsonld(array $r, array $context = []): array {
$isEn = (($context['l'] ?? null) === 'en');
$name = trim((string)($r['nombre'] ?? ''));
$subtitle = trim((string)($r['subtitulo'] ?? ''));
$fullName = trim($name . ($subtitle !== '' ? ' - ' . $subtitle : ''));
$companies = cez_seo_companies_from_row($r, 6);
$platforms = cez_seo_platforms_from_codes((array)($context['platforms'] ?? []), (array)($context['sisToSistemaMap'] ?? []), 12);
$canonical = trim((string)($context['canonical'] ?? ''));
$imageUrl = trim((string)($context['imageUrl'] ?? ''));
$description = trim((string)($context['description'] ?? ''));
$json = [
'@context' => 'https://schema.org',
'@type' => 'VideoGame',
'name' => $fullName !== '' ? $fullName : $name,
'url' => $canonical,
'inLanguage' => $isEn ? 'en' : 'es',
'publisher' => [
'@type' => 'Organization',
'name' => 'Computer Emuzone',
'url' => 'https://computeremuzone.com/'
],
];
if ($description !== '') { $json['description'] = $description; }
if ($imageUrl !== '') { $json['image'] = [$imageUrl]; }
if ($canonical !== '') { $json['mainEntityOfPage'] = ['@type' => 'WebPage', '@id' => $canonical]; }
if ($platforms) { $json['gamePlatform'] = $platforms; }
if ($companies) {
$json['creator'] = array_map(static fn($name) => ['@type' => 'Organization', 'name' => $name], $companies);
}
$years = preg_split('/[^0-9]+/', (string)($context['anos_string'] ?? ''), -1, PREG_SPLIT_NO_EMPTY);
if (!empty($years)) { $json['datePublished'] = (string)min(array_map('intval', $years)); }
$genreLabels = [];
foreach ((array)($context['genres'] ?? []) as $g) {
$label = trim((string)($g[$isEn ? 'nombre_en' : 'nombre'] ?? $g['nombre'] ?? ''));
if ($label !== '' && !in_array($label, $genreLabels, true)) { $genreLabels[] = $label; }
}
foreach ((array)($context['subgenres'] ?? []) as $g) {
$label = trim((string)($g[$isEn ? 'nombre_en' : 'nombre'] ?? $g['nombre'] ?? ''));
if ($label !== '' && !in_array($label, $genreLabels, true)) { $genreLabels[] = $label; }
}
if ($genreLabels) { $json['genre'] = $genreLabels; }
$dateModified = trim((string)($context['dateModified'] ?? ''));
if ($dateModified !== '' && preg_match('/^\d{4}-\d{2}-\d{2}/', $dateModified)) { $json['dateModified'] = substr($dateModified, 0, 10); }
$votos = (int)($context['votos'] ?? 0);
$media = (float)($context['media'] ?? 0);
if ($votos > 0 && $media > 0) {
$json['aggregateRating'] = [
'@type' => 'AggregateRating',
'ratingValue' => round($media, 1),
'ratingCount' => $votos,
'bestRating' => 10,
'worstRating' => 1
];
}
$cezScore = isset($context['cezScore']) && $context['cezScore'] !== '' ? (float)$context['cezScore'] : 0.0;
$reviewBody = cez_seo_clean_text($r['comentario'] ?? '', 500);
if ($reviewBody !== '') {
$review = [
'@type' => 'Review',
'reviewBody' => $reviewBody,
'author' => ['@type' => 'Organization', 'name' => 'Computer Emuzone']
];
if ($cezScore > 0) {
$review['reviewRating'] = [
'@type' => 'Rating',
'ratingValue' => round($cezScore, 1),
'bestRating' => 10,
'worstRating' => 1
];
}
$json['review'] = $review;
}
return array_filter($json, static fn($v) => $v !== '' && $v !== [] && $v !== null);
}
}
Do Not Feed the Monkeys (Fictiorama Studios / Alawar 2019) :: Mobile Zone
@
carátulas

PS4 Collector's Edition
PS4
PUNTUACIONES

relacionados

RELACIONADOS
SI TE GUSTA...
comenta

En CEZ y otras zonas de CEZ
agradecimientos

Todavía no hay contribuciones registradas para esta ficha.