Criação

This commit is contained in:
2025-10-01 23:56:12 -03:00
commit a3c6de0cfe
8 changed files with 1266 additions and 0 deletions

2
.gitattributes vendored Normal file
View File

@@ -0,0 +1,2 @@
# Auto detect text files and perform LF normalization
* text=auto

35
README.md Normal file
View File

@@ -0,0 +1,35 @@
# Sistema de Parceiros Plugin
## Description
The Sistema de Parceiros plugin is designed to manage partners and partnerships within a WordPress site. It provides filtering capabilities and uses shortcodes to display partners on the frontend.
## Features
- **Partner Management:** Easily add, edit, and delete partners through the WordPress admin interface.
- **Customizable Display:** Use shortcodes to display partners on any page or post.
- **Filtering:** Filter partners by category or sector.
- **Responsive Design:** The plugin is designed to be responsive and look good on all devices.
## Installation
1. Upload the entire plugin directory to the `/wp-content/plugins/` directory.
2. Activate the plugin through the 'Plugins' menu in WordPress.
## Usage
### Shortcode
Use the `[parceiros]` shortcode to display partners on any page or post.
#### Attributes
- `categoria`: Filter partners by category.
- `setor`: Filter partners by sector.
- `limite`: Limit the number of partners displayed.
Example: `[parceiros categoria="Technology" limite="5"]`
## Contributing
Contributions are welcome! Please submit any issues or pull requests on the GitHub repository.

346
admin/form-parceiro.php Normal file
View File

