if (!defined('FRIALTO_VERSION')) define('FRIALTO_VERSION', '1.0.0'); /* ============================================================ * FRIALTO — HELLO CHILD FUNCTIONS * Base lógica preservada / camada visual nova * ============================================================ */ /* ============================================================ * 1) CONSTANTES * ============================================================ */ if (!defined('FRIALTO_VERSION')) define('FRIALTO_VERSION', '1.0.0'); if (!defined('FRIALTO_API_TOKEN')) define('FRIALTO_API_TOKEN', 'frialto-uvgaJ3H00EK446KpvCJLDRfyvqSqRoWmWnfAOpFeISGuHhK4mpUncrvvY8QQxSuW'); /* TESTE TEMPORÁRIO */ if (!defined('FRIALTO_N8N_WEBHOOK_URL')) define('FRIALTO_N8N_WEBHOOK_URL', 'https://hooktest.dev/api/hook/85plYBAt'); * 2) SETUP DO TEMA FILHO * ============================================================ */ add_action('after_setup_theme', function () { add_theme_support('title-tag'); add_theme_support('post-thumbnails'); add_theme_support('woocommerce'); add_theme_support('wc-product-gallery-zoom'); add_theme_support('wc-product-gallery-lightbox'); add_theme_support('wc-product-gallery-slider'); register_nav_menus([ 'primary' => 'Menu Principal', 'footer' => 'Menu Rodapé', ]); }); /* ============================================================ * 3) ESTILO BÁSICO DO TEMA FILHO * ============================================================ */ add_action('wp_enqueue_scripts', function () { wp_enqueue_style( 'frialto-child-style', get_stylesheet_uri(), [], FRIALTO_VERSION ); wp_enqueue_style( 'frialto-fonts', 'https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700;800&display=swap', [], null ); wp_enqueue_style( 'frialto-fa', 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/all.min.css', [], '6.5.0' ); }, 20); /* ============================================================ * 4) UI / WOO BASE * ============================================================ */ add_filter('body_class', function ($classes) { $classes[] = 'frialto-app'; return $classes; }); add_filter('woocommerce_cart_use_blocks', '__return_false'); add_filter('woocommerce_checkout_use_blocks', '__return_false'); add_filter('woocommerce_show_page_title', function ($show) { if ( (function_exists('is_cart') && is_cart()) || (function_exists('is_checkout') && is_checkout()) || (function_exists('is_account_page') && is_account_page()) ) { return false; } return $show; }); /* ============================================================ * 5) CHECKOUT PAGE FORÇADA * ============================================================ */ add_action('init', function () { $page = get_page_by_path('finalizar'); if ($page && $page->ID) { update_option('woocommerce_checkout_page_id', (int) $page->ID); } }, 20); /* ============================================================ * 6) PEDIDOS — LIMITAR A 4 NA CONTA * ============================================================ */ add_filter('woocommerce_my_account_my_orders_query', function($args){ $args['posts_per_page'] = 4; return $args; }, 20); /* ============================================================ * 7) LOGIN OBRIGATÓRIO NO CHECKOUT * ============================================================ */ add_action('template_redirect', function() { if (is_checkout() && !is_user_logged_in()) { wp_redirect(site_url('/minha-conta/?redirect_to=' . urlencode(wc_get_checkout_url()))); exit; } }); /* ============================================================ * 8) CHECKOUT — AJUSTE DE CAMPOS * ============================================================ */ add_filter('woocommerce_checkout_fields', function ($fields) { if (isset($fields['billing']['billing_postcode'])) { $fields['billing']['billing_postcode']['priority'] = 5; $fields['billing']['billing_postcode']['label'] = 'CEP'; $fields['billing']['billing_postcode']['placeholder'] = 'Digite seu CEP'; } if (isset($fields['billing']['billing_first_name'])) { $fields['billing']['billing_first_name']['priority'] = 10; } if (isset($fields['billing']['billing_last_name'])) { $fields['billing']['billing_last_name']['priority'] = 20; } if (isset($fields['billing']['billing_phone'])) { $fields['billing']['billing_phone']['priority'] = 30; $fields['billing']['billing_phone']['required'] = true; } if (isset($fields['billing']['billing_email'])) { $fields['billing']['billing_email']['priority'] = 40; } if (isset($fields['billing']['billing_company'])) { $fields['billing']['billing_company']['priority'] = 45; $fields['billing']['billing_company']['required'] = false; } if (isset($fields['billing']['billing_cpf_cnpj'])) { $fields['billing']['billing_cpf_cnpj']['priority'] = 50; } if (isset($fields['billing']['billing_address_1'])) { $fields['billing']['billing_address_1']['priority'] = 60; } if (isset($fields['billing']['billing_number'])) { $fields['billing']['billing_number']['priority'] = 70; } if (isset($fields['billing']['billing_neighborhood'])) { $fields['billing']['billing_neighborhood']['priority'] = 80; } if (isset($fields['billing']['billing_city'])) { $fields['billing']['billing_city']['priority'] = 90; } if (isset($fields['billing']['billing_state'])) { $fields['billing']['billing_state']['priority'] = 100; } return $fields; }, 30); /* ============================================================ * 9) NORMALIZAÇÃO DE TELEFONE * ============================================================ */ add_filter('woocommerce_checkout_posted_data', function ($data) { if (!empty($data['billing_phone'])) { $phone = preg_replace('/\D+/', '', $data['billing_phone']); if (substr($phone, 0, 2) !== '55') { $phone = '55' . $phone; } $data['billing_phone'] = $phone; } return $data; }); /* ============================================================ * 10) PAGAMENTO — REMOVER DESCRIÇÃO DO COD * ============================================================ */ add_filter('woocommerce_available_payment_gateways', function($gateways){ if (isset($gateways['cod'])) { $gateways['cod']->description = ''; } return $gateways; }); /* ============================================================ * 11) STATUS CUSTOMIZADOS * ============================================================ */ add_action('init', function () { register_post_status('wc-separado', array( 'label' => 'Separação concluída', 'public' => true, 'show_in_admin_all_list' => true, 'show_in_admin_status_list' => true, 'label_count' => _n_noop( 'Separação concluída <span class="count">(%s)</span>', 'Separação concluída <span class="count">(%s)</span>' ), )); register_post_status('wc-faturado', array( 'label' => 'Produto faturado', 'public' => true, 'show_in_admin_all_list' => true, 'show_in_admin_status_list' => true, 'label_count' => _n_noop( 'Produto faturado <span class="count">(%s)</span>', 'Produto faturado <span class="count">(%s)</span>' ), )); register_post_status('wc-entrega', array( 'label' => 'Saiu para entrega', 'public' => true, 'show_in_admin_all_list' => true, 'show_in_admin_status_list' => true, 'label_count' => _n_noop( 'Saiu para entrega <span class="count">(%s)</span>', 'Saiu para entrega <span class="count">(%s)</span>' ), )); }); add_filter('wc_order_statuses', function ($statuses) { $new_statuses = []; foreach ($statuses as $key => $label) { $new_statuses[$key] = $label; if ($key === 'wc-processing') { $new_statuses['wc-separado'] = 'Separação concluída'; $new_statuses['wc-faturado'] = 'Produto faturado'; $new_statuses['wc-entrega'] = 'Saiu para entrega'; } } if (isset($new_statuses['wc-pending'])) { $new_statuses['wc-pending'] = 'Novo pedido'; } return $new_statuses; }); /* ============================================================ * 12) WEBHOOK N8N * ============================================================ */ function frialto_map_status_for_webhook(string $status): string { $status_map = [ 'pending' => 'novo-pedido', 'processing' => 'em-processamento', 'separado' => 'separacao-concluida', 'separacao-concluida' => 'separacao-concluida', 'faturado' => 'produto-faturado', 'produto-faturado' => 'produto-faturado', 'entrega' => 'saiu-para-entrega', 'saiu-para-entrega' => 'saiu-para-entrega', 'cancelled' => 'cancelado', 'cancelado' => 'cancelado', 'aguardando' => 'aguardando', ]; return $status_map[$status] ?? $status; } /** * Define quais status podem disparar webhook. */ function frialto_allowed_statuses_for_webhook(): array { return [ 'pending', 'processing', 'separado', 'separacao-concluida', 'faturado', 'produto-faturado', 'entrega', 'saiu-para-entrega', 'cancelled', 'cancelado', 'aguardando', ]; } add_action('woocommerce_order_status_changed', function ($order_id, $old_status, $new_status, $order) { if (!$order instanceof WC_Order) { error_log('[FRIALTO WEBHOOK] Pedido inválido no hook.'); return; } if ($old_status === $new_status) { error_log('[FRIALTO WEBHOOK] Ignorado: status não mudou. Pedido #' . $order_id); return; } $allowed_statuses = frialto_allowed_statuses_for_webhook(); if (!in_array($new_status, $allowed_statuses, true)) { error_log('[FRIALTO WEBHOOK] Ignorado: status não permitido. Pedido #' . $order_id . ' | novo=' . $new_status); return; } if (empty(FRIALTO_N8N_WEBHOOK_URL)) { error_log('[FRIALTO WEBHOOK] URL do webhook vazia.'); return; } $status_payload = frialto_map_status_for_webhook($new_status); $phone = preg_replace('/\D+/', '', (string) $order->get_billing_phone()); if (empty($phone)) { error_log('[FRIALTO WEBHOOK] Telefone vazio. Pedido #' . $order_id); return; } if (strpos($phone, '55') !== 0) { $phone = '55' . $phone; } $items = []; foreach ($order->get_items() as $item) { $items[] = [ 'name' => $item->get_name(), 'qty' => (int) $item->get_quantity(), ]; } $payload = [ 'source' => 'frialto_woocommerce', 'event' => 'order_status_changed', 'order' => [ 'id' => (string) $order_id, 'status' => $status_payload, 'created_at' => $order->get_date_created() ? $order->get_date_created()->date('Y-m-d H:i:s') : '', 'total' => 'R$ ' . number_format((float) $order->get_total(), 2, ',', '.'), 'payment_method' => (string) $order->get_payment_method(), ], 'customer' => [ 'name' => (string) $order->get_formatted_billing_full_name(), 'phone' => (string) $phone, 'email' => (string) $order->get_billing_email(), ], 'items' => $items, 'dedupe_key' => $order_id . ':' . $status_payload, ]; error_log('[FRIALTO WEBHOOK] Payload pedido #' . $order_id . ': ' . wp_json_encode($payload)); $response = wp_remote_post(FRIALTO_N8N_WEBHOOK_URL, [ 'method' => 'POST', 'timeout' => 20, 'redirection' => 3, 'blocking' => true, 'headers' => [ 'Content-Type' => 'application/json', 'X-Frialto-Token' => FRIALTO_API_TOKEN, ], 'body' => wp_json_encode($payload), ]); if (is_wp_error($response)) { error_log('[FRIALTO WEBHOOK] WP_ERROR pedido #' . $order_id . ': ' . $response->get_error_message()); return; } $http_code = wp_remote_retrieve_response_code($response); $body = wp_remote_retrieve_body($response); error_log('[FRIALTO WEBHOOK] HTTP pedido #' . $order_id . ': ' . $http_code); error_log('[FRIALTO WEBHOOK] BODY pedido #' . $order_id . ': ' . $body); if ($http_code < 200 || $http_code >= 300) { error_log('[FRIALTO WEBHOOK] ERRO HTTP pedido #' . $order_id . ': resposta fora de 2xx.'); return; } error_log('[FRIALTO WEBHOOK] SUCESSO pedido #' . $order_id . ' | ' . $old_status . ' → ' . $new_status . ' | payload_status=' . $status_payload); }, 10, 4); /* ============================================================ * 13) HELPERS — BOVINOS * ============================================================ */ if (!function_exists('frialto_is_beef')) { function frialto_is_beef($product_id) { if (!$product_id) return false; $terms = get_the_terms($product_id, 'product_cat'); if (!$terms || is_wp_error($terms)) return false; foreach ($terms as $term) { if ($term->slug === 'carnes-bovinas') return true; while (!empty($term->parent)) { $term = get_term($term->parent, 'product_cat'); if ($term && !is_wp_error($term) && $term->slug === 'carnes-bovinas') return true; } } return false; } } if (!function_exists('frialto_get_peso_medio')) { function frialto_get_peso_medio($product_id, $parent_id = 0) { $peso = get_post_meta($product_id, 'peso_medio', true); if ($peso !== '' && $peso !== null) return (float) $peso; if ($parent_id) { $peso2 = get_post_meta($parent_id, 'peso_medio', true); if ($peso2 !== '' && $peso2 !== null) return (float) $peso2; } return 0.0; } } if (!function_exists('frialto_get_valor_medio_peca')) { function frialto_get_valor_medio_peca($product_id, $parent_id = 0) { $v = get_post_meta($product_id, 'valor_medio_peca', true); if ($v !== '' && $v !== null) return (float) $v; if ($parent_id) { $v2 = get_post_meta($parent_id, 'valor_medio_peca', true); if ($v2 !== '' && $v2 !== null) return (float) $v2; } return 0.0; } } /* ============================================================ * 14) PRODUTOS BOVINOS — SINCRONIZAÇÃO * ============================================================ */ add_action('save_post_product', function ($post_id, $post, $update) { if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return; if (wp_is_post_revision($post_id)) return; if (!$post || $post->post_type !== 'product') return; static $running = false; if ($running) return; $running = true; if (!has_term('carnes-bovinas', 'product_cat', $post_id)) { $running = false; return; } $product = wc_get_product($post_id); if (!$product) { $running = false; return; } $preco_por_kg = (float) $product->get_price(); if ($preco_por_kg <= 0) { $running = false; return; } $decimals = function_exists('wc_get_price_decimals') ? (int) wc_get_price_decimals() : 2; $peso_medio = (float) get_post_meta($post_id, 'peso_medio', true); $valor_medio_peca = (float) get_post_meta($post_id, 'valor_medio_peca', true); if ($peso_medio > 0) { $calc = round($preco_por_kg * $peso_medio, $decimals); update_post_meta($post_id, 'valor_medio_peca', $calc); } elseif ($valor_medio_peca > 0) { $calc = $valor_medio_peca / $preco_por_kg; $calc = round($calc, 3); update_post_meta($post_id, 'peso_medio', $calc); } $running = false; }, 30, 3); /* sincronização alternativa sensatta → jetengine */ add_action('save_post_product', function ($post_id, $post, $update) { if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return; if (wp_is_post_revision($post_id)) return; if (!$post || $post->post_type !== 'product') return; if (!has_term('carnes-bovinas', 'product_cat', $post_id)) return; $product = wc_get_product($post_id); if (!$product) return; $preco = (float) $product->get_price(); $peso = get_post_meta($post_id, '_weight', true) ?: get_post_meta($post_id, 'peso', true); if ($preco <= 0 || $peso <= 0) return; update_post_meta($post_id, 'peso_medio', $peso); update_post_meta($post_id, 'valor_medio_peca', $preco * $peso); }, 40, 3); /* ============================================================ * 15) CARRINHO — PREÇO REAL DOS BOVINOS * CORRIGIDO PARA PEGAR O PREÇO ATIVO (COM OFERTA) * ============================================================ */ add_action('woocommerce_before_calculate_totals', function ($cart) { if (is_admin() && !defined('DOING_AJAX')) return; if (!$cart || !is_a($cart, 'WC_Cart')) return; foreach ($cart->get_cart() as $cart_item_key => $cart_item) { if (empty($cart_item['data']) || !is_a($cart_item['data'], 'WC_Product')) continue; $product = $cart_item['data']; $product_id = (int) ($cart_item['product_id'] ?? 0); $variation_id = (int) ($cart_item['variation_id'] ?? 0); $check_id = $variation_id ? $product_id : ($product_id ?: (int) $product->get_id()); if (!$check_id || !frialto_is_beef($check_id)) continue; $meta_id = $variation_id ?: $product_id; $parent_id = $variation_id ? $product_id : 0; /* pega o produto original novamente para ler o preço real ativo */ $source_product = wc_get_product($meta_id ?: $product_id); if (!$source_product) continue; /* preço ativo: se estiver em oferta, pega o valor promocional */ $preco_por_kg = (float) $source_product->get_price(); /* fallback de segurança */ if ($preco_por_kg <= 0) { $preco_por_kg = (float) $source_product->get_regular_price(); } if ($preco_por_kg <= 0) continue; $peso_medio = frialto_get_peso_medio($meta_id, $parent_id); $valor_medio_peca = frialto_get_valor_medio_peca($meta_id, $parent_id); /* * Regra: * - se existir valor_medio_peca salvo, ele vira referência * - mas se houver preço promocional ativo, recalcula com o peso médio * para não mostrar um valor e cobrar outro */ if ($peso_medio > 0) { $preco_medio_peca = round($preco_por_kg * $peso_medio, 2); } elseif ($valor_medio_peca > 0) { $preco_medio_peca = round($valor_medio_peca, 2); $peso_medio = round($preco_medio_peca / $preco_por_kg, 3); } else { continue; } if ($preco_medio_peca <= 0) continue; $product->set_price($preco_medio_peca); $cart_item['data']->set_price($preco_medio_peca); $cart_item['fr_preco_por_kg'] = $preco_por_kg; $cart_item['fr_peso_medio'] = (float) $peso_medio; $cart_item['fr_preco_medio_peca'] = (float) $preco_medio_peca; $cart->cart_contents[$cart_item_key] = $cart_item; } }, 20, 1); /* ============================================================ * 16) BOVINOS — EXIBIÇÃO NO CARRINHO / CHECKOUT * ============================================================ */ add_action('woocommerce_after_cart_item_name', 'frialto_render_cart_beef_info_card', 20, 2); add_action('woocommerce_after_checkout_cart_item_quantity', 'frialto_render_checkout_beef_info_card', 20, 2); if (!function_exists('frialto_render_cart_beef_info_card')) { function frialto_render_cart_beef_info_card($cart_item, $cart_item_key) { if (is_admin()) return; $product = $cart_item['data'] ?? null; if (!$product || !is_a($product, 'WC_Product')) return; $product_id = (int) ($cart_item['product_id'] ?? 0); $variation_id = (int) ($cart_item['variation_id'] ?? 0); $qty = (int) ($cart_item['quantity'] ?? 1); $check_id = $variation_id ? $product_id : $product_id; if (!$check_id || !frialto_is_beef($check_id)) return; $preco_por_kg = (float) ($cart_item['fr_preco_por_kg'] ?? $product->get_price()); $peso_medio = (float) ($cart_item['fr_peso_medio'] ?? 0); $preco_peca = (float) ($cart_item['fr_preco_medio_peca'] ?? 0); $peso_estimado = $peso_medio > 0 ? $peso_medio * $qty : 0; $valor_estimado = $preco_peca > 0 ? $preco_peca * $qty : 0; ?> <div class="fr-cart-info-card"> <ul class="fr-cart-info-list"> <li> <strong>Preço por kg:</strong> <span><?php echo $preco_por_kg > 0 ? wc_price($preco_por_kg) . '/kg' : '—'; ?></span> </li> <li> <strong>Peso médio da peça:</strong> <span><?php echo $peso_medio > 0 ? number_format($peso_medio, 3, ',', '.') . ' kg' : '—'; ?></span> </li> <li> <strong>Preço médio da peça:</strong> <span><?php echo $preco_peca > 0 ? wc_price($preco_peca) : '—'; ?></span> </li> <li> <strong>Estimativa (<?php echo $qty; ?> un.):</strong> <span> <?php echo $valor_estimado > 0 ? wc_price($valor_estimado) : '—'; if ($peso_estimado > 0) { echo ' · ~' . number_format($peso_estimado, 3, ',', '.') . ' kg'; } ?> </span> </li> </ul> </div> <?php } } if (!function_exists('frialto_render_checkout_beef_info_card')) { function frialto_render_checkout_beef_info_card($cart_item, $cart_item_key) { frialto_render_cart_beef_info_card($cart_item, $cart_item_key); } } /* ============================================================ * 17) GRAVAR METAS DOS BOVINOS NO PEDIDO * ============================================================ */ add_action('woocommerce_checkout_create_order_line_item', function ($item, $cart_item_key, $values, $order) { $product = $values['data'] ?? null; if (!$product || !is_a($product, 'WC_Product')) return; $product_id = (int) ($values['product_id'] ?? 0); $variation_id = (int) ($values['variation_id'] ?? 0); $check_id = $variation_id ? $product_id : ($product_id ?: (int) $product->get_id()); if (!$check_id || !frialto_is_beef($check_id)) return; $preco_por_kg = (float) ($values['fr_preco_por_kg'] ?? 0); if ($preco_por_kg <= 0) $preco_por_kg = (float) $product->get_price(); $peso_medio = (float) ($values['fr_peso_medio'] ?? 0); $preco_medio_peca = (float) ($values['fr_preco_medio_peca'] ?? 0); if ($preco_medio_peca <= 0) $preco_medio_peca = (float) $product->get_price(); $item->add_meta_data('_fr_preco_por_kg', $preco_por_kg, true); $item->add_meta_data('_fr_peso_medio', $peso_medio, true); $item->add_meta_data('_fr_preco_medio_peca', $preco_medio_peca, true); $item->add_meta_data('_fr_obs_pesagem', 'Valor estimado (peso médio × preço/kg). Confirmar após pesagem.', true); }, 20, 4); /* ============================================================ * 18) REPEAT ORDER * ============================================================ */ add_action('template_redirect', function () { if (!isset($_GET['fr_repeat_order'], $_GET['_wpnonce'])) return; if (!function_exists('wc_get_order') || !function_exists('WC')) return; $order_id = absint($_GET['fr_repeat_order']); if (!$order_id) return; if (!wp_verify_nonce($_GET['_wpnonce'], 'fr_repeat_order_' . $order_id)) { return; } $order = wc_get_order($order_id); if (!$order) return; if ((int) $order->get_user_id() !== get_current_user_id()) return; if (!WC()->cart) return; foreach ($order->get_items() as $item) { if (!$item || !is_a($item, 'WC_Order_Item_Product')) continue; $product_id = $item->get_product_id(); $variation_id = $item->get_variation_id(); $quantity = (int) $item->get_quantity(); if (!$product_id || $quantity < 1) continue; $variation = []; if ($variation_id) { $variation_product = wc_get_product($variation_id); if ($variation_product && $variation_product->is_type('variation')) { $variation = $variation_product->get_variation_attributes(); } } WC()->cart->add_to_cart( $product_id, $quantity, $variation_id, $variation, [] ); } wp_safe_redirect(wc_get_cart_url()); exit; }, 20); /* ============================================================ * 19) SHORTCODES — PRODUTO BOVINO / PRODUTO PADRÃO * ============================================================ */ add_shortcode('fr_beef_ux_card', function () { if (!function_exists('is_product') || !is_product()) return ''; global $product; if (!$product || !is_a($product, 'WC_Product')) return ''; $product_id = (int) $product->get_id(); if (!has_term('carnes-bovinas', 'product_cat', $product_id)) return ''; $preco_por_kg = (float) $product->get_price(); $peso_medio = (float) get_post_meta($product_id, 'peso_medio', true); $valor_medio_peca = (float) get_post_meta($product_id, 'valor_medio_peca', true); if ($valor_medio_peca <= 0 && $preco_por_kg > 0 && $peso_medio > 0) { $valor_medio_peca = $preco_por_kg * $peso_medio; } if ($preco_por_kg <= 0 && $peso_medio <= 0 && $valor_medio_peca <= 0) return ''; $fmt_preco_kg = $preco_por_kg > 0 ? wc_price($preco_por_kg) . '/kg' : '—'; $fmt_peso = $peso_medio > 0 ? number_format($peso_medio, 3, ',', '.') . ' kg' : '—'; $fmt_valor = $valor_medio_peca > 0 ? wc_price($valor_medio_peca) : '—'; $sku = $product->get_sku(); $codigo_produto = $sku ? $sku : '—'; ob_start(); ?> <div class="fr-ux"> <div class="fr-badge">📦 Código do produto: <?php echo esc_html($codigo_produto); ?></div> <div class="fr-price"><?php echo wp_kses_post($fmt_valor); ?></div> <div class="fr-sub"> Valor estimado da peça inteira com base no peso médio e no preço por kg. </div> <div class="fr-cards"> <div class="fr-card"> <div class="fr-label">Peso médio da peça</div> <div class="fr-value">~<?php echo esc_html($fmt_peso); ?></div> </div> <div class="fr-card"> <div class="fr-label">Preço por kg</div> <div class="fr-value"><?php echo wp_kses_post($fmt_preco_kg); ?></div> </div> </div> <div class="fr-trust"> <div class="fr-trust-btn">🥩 Corte selecionado</div> <div class="fr-trust-btn">📦 Embalagem segura</div> <div class="fr-trust-btn">🚚 Entrega refrigerada</div> </div> <div class="fr-note"> O valor final pode variar conforme o peso real da peça no preparo. </div> </div> <?php return ob_get_clean(); }); add_shortcode('fr_produto_padrao', function () { if (!is_product()) return ''; global $product; if (!$product || !is_a($product, 'WC_Product')) return ''; $product_id = (int) $product->get_id(); if (has_term('carnes-bovinas', 'product_cat', $product_id)) return ''; $preco = (float) $product->get_price(); if ($preco <= 0) return ''; $fmt_preco = wc_price($preco); $sku = $product->get_sku(); $codigo_produto = $sku ? $sku : '—'; $descricao = $product->get_short_description(); ob_start(); ?> <div class="fr-ux"> <div class="fr-badge">📦 Código do produto: <?php echo esc_html($codigo_produto); ?></div> <div class="fr-price"><?php echo wp_kses_post($fmt_preco); ?></div> <div class="fr-sub">Produto com preço fixo.</div> <div class="fr-trust"> <div class="fr-trust-btn">📦 Produto bem embalado</div> <div class="fr-trust-btn">🚚 Entrega rápida</div> <div class="fr-trust-btn">🔒 Compra segura</div> </div> <?php if ($descricao): ?> <div class="fr-note"><?php echo wp_kses_post($descricao); ?></div> <?php endif; ?> </div> <?php return ob_get_clean(); }); /* ============================================================ * 20) CONTA / PEDIDOS * ============================================================ */ add_shortcode('frialto_account', function() { if (is_user_logged_in()) { return do_shortcode('[elementor-template id="2715"]'); } else { return do_shortcode('[woocommerce_my_account]'); } }); function frialto_orders_columns($columns){ return [ 'order-number' => 'Pedido', 'order-date' => 'Data', 'order-status' => 'Status', 'order-total' => 'Total', 'order-actions'=> 'Ações', ]; } add_filter('woocommerce_account_orders_columns', 'frialto_orders_columns'); function frialto_status_name($status){ switch($status){ case 'Processing': return 'Em preparo'; case 'Completed': return 'Entregue'; case 'On hold': return 'Aguardando'; default: return $status; } } add_filter('woocommerce_order_status_name', 'frialto_status_name'); function frialto_add_reorder_button($actions, $order){ $actions['reorder'] = [ 'url' => wp_nonce_url( add_query_arg('fr_repeat_order', $order->get_id(), wc_get_cart_url()), 'fr_repeat_order_' . $order->get_id() ), 'name' => 'Comprar novamente' ]; if (isset($actions['pay'])) { unset($actions['pay']); } return $actions; } add_filter('woocommerce_my_account_my_orders_actions', 'frialto_add_reorder_button', 10, 2); /* ============================================================ * 21) DETALHE DO PEDIDO — BOVINOS * ============================================================ */ add_filter('woocommerce_order_item_name', function ($item_name, $item, $is_visible) { if (is_admin()) return $item_name; if (!function_exists('is_account_page') || !is_account_page()) return $item_name; if (!$item || !is_a($item, 'WC_Order_Item_Product')) return $item_name; $preco_por_kg = (float) $item->get_meta('_fr_preco_por_kg', true); $peso_medio = (float) $item->get_meta('_fr_peso_medio', true); $preco_medio_peca = (float) $item->get_meta('_fr_preco_medio_peca', true); if ($preco_por_kg <= 0 && $peso_medio <= 0 && $preco_medio_peca <= 0) { return $item_name; } ob_start(); ?> <div class="fr-order-item-beef-meta"> <div class="fr-order-item-beef-row"> <span>Preço por kg</span> <strong><?php echo $preco_por_kg > 0 ? wc_price($preco_por_kg) . '/kg' : '—'; ?></strong> </div> <div class="fr-order-item-beef-row"> <span>Peso médio da peça</span> <strong><?php echo $peso_medio > 0 ? number_format($peso_medio, 3, ',', '.') . ' kg' : '—'; ?></strong> </div> <div class="fr-order-item-beef-row"> <span>Preço médio da peça</span> <strong><?php echo $preco_medio_peca > 0 ? wc_price($preco_medio_peca) : '—'; ?></strong> </div> </div> <?php return $item_name . ob_get_clean(); }, 20, 3); /* ============================================================ * 22) METAS FORMATADAS NO ADMIN * ============================================================ */ add_filter('woocommerce_order_item_get_formatted_meta_data', function($formatted_meta, $item){ foreach($formatted_meta as $key => $meta){ switch($meta->key){ case '_fr_preco_por_kg': $meta->display_key = 'Preço por kg'; $meta->display_value = wc_price($meta->value) . '/kg'; break; case '_fr_peso_medio': $meta->display_key = 'Peso médio estimado'; $meta->display_value = '~' . number_format($meta->value, 2, ',', '.') . ' kg'; break; case '_fr_preco_medio_peca': $meta->display_key = 'Preço médio da peça'; $meta->display_value = wc_price($meta->value); break; case '_fr_obs_pesagem': $meta->display_key = 'Observação'; $meta->display_value = '⚠ Produto vendido por peso. Valor final pode variar após pesagem.'; break; } } return $formatted_meta; }, 10, 2); /* ============================================================ * HOME — SHORTCODE PEDIDOS RECENTES * ============================================================ */ add_shortcode('fr_recent_orders_home', function () { if (!is_user_logged_in()) { return '<div class="fr-home-orders-empty">Faça login para ver seus pedidos recentes.</div>'; } $orders = wc_get_orders([ 'customer' => get_current_user_id(), 'limit' => 4, 'orderby' => 'date', 'order' => 'DESC', ]); if (empty($orders)) { return '<div class="fr-home-orders-empty">Você ainda não fez nenhum pedido.</div>'; } ob_start(); ?> <div class="fr-home-orders-grid"> <?php foreach ($orders as $order) : $order_id = $order->get_id(); $number = $order->get_order_number(); $date = $order->get_date_created(); $status = wc_get_order_status_name($order->get_status()); $total = wp_strip_all_tags($order->get_formatted_order_total()); $view_url = $order->get_view_order_url(); $again_url = wp_nonce_url( add_query_arg('fr_repeat_order', $order_id, wc_get_cart_url()), 'fr_repeat_order_' . $order_id ); ?> <article class="fr-home-order-card"> <div class="fr-home-order-card__top"> <strong>Pedido #<?php echo esc_html($number); ?></strong> <span><?php echo esc_html(wc_format_datetime($date, 'd/m/Y')); ?></span> </div> <div class="fr-home-order-card__status"> <?php echo esc_html($status); ?> </div> <div class="fr-home-order-card__total"> <?php echo esc_html($total); ?> </div> <div class="fr-home-order-card__actions"> <a href="<?php echo esc_url($view_url); ?>" class="fr-home-order-btn fr-home-order-btn--ghost"> Ver detalhes </a> <a href="<?php echo esc_url($again_url); ?>" class="fr-home-order-btn fr-home-order-btn--primary"> Repetir pedido </a> </div> </article> <?php endforeach; ?> </div> <?php return ob_get_clean(); }); add_action('pre_get_posts', function($query) { if (is_admin() || !$query->is_main_query()) return; if (!function_exists('is_shop')) return; if (is_shop() || is_product_taxonomy() || is_page('catalogo')) { if (!empty($_GET['orderby'])) { $orderby = sanitize_text_field($_GET['orderby']); if ($orderby === 'price') { $query->set('meta_key', '_price'); $query->set('orderby', 'meta_value_num'); $query->set('order', 'ASC'); } if ($orderby === 'price-desc') { $query->set('meta_key', '_price'); $query->set('orderby', 'meta_value_num'); $query->set('order', 'DESC'); } } } }); add_action('woocommerce_after_checkout_cart_item_quantity', function($cart_item, $cart_item_key){ $product = $cart_item['data'] ?? null; if (!$product || !is_a($product, 'WC_Product')) return; $product_id = (int) ($cart_item['product_id'] ?? 0); $variation_id = (int) ($cart_item['variation_id'] ?? 0); $check_id = $variation_id ? $product_id : $product_id; if (!function_exists('frialto_is_beef') || !$check_id || !frialto_is_beef($check_id)) return; $preco_por_kg = (float) ($cart_item['fr_preco_por_kg'] ?? 0); $peso_medio = (float) ($cart_item['fr_peso_medio'] ?? 0); $preco_peca = (float) ($cart_item['fr_preco_medio_peca'] ?? 0); $qty = (int) ($cart_item['quantity'] ?? 1); $peso_estimado = $peso_medio > 0 ? $peso_medio * $qty : 0; $valor_estimado = $preco_peca > 0 ? $preco_peca * $qty : 0; echo '<div class="fr-cart-info-card">'; echo '<ul class="fr-cart-info-list">'; echo '<li><strong>Preço por kg:</strong><span>' . ($preco_por_kg > 0 ? wc_price($preco_por_kg) . '/kg' : '—') . '</span></li>'; echo '<li><strong>Peso médio da peça:</strong><span>' . ($peso_medio > 0 ? number_format($peso_medio, 3, ',', '.') . ' kg' : '—') . '</span></li>'; echo '<li><strong>Preço médio da peça:</strong><span>' . ($preco_peca > 0 ? wc_price($preco_peca) : '—') . '</span></li>'; $estimativa = $valor_estimado > 0 ? wc_price($valor_estimado) : '—'; if ($peso_estimado > 0) { $estimativa .= ' · ~' . number_format($peso_estimado, 3, ',', '.') . ' kg'; } echo '<li><strong>Estimativa (' . $qty . ' un.):</strong><span>' . $estimativa . '</span></li>'; echo '</ul>'; echo '</div>'; }, 20, 2); add_filter('woocommerce_add_to_cart_fragments', function ($fragments) { ob_start(); ?> <span class="fr-header-cart-count"> <?php echo WC()->cart ? WC()->cart->get_cart_contents_count() : 0; ?> </span> <?php $fragments['.fr-header-cart-count'] = ob_get_clean(); return $fragments; }); add_filter('woocommerce_checkout_fields', function ($fields) { if (isset($fields['billing']['billing_cellphone'])) { $fields['billing']['billing_cellphone']['required'] = false; $fields['billing']['billing_cellphone']['class'] = ['form-row-wide']; } if (isset($fields['billing']['billing_celular'])) { $fields['billing']['billing_celular']['required'] = false; $fields['billing']['billing_celular']['class'] = ['form-row-wide']; } if (isset($fields['billing']['billing_phone'])) { $fields['billing']['billing_phone']['label'] = 'Celular'; $fields['billing']['billing_phone']['required'] = true; } return $fields; }, 9999); add_action('woocommerce_after_order_itemmeta', function ($item_id, $item, $product) { if (!is_admin()) return; if (!$item || !is_a($item, 'WC_Order_Item_Product')) return; $preco_kg = (float) $item->get_meta('_fr_preco_por_kg', true); $peso_medio = (float) $item->get_meta('_fr_peso_medio', true); $qty = max(1, (int) $item->get_quantity()); // Mostra só para itens bovinos já marcados com metas Frialto $is_beef_item = ( $preco_kg > 0 || $peso_medio > 0 || $item->get_meta('_fr_preco_medio_peca', true) !== '' ); if (!$is_beef_item) return; $peso_total_real = (float) $item->get_meta('_fr_peso_total_real', true); if ($peso_total_real <= 0 && $peso_medio > 0) { $peso_total_real = $peso_medio * $qty; } $line_total_preview = ($preco_kg > 0 && $peso_total_real > 0) ? ($preco_kg * $peso_total_real) : (float) $item->get_total(); ?> <div class="fr-admin-beef-edit" style="margin-top:10px;padding:10px 12px;border:1px solid #e5e7eb;border-radius:10px;background:#fafafa;"> <strong style="display:block;margin-bottom:8px;">Ajuste final do bovino</strong> <p style="margin:0 0 8px;"> <label style="display:block;font-weight:600;margin-bottom:4px;">Preço final por kg</label> <input type="number" step="0.01" min="0" name="fr_admin_preco_kg[<?php echo esc_attr($item_id); ?>]" value="<?php echo esc_attr(wc_format_localized_decimal($preco_kg)); ?>" style="width:140px;"> </p> <p style="margin:0 0 8px;"> <label style="display:block;font-weight:600;margin-bottom:4px;">Peso real total do item (kg)</label> <input type="number" step="0.001" min="0" name="fr_admin_peso_total[<?php echo esc_attr($item_id); ?>]" value="<?php echo esc_attr(wc_format_localized_decimal($peso_total_real)); ?>" style="width:140px;"> </p> <p style="margin:0;color:#6b7280;"> Quantidade: <strong><?php echo esc_html($qty); ?></strong><br> Prévia do total: <strong>R$ <?php echo esc_html(number_format((float) $line_total_preview, 2, ',', '.')); ?></strong> </p> </div> <?php }, 20, 3); add_action('woocommerce_saved_order_items', function ($order_id, $items) { if (!current_user_can('edit_shop_orders')) return; if (empty($_POST['fr_admin_preco_kg']) && empty($_POST['fr_admin_peso_total'])) return; $order = wc_get_order($order_id); if (!$order) return; $posted_preco = isset($_POST['fr_admin_preco_kg']) && is_array($_POST['fr_admin_preco_kg']) ? $_POST['fr_admin_preco_kg'] : []; $posted_peso = isset($_POST['fr_admin_peso_total']) && is_array($_POST['fr_admin_peso_total']) ? $_POST['fr_admin_peso_total'] : []; foreach ($order->get_items('line_item') as $item_id => $item) { $has_preco = array_key_exists($item_id, $posted_preco); $has_peso = array_key_exists($item_id, $posted_peso); if (!$has_preco && !$has_peso) { continue; } $qty = max(1, (int) $item->get_quantity()); $preco_kg = $has_preco ? (float) wc_format_decimal(wp_unslash($posted_preco[$item_id]), 2) : (float) $item->get_meta('_fr_preco_por_kg', true); $peso_total_real = $has_peso ? (float) wc_format_decimal(wp_unslash($posted_peso[$item_id]), 3) : (float) $item->get_meta('_fr_peso_total_real', true); if ($preco_kg <= 0 || $peso_total_real <= 0) { continue; } $line_total = round($preco_kg * $peso_total_real, 2); $peso_medio = round($peso_total_real / $qty, 3); $preco_medio_peca = round($line_total / $qty, 2); // Salva metas Frialto $item->update_meta_data('_fr_preco_por_kg', $preco_kg); $item->update_meta_data('_fr_peso_total_real', $peso_total_real); $item->update_meta_data('_fr_peso_medio', $peso_medio); $item->update_meta_data('_fr_preco_medio_peca', $preco_medio_peca); // Atualiza valores da linha $item->set_subtotal($line_total); $item->set_total($line_total); $item->save(); } // Recalcula o pedido inteiro $order->calculate_totals(false); $order->save(); }, 20, 2); /* ============================================================ * THANK YOU — MENSAGEM + RELATÓRIO DENTRO DE DETALHES DO PEDIDO * ============================================================ */ /* mensagem premium antes da tabela */ add_action('woocommerce_before_thankyou', function ($order_id) { if (!$order_id) return; $order = wc_get_order($order_id); if (!$order) return; echo ' <section class="fr-thankyou-confirm-box"> <div class="fr-thankyou-confirm-box__top"> <img class="fr-thankyou-confirm-box__logo" src="https://casadecarnesfrialto.com.br/wp-content/uploads/2026/01/cropped-logo-branca_-e1768514013296.png" alt="Frialto"> <div class="fr-thankyou-confirm-box__badge">Pedido confirmado</div> </div> <h2 class="fr-thankyou-confirm-box__title">Seu pedido foi recebido com sucesso.</h2> <p class="fr-thankyou-confirm-box__text"> Seu pedido já está em separação. Em breve, você receberá uma atualização pelo WhatsApp. Enquanto isso, também é possível acompanhar o andamento por aqui. </p> </section>'; }, 5); /* detalhe bovino dentro da tabela de detalhes do pedido */ add_action('woocommerce_order_item_meta_end', function ($item_id, $item, $order, $plain_text) { if (is_admin() || $plain_text) return; if (!is_order_received_page() && !is_view_order_page()) return; if (!$item || !is_a($item, 'WC_Order_Item_Product')) return; static $intro_printed = false; $preco_por_kg = (float) $item->get_meta('_fr_preco_por_kg', true); $peso_medio = (float) $item->get_meta('_fr_peso_medio', true); $preco_medio_peca = (float) $item->get_meta('_fr_preco_medio_peca', true); $qty = (int) $item->get_quantity(); $line_total = (float) $item->get_total(); if ($preco_por_kg <= 0 && $peso_medio <= 0 && $preco_medio_peca <= 0) { return; } $peso_total_estimado = $peso_medio > 0 ? ($peso_medio * max(1, $qty)) : 0; if (!$intro_printed) { echo ' <div class="fr-order-report-intro"> Visualize o valor estimado por peça, preço por quilo e peso médio dos itens selecionados. </div>'; $intro_printed = true; } echo ' <div class="fr-order-report-inline"> <div class="fr-order-report-inline__head"> <strong>' . esc_html($item->get_name()) . '</strong> <span>' . esc_html($qty) . ' un.</span> </div> <div class="fr-order-report-inline__grid"> <div class="fr-order-report-inline__stat"> <small>Preço por kg</small> <strong>' . ($preco_por_kg > 0 ? wc_price($preco_por_kg) . '/kg' : '—') . '</strong> </div> <div class="fr-order-report-inline__stat"> <small>Peso médio da peça</small> <strong>' . ($peso_medio > 0 ? number_format($peso_medio, 3, ',', '.') . ' kg' : '—') . '</strong> </div> <div class="fr-order-report-inline__stat"> <small>Preço médio da peça</small> <strong>' . ($preco_medio_peca > 0 ? wc_price($preco_medio_peca) : '—') . '</strong> </div> <div class="fr-order-report-inline__stat"> <small>Estimativa do item</small> <strong>' . wc_price($line_total) . ($peso_total_estimado > 0 ? ' · ~' . number_format($peso_total_estimado, 3, ',', '.') . ' kg' : '') . '</strong> </div> </div> </div>'; }, 20, 4); /* ============================================================ * FRIALTO — OTIMIZAÇÃO SEGURA SEM MUDAR LAYOUT * ============================================================ */ /** * 1) Desabilita emojis do WP no front */ remove_action('wp_head', 'print_emoji_detection_script', 7); remove_action('wp_print_styles', 'print_emoji_styles'); remove_action('admin_print_scripts', 'print_emoji_detection_script'); remove_action('admin_print_styles', 'print_emoji_styles'); /** * 2) Remove embeds desnecessários do WP no front */ add_action('wp_footer', function () { wp_deregister_script('wp-embed'); }, 100); /** * 3) Desabilita block styles do Woo se estiver usando templates clássicos */ add_action('wp_enqueue_scripts', function () { wp_dequeue_style('wc-blocks-style'); wp_dequeue_style('wc-blocks-vendors-style'); }, 100); /** * 4) Marca páginas do Woo para uso condicional */ if (!function_exists('frialto_is_cart_page')) { function frialto_is_cart_page() { return function_exists('is_cart') && is_cart(); } } if (!function_exists('frialto_is_checkout_page')) { function frialto_is_checkout_page() { return function_exists('is_checkout') && is_checkout() && !is_order_received_page(); } } if (!function_exists('frialto_is_account_area')) { function frialto_is_account_area() { return function_exists('is_account_page') && is_account_page(); } } /** * 5) Adiciona classes utilitárias no body */ add_filter('body_class', function($classes){ if (frialto_is_cart_page()) { $classes[] = 'frialto-page-cart'; } if (frialto_is_checkout_page()) { $classes[] = 'frialto-page-checkout'; } if (frialto_is_account_area()) { $classes[] = 'frialto-page-account'; } return $classes; }); /** * 6) Evita cache errado em páginas sensíveis do Woo */ add_action('send_headers', function () { if ( frialto_is_cart_page() || frialto_is_checkout_page() || frialto_is_account_area() ) { nocache_headers(); } }); /** * 7) Remove jQuery migrate no front quando possível */ add_action('wp_default_scripts', function ($scripts) { if (is_admin()) return; if (!empty($scripts->registered['jquery'])) { $jquery = $scripts->registered['jquery']; if ($jquery->deps) { $jquery->deps = array_diff($jquery->deps, ['jquery-migrate']); } } }); /** * 8) Preconnect para Google Fonts */ add_action('wp_head', function () { echo '<link rel="preconnect" href="https://fonts.googleapis.com">' . "\n"; echo '<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>' . "\n"; }, 1); /* ============================================================ * CARRINHO — SELO DE OFERTA SOMENTE NA CESTA * ============================================================ */ add_filter('woocommerce_cart_item_name', function ($product_name, $cart_item, $cart_item_key) { if (is_admin()) { return $product_name; } if (empty($cart_item['data']) || !is_a($cart_item['data'], 'WC_Product')) { return $product_name; } $product = $cart_item['data']; /* Mostra o selo apenas na página do carrinho */ if (!function_exists('is_cart') || !is_cart()) { return $product_name; } if ($product->is_on_sale()) { $badge = ' <span class="fr-cart-offer-badge">Produto em oferta</span>'; return $product_name . $badge; } return $product_name; }, 20, 3); /* ============================================================ * FRIALTO — SHORTCODE PRODUTOS RELACIONADOS PREMIUM * Uso: [fr_related_products limit="8" columns="4"] * ============================================================ */ add_shortcode('fr_related_products', function($atts){ if (!function_exists('is_product') || !is_product()) { return ''; } global $product; if (!$product || !is_a($product, 'WC_Product')) { return ''; } $atts = shortcode_atts([ 'limit' => 8, 'columns' => 4, ], $atts, 'fr_related_products'); $product_id = (int) $product->get_id(); $limit = max(2, (int) $atts['limit']); $columns = max(1, min(4, (int) $atts['columns'])); $terms = get_the_terms($product_id, 'product_cat'); $term_ids = []; if ($terms && !is_wp_error($terms)) { foreach ($terms as $term) { $term_ids[] = (int) $term->term_id; } } $args = [ 'post_type' => 'product', 'posts_per_page' => $limit, 'post__not_in' => [$product_id], 'post_status' => 'publish', 'orderby' => 'rand', ]; if (!empty($term_ids)) { $args['tax_query'] = [[ 'taxonomy' => 'product_cat', 'field' => 'term_id', 'terms' => $term_ids, 'operator' => 'IN', ]]; } $q = new WP_Query($args); if (!$q->have_posts()) { return ''; } ob_start(); ?> <section class="fr-related-safe fr-related-safe--cols-<?php echo esc_attr($columns); ?>"> <div class="fr-related-safe__head"> <span class="fr-related-safe__kicker">Seleção da Frialto</span> <h2 class="fr-related-safe__title">Produtos relacionados</h2> <p class="fr-related-safe__subtitle">Continue explorando cortes e opções que combinam com este produto.</p> </div> <div class="fr-related-safe__shell"> <div class="fr-related-safe__grid"> <?php while ($q->have_posts()) : $q->the_post(); ?> <?php $loop_product = wc_get_product(get_the_ID()); if (!$loop_product) continue; $title = $loop_product->get_name(); $link = get_permalink($loop_product->get_id()); $image = get_the_post_thumbnail_url($loop_product->get_id(), 'woocommerce_thumbnail'); if (!$image) { $image = wc_placeholder_img_src(); } $price_html = $loop_product->get_price_html(); $add_to_cart_url = esc_url($loop_product->add_to_cart_url()); $add_to_cart_text = $loop_product->add_to_cart_text(); ?> <article class="fr-related-safe__card"> <a class="fr-related-safe__image-link" href="<?php echo esc_url($link); ?>"> <img class="fr-related-safe__image" src="<?php echo esc_url($image); ?>" alt="<?php echo esc_attr($title); ?>" loading="lazy" decoding="async" > </a> <h3 class="fr-related-safe__name"> <a href="<?php echo esc_url($link); ?>"> <?php echo esc_html($title); ?> </a> </h3> <div class="fr-related-safe__price"> <?php echo wp_kses_post($price_html); ?> </div> <a class="fr-related-safe__button" href="<?php echo $add_to_cart_url; ?>" data-quantity="1" > <?php echo esc_html($add_to_cart_text); ?> </a> </article> <?php endwhile; ?> </div> </div> </section> <?php wp_reset_postdata(); return ob_get_clean(); }); https://casadecarnesfrialto.com.br/wp-sitemap-posts-page-1.xmlhttps://casadecarnesfrialto.com.br/wp-sitemap-posts-product-1.xmlhttps://casadecarnesfrialto.com.br/wp-sitemap-taxonomies-product_brand-1.xmlhttps://casadecarnesfrialto.com.br/wp-sitemap-taxonomies-product_cat-1.xmlhttps://casadecarnesfrialto.com.br/wp-sitemap-users-1.xml