feat(templates): add archive-header and post-grid components

- Add ArchiveHeader component (schema, renderer, formbuilder)
- Add PostGrid component (schema, renderer, formbuilder)
- Unify archive templates (home, archive, category, tag,
  author, date, search)
- Add page visibility system with VisibilityDefaults
- Register components in AdminDashboardRenderer
- Fix boolean conversion in functions-addon.php
- All 172 unit tests passed

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
FrankZamora
2025-12-06 20:36:27 -06:00
parent b79569c5e7
commit c23dc22d76
24 changed files with 3224 additions and 852 deletions

View File

@@ -22,15 +22,15 @@ final class EvaluatePageVisibilityUseCase
) {}
/**
* Evalúa si el componente debe mostrarse en la página actual
* Evalua si el componente debe mostrarse en la pagina actual
*/
public function execute(string $componentName): bool
{
$config = $this->visibilityRepository->getVisibilityConfig($componentName);
if (empty($config)) {
// Usar constante compartida (DRY)
$config = VisibilityDefaults::DEFAULT_VISIBILITY;
// Usar defaults especificos por componente si existen
$config = VisibilityDefaults::getForComponent($componentName);
}
$pageType = $this->pageTypeDetector->detect();

View File

@@ -16,13 +16,13 @@ namespace ROITheme\Shared\Domain\Constants;
final class VisibilityDefaults
{
/**
* Configuración de visibilidad por defecto para nuevos componentes
* Configuracion de visibilidad por defecto para componentes generales
*
* - Home: SÍ mostrar (página principal)
* - Posts: SÍ mostrar (artículos del blog)
* - Pages: SÍ mostrar (páginas estáticas)
* - Archives: NO mostrar (listados de categorías/tags)
* - Search: NO mostrar (resultados de búsqueda)
* - Home: SI mostrar (pagina principal)
* - Posts: SI mostrar (articulos del blog)
* - Pages: SI mostrar (paginas estaticas)
* - Archives: NO mostrar (listados de categorias/tags)
* - Search: NO mostrar (resultados de busqueda)
*/
public const DEFAULT_VISIBILITY = [
'show_on_home' => true,
@@ -33,7 +33,39 @@ final class VisibilityDefaults
];
/**
* Lista de campos de visibilidad válidos
* Defaults especificos por componente (sobrescriben DEFAULT_VISIBILITY)
*
* Componentes de listados:
* - archive-header: Solo en archives (home para blog title)
* - post-grid: En home, archives y search
* - cta-box-sidebar: Tambien en archives
*/
public const COMPONENT_VISIBILITY = [
'archive-header' => [
'show_on_home' => true, // Para mostrar blog_title
'show_on_posts' => false,
'show_on_pages' => false,
'show_on_archives' => true, // Proposito principal
'show_on_search' => true, // Mostrar "Resultados: X"
],
'post-grid' => [
'show_on_home' => true, // Blog principal
'show_on_posts' => false,
'show_on_pages' => false,
'show_on_archives' => true, // Listados de categoria/tag
'show_on_search' => true, // Resultados de busqueda
],
'cta-box-sidebar' => [
'show_on_home' => true,
'show_on_posts' => true,
'show_on_pages' => true,
'show_on_archives' => true, // Visible en archives
'show_on_search' => false,
],
];
/**
* Lista de campos de visibilidad validos
*/
public const VISIBILITY_FIELDS = [
'show_on_home',
@@ -42,4 +74,15 @@ final class VisibilityDefaults
'show_on_archives',
'show_on_search',
];
/**
* Obtiene los defaults para un componente especifico
*
* @param string $componentName Nombre del componente (kebab-case)
* @return array<string, bool> Configuracion de visibilidad
*/
public static function getForComponent(string $componentName): array
{
return self::COMPONENT_VISIBILITY[$componentName] ?? self::DEFAULT_VISIBILITY;
}
}

View File

@@ -20,7 +20,7 @@ final class MigratePageVisibilityService
) {}
/**
* Ejecuta la migración para todos los componentes
* Ejecuta la migracion para todos los componentes
*
* @return array{created: int, skipped: int}
*/
@@ -37,10 +37,10 @@ final class MigratePageVisibilityService
continue;
}
// Usar constante compartida (DRY)
// Usar defaults especificos por componente si existen
$this->visibilityRepository->createDefaultVisibility(
$componentName,
VisibilityDefaults::DEFAULT_VISIBILITY
VisibilityDefaults::getForComponent($componentName)
);
$created++;
}

View File

@@ -40,7 +40,10 @@ final class WordPressPageTypeDetector implements PageTypeDetectorInterface
public function isHome(): bool
{
return is_front_page();
// is_front_page() = pagina de inicio configurada
// is_home() = pagina de posts (blog)
// Ambas cuentan como "home" para visibilidad
return is_front_page() || is_home();
}
public function isPost(): bool