@@ -0,0 +1,346 @@
<?php
// Verificar se é edição ou adição
global $wpdb;
$tabela_parceiros = $wpdb->prefix . 'parceiros';
$parceiro = null;
$titulo_pagina = 'Adicionar Parceiro';
$acao = 'adicionar_parceiro';
$nonce_action = 'adicionar_parceiro';
// Verificar se é edição
if (isset($_GET['id']) && is_numeric($_GET['id'])) {
$id = intval($_GET['id']);
$parceiro = $wpdb->get_row($wpdb->prepare("SELECT * FROM $tabela_parceiros WHERE id = %d", $id));
if ($parceiro) {
$titulo_pagina = 'Editar Parceiro';
$acao = 'editar_parceiro';
$nonce_action = 'editar_parceiro';
}
}
// Obter setores e categorias existentes para sugestões
$setores_existentes = $wpdb->get_col("SELECT DISTINCT setor FROM $tabela_parceiros WHERE setor != '' ORDER BY setor");
$categorias_existentes = $wpdb->get_col("SELECT DISTINCT categoria FROM $tabela_parceiros WHERE categoria != '' ORDER BY categoria");
?>
<div class="wrap">
<h1><?php echo $titulo_pagina; ?></h1>
<div class="form-parceiro">
<form method="post" action="<?php echo admin_url('admin-post.php'); ?>" enctype="multipart/form-data">
<input type="hidden" name="action" value="<?php echo $acao; ?>">
<?php if ($parceiro): ?>
<input type="hidden" name="id" value="<?php echo $parceiro->id; ?>">
<?php endif; ?>
<?php wp_nonce_field($nonce_action); ?>
<div class="form-grupo">
<label for="nome">Nome do Parceiro *</label>
<input type="text" id="nome" name="nome" value="<?php echo $parceiro ? esc_attr($parceiro->nome) : ''; ?>" required>
</div>
<div class="form-grupo">
<label for="logo">Logo do Parceiro</label>
<?php if ($parceiro && !empty($parceiro->logo)): ?>
<div style="margin-bottom: 10px;">
<img src="<?php echo esc_url($parceiro->logo); ?>" alt="Logo atual" style="max-width: 150px; max-height: 100px; border: 1px solid #ddd; padding: 5px;">
<br>
<small>Logo atual</small>
</div>
<?php endif; ?>
<input type="file" id="logo" name="logo" accept="image/*">
<small>Formatos: JPG, PNG, GIF. Tamanho máximo: 2MB</small>
</div>
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 20px;">
<div class="form-grupo">
<label for="telefone">Telefone</label>
<input type="text" id="telefone" name="telefone" value="<?php echo $parceiro ? esc_attr($parceiro->telefone) : ''; ?>" placeholder="(11) 99999-9999">
</div>
<div class="form-grupo">
<label for="email">E-mail</label>
<input type="email" id="email" name="email" value="<?php echo $parceiro ? esc_attr($parceiro->email) : ''; ?>" placeholder="contato@empresa.com">
</div>
</div>
<div class="form-grupo">
<label for="site">Website</label>
<input type="url" id="site" name="site" value="<?php echo $parceiro ? esc_url($parceiro->site) : ''; ?>" placeholder="https://empresa.com">
</div>
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 20px;">
<div class="form-grupo">
<label for="setor">Setor</label>
<input type="text" id="setor" name="setor" value="<?php echo $parceiro ? esc_attr($parceiro->setor) : ''; ?>" list="setores-sugeridos" placeholder="Ex: Tecnologia, Marketing, Saúde">
<datalist id="setores-sugeridos">
<?php foreach ($setores_existentes as $setor): ?>
<option value="<?php echo esc_attr($setor); ?>">
<?php endforeach; ?>
</datalist>
</div>
<div class="form-grupo">
<label for="categoria">Categoria/Tipo</label>
<input type="text" id="categoria" name="categoria" value="<?php echo $parceiro ? esc_attr($parceiro->categoria) : ''; ?>" list="categorias-sugeridas" placeholder="Ex: Desenvolvimento, Consultoria, Varejo">
<datalist id="categorias-sugeridas">
<?php foreach ($categorias_existentes as $categoria): ?>
<option value="<?php echo esc_attr($categoria); ?>">
<?php endforeach; ?>
</datalist>
</div>
</div>
<div class="form-grupo">
<label for="endereco">Endereço</label>
<textarea id="endereco" name="endereco" rows="3" placeholder="Endereço completo"><?php echo $parceiro ? esc_textarea($parceiro->endereco) : ''; ?></textarea>
</div>
<div class="form-grupo">
<label>
<input type="checkbox" name="ativo" value="1" <?php echo ($parceiro && $parceiro->ativo) || !$parceiro ? 'checked' : ''; ?>>
Parceiro ativo
</label>
<small>Desmarque para desativar este parceiro (não será exibido no site)</small>
</div>
<div class="form-acoes">
<button type="submit" class="botao-submit">
<?php echo $parceiro ? 'Atualizar Parceiro' : 'Adicionar Parceiro'; ?>
</button>
<a href="<?php echo admin_url('admin.php?page=parceiros'); ?>" class="botao-cancelar">
Cancelar
</a>
</div>
</form>
</div>
</div>
<style>
.form-parceiro {
background: white;
padding: 30px;
border-radius: 8px;
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
max-width: 700px;
}
.form-grupo {
margin-bottom: 25px;
}
.form-grupo label {
display: block;
margin-bottom: 8px;
font-weight: 600;
color: #23282d;
font-size: 14px;
}
.form-grupo input[type="text"],
.form-grupo input[type="email"],
.form-grupo input[type="url"],
.form-grupo input[type="file"],
.form-grupo select,
.form-grupo textarea {
width: 100%;
padding: 10px 12px;
border: 1px solid #ddd;
border-radius: 4px;
font-size: 14px;
transition: border-color 0.3s;
box-sizing: border-box;
}
.form-grupo input:focus,
.form-grupo select:focus,
.form-grupo textarea:focus {
border-color: #007cba;
outline: none;
box-shadow: 0 0 0 1px #007cba;
}
.form-grupo textarea {
height: 80px;
resize: vertical;
}
.form-grupo small {
display: block;
margin-top: 5px;
color: #666;
font-style: italic;
}
.form-grupo input[type="checkbox"] {
margin-right: 8px;
}
.form-grupo label input[type="checkbox"] {
display: inline-block;
width: auto;
}
.form-acoes {
margin-top: 30px;
padding-top: 20px;
border-top: 1px solid #eee;
display: flex;
gap: 15px;
align-items: center;
}
.botao-submit {
background: #007cba;
color: white;
padding: 12px 25px;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 14px;
font-weight: 600;
transition: background 0.3s;
}
.botao-submit:hover {
background: #005a87;
}
.botao-cancelar {
color: #666;
text-decoration: none;
padding: 10px 20px;
border: 1px solid #ddd;
border-radius: 4px;
font-size: 14px;
transition: all 0.3s;
}
.botao-cancelar:hover {
background: #f8f9fa;
color: #333;
}
/* Estilos para datalist */
datalist {
position: absolute;
background: white;
border: 1px solid #ddd;
border-radius: 4px;
max-height: 200px;
overflow-y: auto;
}
/* Responsividade */
@media (max-width: 768px) {
.form-parceiro {
padding: 20px;
margin: 0 10px;
}
.form-acoes {
flex-direction: column;
align-items: stretch;
}
.botao-submit,
.botao-cancelar {
text-align: center;
}
}
</style>
<script>
jQuery(document).ready(function($) {
// Máscara para telefone
$('#telefone').on('input', function() {
var valor = $(this).val().replace(/\D/g, '');
if (valor.length <= 10) {
valor = valor.replace(/(\d{2})(\d{4})(\d{0,4})/, '($1) $2-$3');
} else {
valor = valor.replace(/(\d{2})(\d{5})(\d{0,4})/, '($1) $2-$3');
}
$(this).val(valor);
});
// Validação do formulário
$('form').on('submit', function(e) {
var nome = $('#nome').val().trim();
if (nome === '') {
e.preventDefault();
alert('Por favor, preencha o nome do parceiro.');
$('#nome').focus();
return false;
}
// Validação do tamanho do arquivo
var logo = $('#logo')[0].files[0];
if (logo && logo.size > 2 * 1024 * 1024) {
e.preventDefault();
alert('O arquivo do logo é muito grande. O tamanho máximo permitido é 2MB.');
return false;
}
// Validação de e-mail se preenchido
var email = $('#email').val().trim();
if (email !== '' && !isValidEmail(email)) {
e.preventDefault();
alert('Por favor, insira um e-mail válido.');
$('#email').focus();
return false;
}
// Validação de URL se preenchido
var site = $('#site').val().trim();
if (site !== '' && !isValidURL(site)) {
e.preventDefault();
alert('Por favor, insira uma URL válida.');
$('#site').focus();
return false;
}
});
function isValidEmail(email) {
var regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
return regex.test(email);
}
function isValidURL(url) {
try {
new URL(url);
return true;
} catch (_) {
return false;
}
}
// Preview de imagem antes do upload
$('#logo').on('change', function(e) {
var input = this;
if (input.files && input.files[0]) {
var reader = new FileReader();
reader.onload = function(e) {
// Remove preview anterior se existir
$('.logo-preview').remove();
// Cria novo preview
var preview = $('<div class="logo-preview" style="margin-bottom: 10px;">' +
'<img src="' + e.target.result + '" alt="Preview" style="max-width: 150px; max-height: 100px; border: 1px solid #ddd; padding: 5px;">' +
'<br><small>Preview da nova logo</small>' +
'</div>');
$(input).before(preview);
};
reader.readAsDataURL(input.files[0]);
}
});
});
</script>

