Ultimate Post Type
Gerenciador de catálogos completo para WordPress com submissão e gerenciamento via front-end, integração completa com Elementor e sistema avançado de galeria de mídia.
Install
No release zip yet. The repository archive installs, but the folder name will carry the branch suffix and updates will not flow:
wp plugin install https://github.com/pdroinho/ultimate-post-type/archive/refs/heads/main.zipUPT - Ultimate Post Type
Plugin WordPress para criação de catálogos dinâmicos com gestão front-end completa.
Visão Geral
O UPT (Ultimate Post Type) transforma o WordPress em uma plataforma completa de catálogos. Com ele, você cria esquemas personalizados de dados (imóveis, veículos, produtos, serviços), gerencia categorias hierárquicas, importa dados via XML, e renderiza tudo com widgets Elementor totalmente personalizáveis — incluindo um Card Builder visual com drag-and-drop.
Casos de uso
- Portais imobiliários com filtros por tipo (Aluguel/Venda) e categoria (Casa/Apartamento)
- Catálogos de veículos com busca avançada
- Listagens de produtos e serviços
- Qualquer tipo de diretório ou catalogação
Funcionalidades Principais
| Feature | Descrição |
|---|---|
| Schema Builder | Criação visual de esquemas com campos customizáveis (text, number, image, video, pdf, gallery, wysiwyg, date) |
| Card Builder Visual | Personalização de cards via drag-and-drop com preview em tempo real |
| Importação XML | Upload e processamento em lotes com progress bar, retomada automática e anti-SSRF |
| CRON Import | Importação automática periódica de feeds XML |
| Filtros AJAX | Busca em tempo real, categorias parent/child, meta filters |
| Dashboard SAAS | Front-end completo com login, tabs, CRUD, gráficos Chart.js, galeria |
| Galeria de Mídia | Seleção múltipla com pastas organizacionais, preview inline |
| Conversão WebP | Conversão automática de imagens no upload |
| Cache Inteligente | Transients para queries pesadas |
| 9 Widgets Elementor | Grid, Dashboard, Filtros, Busca, Galeria, Vídeo, WhatsApp e mais |
| 6 Tags Dinâmicas | Campos customizados, galeria, PDF, vídeo, items relacionados |
| Filtros Hierárquicos | Parent/Child com alinhamento justificado |
Requisitos
| Requisito | Versão |
|---|---|
| WordPress | 6.0+ |
| PHP | 7.4+ |
| Elementor | 3.0+ |
| jQuery | (incluído no WordPress) |
Instalação
Via Git (recomendado para desenvolvimento)
# Clone o repositório
git clone https://github.com/Pdroinho/Ultimate-Post-Type.git
# Copie para a pasta de plugins (ou crie um symlink)
cp -r Ultimate-Post-Type /path/to/wordpress/wp-content/plugins/ultimate-post-type
# Ou via symlink (recomendado para desenvolvimento)
ln -s /path/to/Ultimate-Post-Type /path/to/wordpress/wp-content/plugins/ultimate-post-type
Via ZIP
- Baixe o ZIP do repositório
- Extraia para
/wp-content/plugins/ultimate-post-type/ - Ative o plugin no painel WordPress em Plugins → Ativar
Para desenvolvimento (autocomplete no IDE)
composer install
Isso instala os WordPress stubs para autocomplete no Intelephense/PHPStorm.
Início Rápido
1. Criando um Esquema
- Acesse Catálogo → Esquemas no painel admin
- Clique em "Adicionar Novo"
- Defina nome e campos (text, number, image, video, pdf, gallery, wysiwyg, date)
- Configure categorias hierárquicas
2. Usando os Widgets Elementor
- Abra uma página com o Elementor
- Arraste o widget "UPT Listing (Grid)" para a página
- Selecione o esquema e configure filtros, paginação e card builder
- Adicione o widget "UPT Category Filter" para filtros
3. Card Builder Visual
- No widget Listing, ative o Card Builder
- No painel
/paineldo front-end, vá em "Card Settings" - Arraste os campos, configure cores, tamanhos e pesos
- Preview em tempo real e salve via AJAX
4. Importação XML
- No painel admin, vá em Catálogo → Importador
- Ou no front-end
/painel, aba "Importar XML" - Faça upload do XML e acompanhe o processamento em lotes
- Configure CRON para importação automática
Widgets Elementor
Grid de Catálogo (UPT_Listing_Widget)
- Grid responsivo com paginação AJAX, infinite scroll ou números
- Filtros por categoria, busca e meta fields
- Card Builder integrado com renderização inline
- Modo AJAX ou Link/GET (SEO-friendly)
Dashboard SAAS (UPT_Dashboard_Widget)
- Dashboard completo com tabs, gráficos Chart.js
- CRUD de itens com formulário, galeria e categorias
- Importação XML com drag-and-drop
- Login e registro de usuários integrados
- Presets: Hostinger e SAAS
Filtro de Categorias (UPT_Category_Filter_Widget)
- Filtro hierárquico Parent → Child
- Layouts: horizontal, vertical, dropdown, justificado
- Ocultar categorias vazias automaticamente
- Carregamento de subcategorias via AJAX
Busca (UPT_Search_Widget)
- Busca com targets (campos específicos do esquema)
- Modo AJAX (tempo real) ou Link/GET
- Debounce configurável
Galeria de Produto (UPT_Product_Gallery_Widget)
- Imagem principal + thumbnails
- Navegação por setas
- Lightbox integrado
Outros Widgets
- WhatsApp Button — botão com número dinâmico
- Video Player — player de vídeo integrado
- Text Editor — editor de texto inline
- Dashboard Actions — ações contextuais
Tags Dinâmicas Elementor
| Tag | Descrição |
|---|---|
custom-field-tag |
Renderiza campos personalizados do esquema |
dashboard-data-tag |
Dados do dashboard |
gallery-field-tag |
Campos de galeria de imagens |
pdf-field-tag |
Campos PDF |
related-item-data-tag |
Dados de itens relacionados |
video-field-tag |
Campos de vídeo |
Arquitetura
Estrutura de Diretórios
ultimate-post-type/
├── ultimate-post-type.php # Entry point + changelog
├── uninstall.php # Cleanup completo ao desinstalar
├── composer.json # WordPress stubs (dev)
├── wp-constants.php # Constantes WP para IDE
│
├── includes/ # Classes PHP (~20.200 linhas)
│ ├── class-admin.php # Menus admin, enqueue condicional (~5.600 linhas)
│ ├── class-ajax.php # 45+ endpoints AJAX (~3.400 linhas)
│ ├── class-imobiliaria-importer.php # Importação XML (911 linhas)
│ ├── class-auth.php # Login/registro front-end
│ ├── class-cache.php # Sistema de transients
│ ├── class-cpt.php # Custom Post Type: catalog_item
│ ├── class-taxonomies.php # catalog_schema, catalog_category, media_folder
│ ├── class-schema-store.php # CRUD de esquemas
│ ├── class-media-folders.php # Pastas virtuais de mídia
│ ├── class-image-webp.php # Conversão WebP automática
│ ├── class-roles.php # Capacidades customizadas
│ ├── class-shortcodes.php # Shortcodes
│ ├── class-card-premium-actions.php # Favoritos e badges
│ ├── card-premium-render.php # Renderização de card premium
│ ├── admin-templates/ # Templates PHP das páginas admin
│ │ ├── gallery.php # Galeria de mídia
│ │ ├── importer.php # Importação/exportação XML/JSON
│ │ ├── schema-builder.php # Construtor de esquemas
│ │ ├── unused-media.php # Mídias não usadas
│ │ └── about.php # Sobre o plugin
│ └── elementor/
│ ├── class-elementor.php # Registro de widgets e tags
│ ├── widgets/ # 9 widgets
│ └── tags/ # 6 tags dinâmicas
│
├── assets/
│ ├── css/ # CSS modular (~8.700 linhas)
│ │ ├── front.css # Agregador front-end (10 módulos)
│ │ ├── admin.css # Agregador admin (11 módulos)
│ │ ├── gallery.css # Galeria (1.634 linhas)
│ │ ├── card-premium.css # Card premium
│ │ └── admin/ # 11 módulos por feature
│ │ ├── variables.css # Custom properties
│ │ ├── admin-base.css # Schema builder, forms
│ │ ├── preset-hostinger.css # Layout, cards, submissions
│ │ ├── dashboard.css # Tabs, login, pills
│ │ ├── editor.css # WYSIWYG editor
│ │ ├── form-fixes.css # Correções de formulário
│ │ ├── components.css # Alerts, dialogs, bulk UI
│ │ ├── preset-saas.css # Layout SAAS
│ │ ├── import-wizard.css # Wizard, stepper, CRON
│ │ ├── card-builder.css # Card builder sortable
│ │ └── utilities.css # Classes utilitárias (loading, status)
│ └── js/ # JavaScript (~9.900 linhas)
│ ├── front.js # Listing, filtros, forms (6.169 linhas)
│ ├── gallery.js # Galeria modal (2.146 linhas)
│ ├── admin.js # Schema builder admin
│ ├── editor.js # WYSIWYG standalone
│ ├── card-premium.js # Card premium
│ ├── media-folders.js # Pastas de mídia
│ ├── upt-gallery.js # Galeria admin
│ ├── taxonomy-categories.js # Ordenação de categorias
│ ├── taxonomy-categories-metabox.js
│ └── admin/ # Módulos extraídos
│ ├── dashboard.js # Chart.js, modals, filtros
│ ├── import-wizard.js # Dropzone, stepper, batch
│ └── card-builder.js # Builder sortable/editor
│
├── templates/
│ ├── dashboard-main.php # Dashboard SAAS (2.655 linhas)
│ ├── front-form-login.php # Formulário de login
│ └── front-form-submit.php # Formulário de submissão
│
└── languages/
└── ultimate-post-type-pt_BR.po # Tradução PT-BR
Classes Principais
| Classe | Responsabilidade |
|---|---|
UPT_Admin |
Menus admin, enqueue condicional por página, CRUD schemas |
UPT_Ajax |
45+ endpoints AJAX centralizados |
UPT_Imobiliaria_Importer |
Parser XML, mapeamento de campos, download de fotos |
UPT_Auth |
Login/registro front-end via wp_signon() |
UPT_CPT |
Registro do CPT catalog_item |
UPT_Taxonomies |
3 taxonomias: catalog_schema, catalog_category, media_folder |
UPT_Schema_Store |
CRUD de esquemas via WordPress options |
UPT_Media_Folders |
Pastas virtuais para organização de mídia |
UPT_Image_WebP |
Conversão automática WebP no upload |
UPT_Cache |
Wrapper de transients |
UPT_Elementor |
Registro de widgets e tags dinâmicas |
Taxonomias e Post Types
| Tipo | Slug | Hierárquica | Descrição |
|---|---|---|---|
catalog_item (CPT) |
— | — | Post type principal do catálogo |
catalog_schema |
— | Sim | Define esquemas de campos (ex: Imóvel, Veículo) |
catalog_category |
— | Sim | Categorias com parent/child (ex: Aluguel > Casa) |
media_folder |
— | Sim | Pastas virtuais para organizar mídia |
API AJAX
O plugin expõe 45+ endpoints via WordPress AJAX API.
Endpoints Públicos (nopriv)
| Endpoint | Descrição |
|---|---|
upt_live_search |
Busca/filtro AJAX com paginação |
upt_public_get_child_categories |
Subcategorias públicas |
Endpoints Autenticados
| Categoria | Endpoints |
|---|---|
| CRUD Itens | save_item, delete_item, bulk_delete_items, get_all_item_ids, reorder_items |
| Busca/Filtro | live_search, filter_items, get_schema_counts |
| Categorias | add_category, update_category, delete_category, rename_category, get_child_categories |
| Esquemas | add_schema_option, delete_schema_option, rename_schema_option, reorder_fields |
| Drafts | save_draft, get_draft, clear_draft |
| Galeria | gallery_get_folders, gallery_get_images, gallery_delete_image, get_media_by_ids |
| Mídia | create_media_folder, assign_to_folder, remove_from_folder, delete_media_folder, rename_media_folder, move_media_folder |
| XML Import | imob_count, imob_upload, imob_batch, imob_status, imob_cancel |
| Card Builder | save_card_settings |
| CRON | save_cron_config, test_cron_import |
Segurança
check_ajax_referer()com nonce em todos os endpoints AJAXsanitize_text_field()eabsint()em todos os inputswp_verify_nonce()em formulários front-end- Anti-SSRF na importação XML (bloqueia IPs privados/locais)
- Validação de permissões com
current_user_can()em ações sensíveis
Importação XML de Imobiliárias
O sistema de importação suporta feeds XML padrão de imobiliárias:
- Upload com drag-and-drop e validação de arquivo
- Processamento em lotes via AJAX (N imóveis por requisição)
- Barra de progresso com contadores (total, processados, importados, fotos, erros)
- Retomada automática — re-importação preserva galeria e thumbnail existentes
- Cancelamento — botão para interromper a qualquer momento
- CRON — importação automática periódica configurável
- Anti-SSRF — bloqueia download de imagens de IPs privados/locais
- Mapeamento automático — categorias criadas a partir de TipoImóvel + Cidade
- Campos automáticos — Status (Venda/Aluguel), Preço formatado (R$), Empreendimento
Desenvolvimento
Padrões de Código
- PHP: Classes estáticas com
public static function, WordPress hooks API - JavaScript: IIFE jQuery
(function($){...})(jQuery);, módulos separados por feature - CSS: Prefixo
upt-, custom properties emvariables.css, módulos por feature - Segurança: Nonce verification + sanitization em todos os endpoints
- Cache-busting:
filemtime()em todos oswp_enqueue_script/style - Carregamento condicional: CSS/JS carregam apenas nas páginas que precisam
Setup do Ambiente
# Clone o repositório
git clone https://github.com/Pdroinho/Ultimate-Post-Type.git
# Instale as dependências de desenvolvimento (IDE stubs)
cd Ultimate-Post-Type
composer install
# Crie um symlink para o WordPress
ln -s $(pwd) /path/to/wordpress/wp-content/plugins/ultimate-post-type
Métricas do Projeto
| Métrica | Valor |
|---|---|
| Total de código | ~42.750 linhas |
| PHP | ~20.200 linhas (35 arquivos) |
| JavaScript | ~9.900 linhas (12 arquivos) |
| CSS | ~8.700 linhas (15 arquivos) |
| Templates admin | ~1.147 linhas (5 templates) |
| Endpoints AJAX | 45+ |
| Widgets Elementor | 9 |
| Tags dinâmicas | 6 |
Presets de Design
Preset Hostinger (Padrão)
- Cor principal:
#673DE6 - Design otimizado para infraestrutura
- Cards, submissions, modais
Preset SAAS
- Cor principal:
#6366f1 - Sidebar escura:
#111827 - Header branco:
#ffffff - Conteúdo:
#f1f5f9 - Cards:
#ffffff - Logo customizável
Changelog
V20.7.35-wizard
- Importação XML: categorias automáticas a partir de TipoImóvel + Cidade
- Importação XML: campo Status do Imóvel (Venda / Aluguel / Venda e Aluguel / Consulte)
- Importação XML: campos PrecoLocacao e PrecoLocacaoTemporada importados
- Importação XML: campo Empreendimento importado
- Importação XML: preços formatados como moeda brasileira (R$ 410.000,00)
- Importação XML: sync incremental — re-importação preserva galeria e thumbnail
- Importação XML: importação disponível no /painel (tab "Importar XML")
- Card Builder visual com drag-and-drop
- Filtros parent/child respeitando hierarquia (correção)
- Refatoração front-end: CSS dividido em 10 módulos, JS extraído em 3 módulos
- Carregamento condicional de CSS/JS por página admin
- Limpeza de código: removidos ~1.900 linhas de código morto/redundante
- Templates admin: HTML extraído para 5 templates PHP separados (admin-templates/)
- AJAX: métodos privados reutilizáveis (build_table_response_args, sanitize_field_value)
- CSS utilitário: classes .upt-loading, .upt-status-error migradas do JS para CSS
- Bug fix: is_upt_request() com case sensitivity (sanitize_key converte para lowercase)
- Bug fix: filtro de categoria hierárquica (parent_term_id no tax_query)
V20.7.34-wizard
- Importação XML: reescrita completa para processamento em lotes via AJAX
- Barra de progresso visual com contadores
- Retomada automática e cancelamento
- Anti-SSRF: bloqueia download de imagens de IPs privados
V20.7.30-wizard
- Filtro de Categorias: modos Pai/Filho para encadear filtros
- Endpoint público para carregar subcategorias via AJAX
V20.7.24-wizard
- Grade do Catálogo: include_children=true ao filtrar por categoria pai
Licença
Este plugin é licenciado sob os termos da licença GPL v2 ou posterior.
Créditos
Desenvolvido por Pedro e Matheus.