Gerador Profissional de Código Pixel Meta
-
-
Código copiado para a área de transferência!
`;
return code;
}
// Função para gerar código PHP do Conversions API
function generatePHPCode(pixelId, apiToken, events, enhancedTracking) {
let code = `event_source_url = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
$this->event_id = 'pixel_pro_' . uniqid() . '_' . time();
// Inicializar dados do usuário
$this->collectUserData();
}
/**
* Coleta dados básicos do usuário para Advanced Matching
*/
private function collectUserData() {
// Dados do cliente
$this->user_data = [
'client_ip_address' => $this->getClientIp(),
'client_user_agent' => $_SERVER['HTTP_USER_AGENT'] ?? null,
];
// Adicionar dados da sessão se disponíveis
if (isset($_SESSION['user_email'])) {
$this->user_data['em'] = hash('sha256', strtolower(trim($_SESSION['user_email'])));
}
if (isset($_SESSION['user_phone'])) {
$phone = preg_replace('/[^0-9]/', '', $_SESSION['user_phone']);
$this->user_data['ph'] = hash('sha256', $phone);
}
if (isset($_SESSION['user_first_name'])) {
$this->user_data['fn'] = hash('sha256', strtolower(trim($_SESSION['user_first_name'])));
}
if (isset($_SESSION['user_last_name'])) {
$this->user_data['ln'] = hash('sha256', strtolower(trim($_SESSION['user_last_name'])));
}
// Incluir external_id se houver (ID do cliente no seu sistema)
if (isset($_SESSION['user_id'])) {
$this->user_data['external_id'] = $_SESSION['user_id'];
}
// Coletar dados do POST para formulários
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$this->extractFormData($_POST);
}
}
/**
* Extrai e aplica hash em dados de formulário
*/
private function extractFormData($post_data) {
// Mapear campos comuns de formulários
$email_fields = ['email', 'user_email', 'your-email', 'email_address'];
$phone_fields = ['phone', 'user_phone', 'your-phone', 'telefone', 'phone_number'];
$fname_fields = ['first_name', 'fname', 'your-first-name', 'nome'];
$lname_fields = ['last_name', 'lname', 'your-last-name', 'sobrenome'];
// Verificar cada conjunto de campos possíveis
foreach ($email_fields as $field) {
if (!empty($post_data[$field])) {
$this->user_data['em'] = hash('sha256', strtolower(trim($post_data[$field])));
break;
}
}
foreach ($phone_fields as $field) {
if (!empty($post_data[$field])) {
$phone = preg_replace('/[^0-9]/', '', $post_data[$field]);
$this->user_data['ph'] = hash('sha256', $phone);
break;
}
}
foreach ($fname_fields as $field) {
if (!empty($post_data[$field])) {
$this->user_data['fn'] = hash('sha256', strtolower(trim($post_data[$field])));
break;
}
}
foreach ($lname_fields as $field) {
if (!empty($post_data[$field])) {
$this->user_data['ln'] = hash('sha256', strtolower(trim($post_data[$field])));
break;
}
}
// Se houver apenas um campo para nome completo, dividir em primeiro e último
if (empty($this->user_data['fn']) && empty($this->user_data['ln'])) {
$name_fields = ['name', 'your-name', 'full_name', 'fullname'];
foreach ($name_fields as $field) {
if (!empty($post_data[$field])) {
$name_parts = explode(' ', $post_data[$field]);
if (count($name_parts) > 0) {
$this->user_data['fn'] = hash('sha256', strtolower(trim($name_parts[0])));
if (count($name_parts) > 1) {
$this->user_data['ln'] = hash('sha256', strtolower(trim(end($name_parts))));
}
}
break;
}
}
}
}
/**
* Obtém o IP do cliente
*/
private function getClientIp() {
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
return $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
// Pode conter múltiplos IPs, pegar o primeiro
$ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
return trim($ips[0]);
} else {
return $_SERVER['REMOTE_ADDR'] ?? '';
}
}
/**
* Define dados personalizados para o evento
*/
public function setCustomData($data) {
$this->custom_data = array_merge($this->custom_data, $data);
return $this;
}
/**
* Define dados do usuário
*/
public function setUserData($data) {
// Valores que precisam de hash
$hash_fields = ['em', 'ph', 'fn', 'ln', 'ct', 'st', 'zp', 'country'];
foreach ($data as $key => $value) {
if (in_array($key, $hash_fields) && !empty($value)) {
// Aplicar limpeza e hash aos campos confidenciais
if ($key === 'em') { // Email
$this->user_data[$key] = hash('sha256', strtolower(trim($value)));
} elseif ($key === 'ph') { // Telefone
$phone = preg_replace('/[^0-9]/', '', $value);
$this->user_data[$key] = hash('sha256', $phone);
} else { // Outros campos
$this->user_data[$key] = hash('sha256', strtolower(trim($value)));
}
} else {
$this->user_data[$key] = $value;
}
}
return $this;
}
/**
* Envia um evento standard para o Meta
*/
public function trackEvent($event_name, $additional_data = []) {
// Verificar requisitos mínimos
if (empty($this->pixel_id) || empty($this->access_token)) {
return ['error' => 'Missing pixel_id or access_token'];
}
// Mesclar dados adicionais com os custom_data existentes
$this->custom_data = array_merge($this->custom_data, $additional_data);
// Construir payload do evento
$event = [
'event_name' => $event_name,
'event_time' => time(),
'event_id' => $this->event_id . '_' . $event_name,
'event_source_url' => $this->event_source_url,
'action_source' => 'website',
'user_data' => $this->user_data
];
// Adicionar custom_data se houver
if (!empty($this->custom_data)) {
$event['custom_data'] = $this->custom_data;
}
// Configurar e enviar a requisição
return $this->sendRequest([$event]);
}
/**
* Envia múltiplos eventos em um único lote
*/
public function trackBatchEvents($events) {
if (empty($events) || !is_array($events)) {
return ['error' => 'No events provided or invalid format'];
}
$formatted_events = [];
foreach ($events as $event) {
if (empty($event['event_name'])) {
continue;
}
$formatted_event = [
'event_name' => $event['event_name'],
'event_time' => $event['event_time'] ?? time(),
'event_id' => $event['event_id'] ?? $this->event_id . '_' . uniqid(),
'event_source_url' => $event['event_source_url'] ?? $this->event_source_url,
'action_source' => 'website',
'user_data' => $this->user_data
];
// Adicionar custom_data específico do evento
if (!empty($event['custom_data'])) {
$formatted_event['custom_data'] = $event['custom_data'];
}
$formatted_events[] = $formatted_event;
}
return $this->sendRequest($formatted_events);
}
/**
* Envia a requisição para a API do Meta
*/
private function sendRequest($events) {
$url = "https://graph.facebook.com/{$this->api_version}/{$this->pixel_id}/events?access_token={$this->access_token}";
$data = [
'data' => $events
];
// Inicializar cURL
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json'
]);
// Configurações adicionais para ambientes de produção
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
// Executar a requisição
$response = curl_exec($ch);
$error = curl_error($ch);
$status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
// Tratar resposta
if ($error) {
error_log("Meta Conversions API Error: " . $error);
return ['error' => $error];
}
return [
'status_code' => $status_code,
'response' => json_decode($response, true)
];
}
}
/**
* Exemplos de uso - descomente conforme necessário
*/
// === EXEMPLO 1: RASTREANDO PAGEVIEW ===
/*
$meta = new MetaConversionsAPI();
$result = $meta->trackEvent('PageView');
*/
// === EXEMPLO 2: RASTREANDO VISUALIZAÇÃO DE PRODUTO ===
/*
$meta = new MetaConversionsAPI();
$meta->setCustomData([
'content_name' => 'Nome do Produto',
'content_ids' => ['123456'],
'content_type' => 'product',
'value' => 99.90,
'currency' => 'BRL'
]);
$result = $meta->trackEvent('ViewContent');
*/
// === EXEMPLO 3: RASTREANDO COMPRA ===
/*
$meta = new MetaConversionsAPI();
// Definir dados do usuário para Advanced Matching
$meta->setUserData([
'em' => 'cliente@exemplo.com', // Será aplicado hash automaticamente
'ph' => '5511999999999', // Será aplicado hash automaticamente
'fn' => 'João', // Será aplicado hash automaticamente
'ln' => 'Silva' // Será aplicado hash automaticamente
]);
// Definir detalhes da compra
$meta->setCustomData([
'content_ids' => ['123', '456'],
'contents' => [
['id' => '123', 'quantity' => 1, 'item_price' => 49.90],
['id' => '456', 'quantity' => 2, 'item_price' => 29.90]
],
'value' => 109.70,
'currency' => 'BRL',
'num_items' => 3,
'order_id' => '100001'
]);
// Enviar o evento
$result = $meta->trackEvent('Purchase');
*/
// === EXEMPLO 4: RASTREANDO LEAD DE FORMULÁRIO ===
/*
$meta = new MetaConversionsAPI();
$meta->setCustomData([
'lead_type' => 'Formulário de Contato',
'content_name' => 'Página de Contato',
'form_id' => 'contact-form-7'
]);
$result = $meta->trackEvent('Lead');
*/
// === EXEMPLO 5: RASTREANDO MÚLTIPLOS EVENTOS EM LOTE ===
/*
$meta = new MetaConversionsAPI();
$events = [
[
'event_name' => 'PageView',
'event_time' => time()
],
[
'event_name' => 'ViewContent',
'event_time' => time(),
'custom_data' => [
'content_name' => 'Nome do Produto',
'content_ids' => ['123456'],
'content_type' => 'product'
]
]
];
$result = $meta->trackBatchEvents($events);
*/
// === IMPLEMENTAÇÃO PARA WOOCOMMERCE (EXEMPLO) ===
/*
// Rastrear Purchase em WooCommerce - coloque isto na página de agradecimento
if (function_exists('is_wc_endpoint_url') && is_wc_endpoint_url('order-received')) {
global $wp;
// Obter ID do pedido da URL
$order_id = absint($wp->query_vars['order-received']);
if ($order_id > 0) {
$order = wc_get_order($order_id);
// Verificar se o pedido existe e não foi rastreado ainda
if ($order && !get_post_meta($order_id, '_meta_purchase_tracked', true)) {
// Coletar itens do pedido
$contents = [];
$content_ids = [];
$num_items = 0;
foreach ($order->get_items() as $item) {
$product_id = $item->get_product_id();
$quantity = $item->get_quantity();
$price = $order->get_item_total($item);
$content_ids[] = (string)$product_id;
$contents[] = [
'id' => (string)$product_id,
'quantity' => $quantity,
'item_price' => $price
];
$num_items += $quantity;
}
// Inicializar API e enviar evento
$meta = new MetaConversionsAPI();
// Definir dados do cliente
$meta->setUserData([
'em' => $order->get_billing_email(),
'ph' => $order->get_billing_phone(),
'fn' => $order->get_billing_first_name(),
'ln' => $order->get_billing_last_name(),
'st' => $order->get_billing_state(),
'ct' => $order->get_billing_city(),
'zp' => $order->get_billing_postcode()
]);
// Definir dados da compra
$meta->setCustomData([
'content_ids' => $content_ids,
'contents' => $contents,
'value' => (float)$order->get_total(),
'currency' => $order->get_currency(),
'num_items' => $num_items,
'order_id' => $order->get_order_number()
]);
// Enviar evento
$result = $meta->trackEvent('Purchase');
// Marcar como rastreado para evitar duplicação
update_post_meta($order_id, '_meta_purchase_tracked', true);
}
}
}
*/
?>`;
return code;
}
});