80
admin/lista-parceiros.php Normal file
View File

@@ -0,0 +1,80 @@
<div class="wrap">
<h1>Gerenciar Parceiros</h1>
<div class="search-box">
<label class="screen-reader-text" for="partner-search-input">Pesquisar Parceiros:</label>
<input type="search" id="partner-search-input" name="s" value="" placeholder="Pesquisar parceiros...">
<input type="submit" id="search-submit" class="button" value="Pesquisar">
</div>
<a href="<?php echo admin_url('admin.php?page=adicionar-parceiro'); ?>" class="botao-adicionar">Adicionar Novo Parceiro</a>
<?php if (isset($_GET['mensagem'])): ?>
<div class="notice notice-success is-dismissible">
<p>
<?php
switch ($_GET['mensagem']) {
case 'adicionado':
echo 'Parceiro adicionado com sucesso!';
break;
case 'editado':
echo 'Parceiro editado com sucesso!';
break;
case 'excluido':
echo 'Parceiro excluído com sucesso!';
break;
}
?>
</p>
</div>
<?php endif; ?>
<div class="parceiros-lista-admin">
<table>
<thead>
<tr>
<th>Nome</th>
<th>Setor</th>
<th>Categoria</th>
<th>Telefone</th>
<th>Email</th>
<th>Status</th>
<th>Ações</th>
</tr>
</thead>
<tbody>
<?php if (empty($parceiros)): ?>
<tr>
<td colspan="7" style="text-align: center;">Nenhum parceiro cadastrado.</td>
</tr>
<?php else: ?>
<?php foreach ($parceiros as $parceiro): ?>
<tr>
<td><?php echo esc_html($parceiro->nome); ?></td>
<td><?php echo esc_html($parceiro->setor); ?></td>
<td><?php echo esc_html($parceiro->categoria); ?></td>
<td><?php echo esc_html($parceiro->telefone); ?></td>
<td><?php echo esc_html($parceiro->email); ?></td>
<td><?php echo $parceiro->ativo ? 'Ativo' : 'Inativo'; ?></td>
<td>
<form method="post" action="<?php echo admin_url('admin-post.php'); ?>" style="display: inline;">
<input type="hidden" name="action" value="editar_parceiro">
<input type="hidden" name="id" value="<?php echo $parceiro->id; ?>">
<?php wp_nonce_field('editar_parceiro'); ?>
<button type="submit" class="acao-botao botao-editar">Editar</button>
</form>
<form method="post" action="<?php echo admin_url('admin-post.php'); ?>" style="display: inline;">
<input type="hidden" name="action" value="excluir_parceiro">
<input type="hidden" name="id" value="<?php echo $parceiro->id; ?>">
<?php wp_nonce_field('excluir_parceiro'); ?>
<button type="submit" class="acao-botao botao-excluir" onclick="return confirm('Tem certeza?')">Excluir</button>
</form>
</td>
</tr>
<?php endforeach; ?>
<?php endif; ?>
</tbody>
</table>
</div>
</div>

308
css/parceiros.css Normal file
View File

@@ -0,0 +1,308 @@
/* Sistema de Parceiros - Estilos Modernos */
.parceiros-container {
max-width: 1200px;
margin: 0 auto;
padding: 20px;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
}
.parceiros-filtros {
background: #f8f9fa;
padding: 20px;
border-radius: 10px;
margin-bottom: 30px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
.filtro-grupo {
margin-bottom: 15px;
}
.filtro-grupo label {
display: block;
margin-bottom: 5px;
font-weight: 600;
color: #333;
}
.filtro-grupo input,
.filtro-grupo select {
width: 100%;
padding: 10px;
border: 1px solid #ddd;
border-radius: 5px;
font-size: 14px;
}
.botao-filtrar {
background: #007cba;
color: white;
border: none;
padding: 10px 20px;
border-radius: 5px;
cursor: pointer;
font-size: 14px;
transition: background 0.3s;
}
.botao-filtrar:hover {
background: #005a87;
}
.grid-parceiros {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: 25px;
margin-top: 30px;
}
.card-parceiro {
background: white;
border-radius: 12px;
padding: 25px;
box-shadow: 0 4px 15px rgba(0,0,0,0.1);
transition: transform 0.3s, box-shadow 0.3s;
border: 1px solid #eaeaea;
}
.card-parceiro:hover {
transform: translateY(-5px);
box-shadow: 0 8px 25px rgba(0,0,0,0.15);
}
.parceiro-logo {
text-align: center;
margin-bottom: 20px;
}
.parceiro-logo img {
max-width: 120px;
max-height: 80px;
object-fit: contain;
}
.parceiro-logo .logo-placeholder {
width: 120px;
height: 80px;
background: #f0f0f0;
display: inline-flex;
align-items: center;
justify-content: center;
border-radius: 8px;
color: #999;
font-size: 12px;
}
.parceiro-nome {
font-size: 18px;
font-weight: 700;
color: #333;
margin-bottom: 15px;
text-align: center;
}
.parceiro-info {
margin-bottom: 12px;
display: flex;
align-items: flex-start;
}
.parceiro-info i {
width: 20px;
margin-right: 10px;
color: #007cba;
text-align: center;
}
.parceiro-setor,
.parceiro-categoria {
display: inline-block;
background: #e9f7fe;
color: #007cba;
padding: 4px 10px;
border-radius: 20px;
font-size: 12px;
margin-right: 8px;
margin-bottom: 8px;
}
.parceiro-acoes {
margin-top: 20px;
text-align: center;
}
.botao-contato {
display: inline-block;
background: #28a745;
color: white;
padding: 8px 16px;
border-radius: 5px;
text-decoration: none;
font-size: 14px;
transition: background 0.3s;
}
.botao-contato:hover {
background: #218838;
color: white;
}
.sem-parceiros {
text-align: center;
padding: 40px;
color: #666;
font-style: italic;
}
.search-box {
margin-bottom: 20px;
display: flex;
}
.search-box input[type="search"] {
flex-grow: 1;
padding: 10px;
border: 1px solid #ddd;
border-radius: 4px 0 0 4px;
}
.search-box input[type="submit"] {
background: #007cba;
color: white;
border-radius: 0 4px 4px 0;
}
/* Responsividade */
@media (max-width: 768px) {
.grid-parceiros {
grid-template-columns: 1fr;
}
.parceiros-filtros {
padding: 15px;
}
}
/* Admin Styles */
.wrap h1 {
color: #23282d;
}
.parceiros-lista-admin {
background: white;
border-radius: 8px;
overflow: hidden;
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
margin-bottom: 20px;
}
.parceiros-lista-admin table {
width: 100%;
border-collapse: collapse;
}
.parceiros-lista-admin th {
background: #f8f9fa;
padding: 15px;
text-align: left;
border-bottom: 1px solid #eaeaea;
font-weight: 600;
}
.parceiros-lista-admin td {
padding: 12px;
border-bottom: 1px solid #eaeaea;
}
.parceiros-lista-admin tr:hover {
background: #f8f9fa;
}
/* Melhorias responsivas para a tabela */
@media screen and (max-width: 782px) {
.parceiros-lista-admin table {
display: block;
overflow-x: auto; /* Adiciona barra de rolagem horizontal em telas pequenas */
white-space: nowrap; /* Evita que as células quebrem o layout */
}
}
.acao-botao {
padding: 6px 12px;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 12px;
margin-right: 5px;
text-decoration: none;
}
.botao-editar {
background: #007cba;
color: white;
}
.botao-excluir {
padding: 6px 12px;
border: none;
border-radius: 4px;
cursor: pointer;
background: #dc3545;
color: white;
}
.botao-adicionar {
background: #28a745;
color: white;
padding: 10px 20px;
text-decoration: none;
border-radius: 5px;
display: inline-block;
font-size: 14px;
margin-bottom: 20px;
}
.form-parceiro {
background: white;
padding: 30px;
border-radius: 8px;
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
max-width: 700px;
}
.form-grupo {
margin-bottom: 20px;
}
.form-grupo label {
display: block;
margin-bottom: 5px;
font-weight: 600;
}
.form-grupo input,
.form-grupo select,
.form-grupo textarea {
width: 100%;
padding: 8px 12px;
border: 1px solid #ddd;
border-radius: 4px;
font-size: 14px;
}
.form-grupo textarea {
height: 100px;
resize: vertical;
}
.botao-submit {
background: #007cba;
color: white;
padding: 10px 20px;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 14px;
}

48
js/parceiros.js Normal file
View File

@@ -0,0 +1,48 @@
jQuery(document).ready(function($) {
// Filtros em tempo real
$('#pesquisa-parceiros').on('input', function() {
filtrarParceiros();
});
$('#filtro-setor, #filtro-categoria').on('change', function() {
filtrarParceiros();
});
function filtrarParceiros() {
var pesquisa = $('#pesquisa-parceiros').val().toLowerCase();
var setor = $('#filtro-setor').val();
var categoria = $('#filtro-categoria').val();
$('.card-parceiro').each(function() {
var $card = $(this);
var nome = $card.find('.parceiro-nome').text().toLowerCase();
var cardSetor = $card.data('setor');
var cardCategoria = $card.data('categoria');
var correspondePesquisa = nome.indexOf(pesquisa) > -1 || pesquisa === '';
var correspondeSetor = setor === '' || cardSetor === setor;
var correspondeCategoria = categoria === '' || cardCategoria === categoria;
if (correspondePesquisa && correspondeSetor && correspondeCategoria) {
$card.show();
} else {
$card.hide();
}
});
// Mostrar mensagem se não houver resultados
var cardsVisiveis = $('.card-parceiro:visible').length;
if (cardsVisiveis === 0) {
$('.sem-parceiros').show();
} else {
$('.sem-parceiros').hide();
}
}
// Confirmação para exclusão
$('.botao-excluir').on('click', function(e) {
if (!confirm('Tem certeza que deseja excluir este parceiro?')) {
e.preventDefault();
}
});
});

359
sistema-parceiros.php Normal file
View File

@@ -0,0 +1,359 @@
<?php
/*
Plugin Name: Sistema de Parceiros
Description: Sistema para gerenciar parceiros/parcerias com filtros e shortcode
Version: 1.0
Author: Seu Nome
*/
// Evitar acesso direto
if (!defined('ABSPATH')) {
exit;
}
// Classe principal do plugin
class SistemaParceiros {
public function __construct() {
add_action('init', array($this, 'init'));
register_activation_hook(__FILE__, array($this, 'ativar_plugin'));
}
public function ativar_plugin() {
$this->criar_tabela_parceiros();
$this->inserir_dados_exemplo();
}
// Inicializar o plugin
public function init() {
add_action('wp_enqueue_scripts', array($this, 'carregar_recursos'));
add_shortcode('parceiros', array($this, 'shortcode_parceiros'));
// Para área administrativa
if (is_admin()) {
add_action('admin_menu', array($this, 'adicionar_menu_admin'));
add_action('admin_post_adicionar_parceiro', array($this, 'processar_form_adicionar'));
add_action('admin_post_editar_parceiro', array($this, 'processar_form_editar'));
add_action('admin_post_excluir_parceiro', array($this, 'processar_form_excluir'));
}
}
// Carregar CSS e JS
public function carregar_recursos() {
wp_enqueue_style('parceiros-css', plugin_dir_url(__FILE__) . 'css/parceiros.css');
wp_enqueue_script('parceiros-js', plugin_dir_url(__FILE__) . 'js/parceiros.js', array('jquery'), '1.0', true);
// Localizar script para AJAX
wp_localize_script('parceiros-js', 'parceiros_ajax', array(
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('parceiros_nonce')
));
}
// Criar tabela no banco de dados
private function criar_tabela_parceiros() {
global $wpdb;
$tabela_parceiros = $wpdb->prefix . 'parceiros';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $tabela_parceiros (
id mediumint(9) NOT NULL AUTO_INCREMENT,
nome varchar(255) NOT NULL,
logo varchar(255),
telefone varchar(20),
endereco text,
email varchar(100),
site varchar(255),
setor varchar(100),
categoria varchar(100),
ativo tinyint(1) DEFAULT 1,
data_criacao datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
}
// Inserir dados de exemplo
private function inserir_dados_exemplo() {
global $wpdb;
$tabela_parceiros = $wpdb->prefix . 'parceiros';
$parceiros_exemplo = array(
array(
'nome' => 'Empresa Tech Solutions',
'logo' => '',
'telefone' => '(11) 1234-5678',
'endereco' => 'Av. Paulista, 1000 - São Paulo, SP',
'email' => 'contato@techsolutions.com',
'site' => 'https://techsolutions.com',
'setor' => 'Tecnologia',
'categoria' => 'Desenvolvimento'
),
array(
'nome' => 'Marketing Digital Pro',
'logo' => '',
'telefone' => '(21) 9876-5432',
'endereco' => 'Rua do Ouvidor, 50 - Rio de Janeiro, RJ',
'email' => 'contato@marketingpro.com',
'site' => 'https://marketingpro.com',
'setor' => 'Marketing',
'categoria' => 'Digital'
)
);
foreach ($parceiros_exemplo as $parceiro) {
$wpdb->insert($tabela_parceiros, $parceiro);
}
}
// Shortcode para exibir parceiros
public function shortcode_parceiros($atts) {
$atts = shortcode_atts(array(
'categoria' => '',
'setor' => '',
'limite' => -1
), $atts);
ob_start();
$this->exibir_parceiros($atts);
return ob_get_clean();
}
// Exibir parceiros no frontend
private function exibir_parceiros($filtros = array()) {
global $wpdb;
$tabela_parceiros = $wpdb->prefix . 'parceiros';
// Construir query com filtros
$where = "WHERE ativo = 1";
if (!empty($filtros['categoria'])) {
$where .= $wpdb->prepare(" AND categoria = %s", $filtros['categoria']);
}
if (!empty($filtros['setor'])) {
$where .= $wpdb->prepare(" AND setor = %s", $filtros['setor']);
}
$limite = '';
if ($filtros['limite'] > 0) {
$limite = "LIMIT " . intval($filtros['limite']);
}
$parceiros = $wpdb->get_results("
SELECT * FROM $tabela_parceiros
$where
ORDER BY nome
$limite
");
// Obter setores e categorias únicas para os filtros
$setores = $wpdb->get_col("SELECT DISTINCT setor FROM $tabela_parceiros WHERE ativo = 1 AND setor != '' ORDER BY setor");
$categorias = $wpdb->get_col("SELECT DISTINCT categoria FROM $tabela_parceiros WHERE ativo = 1 AND categoria != '' ORDER BY categoria");
// Incluir template
include plugin_dir_path(__FILE__) . 'templates/lista-parceiros.php';
}
// Adicionar menu administrativo
public function adicionar_menu_admin() {
add_menu_page(
'Parceiros',
'Parceiros',
'manage_options',
'parceiros',
array($this, 'pagina_admin_parceiros'),
'dashicons-groups',
30
);
add_submenu_page(
'parceiros',
'Todos os Parceiros',
'Todos os Parceiros',
'manage_options',
'parceiros',
array($this, 'pagina_admin_parceiros')
);
add_submenu_page(
'parceiros',
'Adicionar Parceiro',
'Adicionar Parceiro',
'manage_options',
'adicionar-parceiro',
array($this, 'pagina_adicionar_parceiro')
);
}
// Página administrativa principal
public function pagina_admin_parceiros() {
global $wpdb;
$tabela_parceiros = $wpdb->prefix . 'parceiros';
$search_term = isset($_GET['s']) ? sanitize_text_field($_GET['s']) : '';
$sql = "SELECT * FROM $tabela_parceiros";
if (!empty($search_term)) {
$sql .= $wpdb->prepare(" WHERE nome LIKE '%%%s%%'", $search_term);
}
$sql .= " ORDER BY nome";
$parceiros = $wpdb->get_results($sql);
include plugin_dir_path(__FILE__) . 'admin/lista-parceiros.php';
}
// Página para adicionar parceiro
public function pagina_adicionar_parceiro() {
include plugin_dir_path(__FILE__) . 'admin/form-parceiro.php';
}
// Processar formulário de adicionar parceiro
public function processar_form_adicionar() {
if (!current_user_can('manage_options')) {
wp_die('Sem permissão');
}
check_admin_referer('adicionar_parceiro');
global $wpdb;
$tabela_parceiros = $wpdb->prefix . 'parceiros';
$dados = array(
'nome' => sanitize_text_field($_POST['nome']),
'telefone' => sanitize_text_field($_POST['telefone']),
'endereco' => sanitize_textarea_field($_POST['endereco']),
'email' => sanitize_email($_POST['email']),
'site' => esc_url_raw($_POST['site']),
'setor' => sanitize_text_field($_POST['setor']),
'categoria' => sanitize_text_field($_POST['categoria']),
'ativo' => isset($_POST['ativo']) ? 1 : 0
);
// Processar upload de logo
if (!empty($_FILES['logo']['name'])) {
$file = $_FILES['logo'];
$allowed_types = array('jpg' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'png' => 'image/png', 'gif' => 'image/gif');
$max_size = 2 * 1024 * 1024; // 2MB
// Validate file type
$file_type = wp_check_filetype($file['name']);
if (!array_key_exists($file_type['ext'], $allowed_types)) {
wp_die("Erro: Formato de arquivo inválido. Apenas JPG, PNG e GIF são permitidos.");
}
// Validate file size
if ($file['size'] > $max_size) {
wp_die("Erro: O arquivo é muito grande. O tamanho máximo permitido é 2MB.");
}
// Handle the upload
$upload = wp_handle_upload($file, array('test_form' => false));
if ($upload && !isset($upload['error'])) {
$dados['logo'] = $upload['url'];
} else
wp_die('Erro ao fazer upload do logo: ' . $upload['error']);
}
$wpdb->insert($tabela_parceiros, $dados);
wp_redirect(admin_url('admin.php?page=parceiros&mensagem=adicionado'));
exit;
}
// Processar formulário de editar parceiro
public function processar_form_editar() {
if (!current_user_can('manage_options')) {
wp_die('Sem permissão');
}
check_admin_referer('editar_parceiro');
global $wpdb;
$tabela_parceiros = $wpdb->prefix . 'parceiros';
$id = intval($_POST['id']);
$dados = array(
'nome' => sanitize_text_field($_POST['nome']),
'telefone' => sanitize_text_field($_POST['telefone']),
'endereco' => sanitize_textarea_field($_POST['endereco']),
'email' => sanitize_email($_POST['email']),
'site' => esc_url_raw($_POST['site']),
'setor' => sanitize_text_field($_POST['setor']),
'categoria' => sanitize_text_field($_POST['categoria']),
'ativo' => isset($_POST['ativo']) ? 1 : 0
);
// Processar upload de logo
if (!empty($_FILES['logo']['name'])) {
$file = $_FILES['logo'];
$allowed_types = array('jpg' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'png' => 'image/png', 'gif' => 'image/gif');
$max_size = 2 * 1024 * 1024; // 2MB
// Validate file type
$file_type = wp_check_filetype($file['name']);
if (!array_key_exists($file_type['ext'], $allowed_types)) {
wp_die("Erro: Formato de arquivo inválido. Apenas JPG, PNG e GIF são permitidos.");
}
// Validate file size
if ($file['size'] > $max_size) {
wp_die("Erro: O arquivo é muito grande. O tamanho máximo permitido é 2MB.");
}
// Handle the upload
$upload = wp_handle_upload($file, array('test_form' => false));
if ($upload && !isset($upload['error'])) {
$dados['logo'] = $upload['url'];
} else
wp_die('Erro ao fazer upload do logo: ' . $upload['error']);
}
$wpdb->update($tabela_parceiros, $dados, array('id' => $id));
wp_redirect(admin_url('admin.php?page=parceiros&mensagem=editado'));
exit;
}
// Processar exclusão de parceiro
public function processar_form_excluir() {
if (!current_user_can('manage_options')) {
wp_die('Sem permissão');
}
check_admin_referer('excluir_parceiro');
global $wpdb;
$tabela_parceiros = $wpdb->prefix . 'parceiros';
$id = intval($_POST['id']);
$wpdb->delete($tabela_parceiros, array('id' => $id));
wp_redirect(admin_url('admin.php?page=parceiros&mensagem=excluido'));
exit;
}
}
// Inicializar o plugin
new SistemaParceiros();
// Funções auxiliares
function obter_parceiros($filtros = array()) {
global $wpdb;
$tabela_parceiros = $wpdb->prefix . 'parceiros';
$where = "WHERE ativo = 1";
if (!empty($filtros['categoria'])) {
$where .= $wpdb->prepare(" AND categoria = %s", $filtros['categoria']);
}
if (!empty($filtros['setor'])) {
$where .= $wpdb->prepare(" AND setor = %s", $filtros['setor']);
}
return $wpdb->get_results("SELECT * FROM $tabela_parceiros $where ORDER BY nome");
}
?>

View File

@@ -0,0 +1,88 @@
<div class="parceiros-container">
<div class="parceiros-filtros">
<div class="filtro-grupo">
<label for="pesquisa-parceiros">Pesquisar Parceiro:</label>
<input type="text" id="pesquisa-parceiros" placeholder="Digite o nome do parceiro...">
</div>
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px;">
<div class="filtro-grupo">
<label for="filtro-setor">Filtrar por Setor:</label>
<select id="filtro-setor">
<option value="">Todos os Setores</option>
<?php foreach ($setores as $setor): ?>
<option value="<?php echo esc_attr($setor); ?>"><?php echo esc_html($setor); ?></option>
<?php endforeach; ?>
</select>
</div>
<div class="filtro-grupo">
<label for="filtro-categoria">Filtrar por Categoria:</label>
<select id="filtro-categoria">
<option value="">Todas as Categorias</option>
<?php foreach ($categorias as $categoria): ?>
<option value="<?php echo esc_attr($categoria); ?>"><?php echo esc_html($categoria); ?></option>
<?php endforeach; ?>
</select>
</div>
</div>
</div>
<?php if (empty($parceiros)): ?>
<div class="sem-parceiros">
Nenhum parceiro encontrado.
</div>
<?php else: ?>
<div class="grid-parceiros">
<?php foreach ($parceiros as $parceiro): ?>
<div class="card-parceiro" data-setor="<?php echo esc_attr($parceiro->setor); ?>" data-categoria="<?php echo esc_attr($parceiro->categoria); ?>">
<div class="parceiro-logo">
<?php if (!empty($parceiro->logo)): ?>
<img src="<?php echo esc_url($parceiro->logo); ?>" alt="<?php echo esc_attr($parceiro->nome); ?>">
<?php else: ?>
<div class="logo-placeholder">LOGO</div>
<?php endif; ?>
</div>
<h3 class="parceiro-nome"><?php echo esc_html($parceiro->nome); ?></h3>
<?php if (!empty($parceiro->setor)): ?>
<span class="parceiro-setor"><?php echo esc_html($parceiro->setor); ?></span>
<?php endif; ?>
<?php if (!empty($parceiro->categoria)): ?>
<span class="parceiro-categoria"><?php echo esc_html($parceiro->categoria); ?></span>
<?php endif; ?>
<div class="parceiro-info">
<i>📞</i>
<span><?php echo esc_html($parceiro->telefone); ?></span>
</div>
<?php if (!empty($parceiro->endereco)): ?>
<div class="parceiro-info">
<i>📍</i>
<span><?php echo esc_html($parceiro->endereco); ?></span>
</div>
<?php endif; ?>
<div class="parceiro-info">
<i>✉️</i>
<span><?php echo esc_html($parceiro->email); ?></span>
</div>
<?php if (!empty($parceiro->site)): ?>
<div class="parceiro-info">
<i>🌐</i>
<span><a href="<?php echo esc_url($parceiro->site); ?>" target="_blank">Visitar Site</a></span>
</div>
<?php endif; ?>
<div class="parceiro-acoes">
<a href="mailto:<?php echo esc_attr($parceiro->email); ?>" class="botao-contato">Entrar em Contato</a>
</div>
</div>
<?php endforeach; ?>
</div>
<?php endif; ?>
</div>