<?php
/**
 * Plugin Name: GS Katman (SEO + Vitrin)
 * Description: Sepetsiz vitrin modu, Product/ItemList/FAQ/Breadcrumb JSON-LD, OG etiketleri, llms.txt ve ürün feed'i.
 */
if ( ! defined( 'ABSPATH' ) ) exit;

define( 'GS_LOGO', 'https://guvenliksistemlerim.com/wp-content/uploads/2026/10/gs-logo.png' );
define( 'GS_PHONE', '+902122208892' );
define( 'GS_PHONE_H', '0212 220 88 92' );
define( 'GS_PHONE2_H', '0536 908 96 57' );
define( 'GS_MAIL', 'info@guvenliksistemlerim.com' );

/* ---------- 1. Vitrin modu: sepet yok ---------- */
add_filter( 'woocommerce_is_purchasable', '__return_false' );
add_filter( 'woocommerce_product_is_in_stock', '__return_true' );

add_action( 'init', 'gs_strip_cart', 20 );
function gs_strip_cart() {
  remove_action( 'woocommerce_after_shop_loop_item', 'woocommerce_template_loop_add_to_cart', 10 );
  remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30 );
  remove_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_product_data_tabs', 10 );
  remove_action( 'woocommerce_after_single_product_summary', 'woocommerce_upsell_display', 15 );
}
add_filter( 'woocommerce_add_to_cart_validation', '__return_false' );
add_filter( 'woocommerce_cart_item_name', '__return_empty_string' );

// Menü ve header sepet ikonlarını kaldır
add_filter( 'wp_nav_menu_objects', 'gs_hide_cart_items', 20 );
function gs_hide_cart_items( $items ) {
  foreach ( $items as $k => $it ) {
    $u = isset( $it->url ) ? $it->url : '';
    if ( preg_match( '/(sepet|odeme|hesabim|cart|checkout|my-account)/i', $u ) ) unset( $items[ $k ] );
  }
  return $items;
}

// Ürün listesinde buton
add_action( 'woocommerce_after_shop_loop_item', 'gs_loop_button', 10 );
function gs_loop_button() {
  global $product;
  if ( ! $product ) return;
  $quote = ! $product->get_price();
  echo '<div class="gs-loopbtn"><a class="gbtn ' . ( $quote ? 'gbtn--y' : 'gbtn--out' ) . '" href="' . esc_url( get_permalink() ) . '">'
    . ( $quote ? 'Teklif Alın' : 'Ürünü incele' ) . '</a></div>';
}

// Ürün sayfasında CTA kutusu
add_action( 'woocommerce_single_product_summary', 'gs_single_cta', 32 );
function gs_single_cta() {
  global $product;
  if ( ! $product ) return;
  $price = $product->get_price();
  $iletisim = home_url( '/iletisim/' );
  echo '<div class="gs-cta-box">';
  if ( $price ) {
    echo '<p class="gs-cta-note"><b>Sipariş ve stok teyidi telefonla veriliyor.</b> Fiyat KDV hariçtir. Toplu alımlarda liste fiyatından farklı çalışıyoruz.</p>';
  } else {
    echo '<p class="gs-cta-note"><b>Bu üründe fiyat teklifle veriliyor.</b> Model, konfigürasyon, kurulum ili ve adet fiyatı birlikte belirliyor. Nakliye, kurulum, kalibrasyon ve operatör eğitimi dahildir.</p>';
  }
  echo '<div class="gs-cta-acts">';
  echo '<a class="gbtn gbtn--y" href="' . esc_url( $iletisim ) . '">Teklif Alın</a>';
  echo '<a class="gbtn gbtn--ink" href="tel:' . GS_PHONE . '">' . GS_PHONE_H . '</a>';
  echo '<a class="gbtn gbtn--out" href="mailto:' . GS_MAIL . '">E-posta</a>';
  echo '</div></div>';
}

/* ---------- 2. Meta: description, canonical, Open Graph ---------- */
add_action( 'wp_head', 'gs_head_meta', 2 );
function gs_head_meta() {
  $title = wp_get_document_title();
  $desc = ''; $img = GS_LOGO; $url = home_url( add_query_arg( array(), $GLOBALS['wp']->request ) ); $type = 'website';
  if ( is_front_page() ) {
    $desc = get_bloginfo( 'description' ); $url = home_url( '/' );
  } elseif ( is_singular() ) {
    $desc = has_excerpt() ? get_the_excerpt() : wp_trim_words( wp_strip_all_tags( strip_shortcodes( get_post_field( 'post_content', get_the_ID() ) ) ), 34, '' );
    $url = get_permalink(); $type = is_singular( 'product' ) ? 'product' : 'article';
    if ( has_post_thumbnail() ) { $i = wp_get_attachment_image_src( get_post_thumbnail_id(), 'large' ); if ( $i ) $img = $i[0]; }
  } elseif ( function_exists( 'is_product_category' ) && is_product_category() ) {
    $t = get_queried_object();
    if ( $t ) { $desc = wp_strip_all_tags( $t->description ); $url = get_term_link( $t ); }
  }
  $desc = trim( preg_replace( '/\\s+/', ' ', $desc ) );
  if ( $desc ) echo '<meta name="description" content="' . esc_attr( mb_substr( $desc, 0, 300 ) ) . '">' . "\n";
  echo '<link rel="canonical" href="' . esc_url( $url ) . '">' . "\n";
  echo '<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1">' . "\n";
  echo '<meta property="og:site_name" content="' . esc_attr( get_bloginfo( 'name' ) ) . '">' . "\n";
  echo '<meta property="og:locale" content="tr_TR">' . "\n";
  echo '<meta property="og:type" content="' . esc_attr( $type ) . '">' . "\n";
  echo '<meta property="og:title" content="' . esc_attr( $title ) . '">' . "\n";
  if ( $desc ) echo '<meta property="og:description" content="' . esc_attr( mb_substr( $desc, 0, 300 ) ) . '">' . "\n";
  echo '<meta property="og:url" content="' . esc_url( $url ) . '">' . "\n";
  if ( $img ) echo '<meta property="og:image" content="' . esc_url( $img ) . '">' . "\n";
  echo '<meta name="twitter:card" content="summary_large_image">' . "\n";
}

// Sepet / ödeme / hesap sayfaları indekslenmesin
add_action( 'wp_head', 'gs_noindex_utility', 1 );
function gs_noindex_utility() {
  if ( function_exists( 'is_cart' ) && ( is_cart() || is_checkout() || is_account_page() ) ) {
    echo '<meta name="robots" content="noindex, nofollow">' . "\n";
  }
}

/* ---------- 3. JSON-LD ---------- */
add_filter( 'woocommerce_structured_data_product', '__return_empty_array' );

add_action( 'wp_head', 'gs_jsonld', 6 );
function gs_jsonld() {
  $home = home_url( '/' );
  $org = array(
    '@type' => 'Organization', '@id' => $home . '#org',
    'name' => get_bloginfo( 'name' ), 'url' => $home,
    'logo' => array( '@type' => 'ImageObject', 'url' => GS_LOGO ),
    'image' => GS_LOGO, 'email' => GS_MAIL, 'telephone' => GS_PHONE,
    'description' => 'Bariyer sistemleri, X-ray bagaj tarama cihazları ve metal dedektör tedarikçisi.',
    'areaServed' => array( '@type' => 'Country', 'name' => 'Türkiye' ),
    'address' => array( '@type' => 'PostalAddress', 'addressLocality' => 'İstanbul', 'addressCountry' => 'TR' ),
    'contactPoint' => array( array( '@type' => 'ContactPoint', 'telephone' => GS_PHONE, 'contactType' => 'sales', 'areaServed' => 'TR', 'availableLanguage' => array( 'Turkish' ) ) ),
  );
  $site = array(
    '@type' => 'WebSite', '@id' => $home . '#website', 'url' => $home,
    'name' => get_bloginfo( 'name' ), 'inLanguage' => 'tr-TR',
    'publisher' => array( '@id' => $home . '#org' ),
    'potentialAction' => array( array( '@type' => 'SearchAction',
      'target' => array( '@type' => 'EntryPoint', 'urlTemplate' => $home . '?s={search_term_string}' ),
      'query-input' => 'required name=search_term_string' ) ),
  );
  $graph = array( $org, $site );

  // Breadcrumb
  $cr = array( array( '@type' => 'ListItem', 'position' => 1, 'name' => 'Anasayfa', 'item' => $home ) );
  if ( function_exists( 'is_product_category' ) && is_product_category() ) {
    $t = get_queried_object();
    if ( $t && $t->parent ) { $p = get_term( $t->parent, 'product_cat' );
      if ( $p && ! is_wp_error( $p ) ) $cr[] = array( '@type'=>'ListItem','position'=>count($cr)+1,'name'=>$p->name,'item'=>get_term_link($p) ); }
    if ( $t ) $cr[] = array( '@type'=>'ListItem','position'=>count($cr)+1,'name'=>$t->name,'item'=>get_term_link($t) );
  } elseif ( function_exists( 'is_product' ) && is_product() ) {
    $tt = get_the_terms( get_the_ID(), 'product_cat' );
    if ( $tt && ! is_wp_error( $tt ) ) { $t = array_shift( $tt );
      if ( $t->parent ) { $p = get_term( $t->parent, 'product_cat' );
        if ( $p && ! is_wp_error( $p ) ) $cr[] = array( '@type'=>'ListItem','position'=>count($cr)+1,'name'=>$p->name,'item'=>get_term_link($p) ); }
      $cr[] = array( '@type'=>'ListItem','position'=>count($cr)+1,'name'=>$t->name,'item'=>get_term_link($t) ); }
    $cr[] = array( '@type'=>'ListItem','position'=>count($cr)+1,'name'=>get_the_title(),'item'=>get_permalink() );
  } elseif ( is_page() && ! is_front_page() ) {
    $cr[] = array( '@type'=>'ListItem','position'=>2,'name'=>get_the_title(),'item'=>get_permalink() );
  }
  if ( count( $cr ) > 1 ) $graph[] = array( '@type' => 'BreadcrumbList', 'itemListElement' => $cr );

  // Product
  if ( function_exists( 'is_product' ) && is_product() ) {
    $p = wc_get_product( get_the_ID() );
    if ( $p ) {
      $imgs = array();
      if ( $p->get_image_id() ) { $s = wp_get_attachment_image_src( $p->get_image_id(), 'full' ); if ( $s ) $imgs[] = $s[0]; }
      foreach ( $p->get_gallery_image_ids() as $gid ) { $s = wp_get_attachment_image_src( $gid, 'full' ); if ( $s ) $imgs[] = $s[0]; }
      $cats = wp_get_post_terms( $p->get_id(), 'product_cat', array( 'fields' => 'names' ) );
      $prod = array(
        '@type' => 'Product', '@id' => get_permalink() . '#product',
        'name' => $p->get_name(),
        'description' => trim( preg_replace( '/\\s+/', ' ', wp_strip_all_tags( $p->get_short_description() ? $p->get_short_description() : $p->get_description() ) ) ),
        'sku' => $p->get_sku() ? $p->get_sku() : 'GS-' . $p->get_id(),
        'mpn' => 'GS-' . $p->get_id(),
        'url' => get_permalink(),
        'brand' => array( '@type' => 'Brand', 'name' => get_bloginfo( 'name' ) ),
        'category' => $cats ? implode( ' > ', $cats ) : '',
        'itemCondition' => 'https://schema.org/NewCondition',
      );
      if ( $imgs ) $prod['image'] = $imgs;
      if ( $p->get_price() ) {
        $prod['offers'] = array(
          '@type' => 'Offer', 'url' => get_permalink(),
          'priceCurrency' => get_woocommerce_currency(),
          'price' => (string) wc_format_decimal( $p->get_price(), 2 ),
          'priceValidUntil' => gmdate( 'Y-m-d', strtotime( '+6 months' ) ),
          'availability' => 'https://schema.org/InStock',
          'itemCondition' => 'https://schema.org/NewCondition',
          'seller' => array( '@id' => $home . '#org' ),
          'areaServed' => array( '@type' => 'Country', 'name' => 'Türkiye' ),
        );
      } else {
        $prod['offers'] = array(
          '@type' => 'Offer', 'url' => home_url( '/iletisim/' ),
          'priceCurrency' => get_woocommerce_currency(),
          'availability' => 'https://schema.org/InStock',
          'itemCondition' => 'https://schema.org/NewCondition',
          'priceSpecification' => array( '@type' => 'PriceSpecification', 'priceCurrency' => get_woocommerce_currency(), 'valueAddedTaxIncluded' => false ),
          'seller' => array( '@id' => $home . '#org' ),
        );
      }
      $graph[] = $prod;
    }
  }

  // ItemList (kategori ve ürünler sayfası)
  if ( ( function_exists( 'is_product_category' ) && is_product_category() ) || ( function_exists( 'is_shop' ) && is_shop() ) ) {
    global $wp_query; $items = array(); $i = 0;
    if ( ! empty( $wp_query->posts ) ) {
      foreach ( $wp_query->posts as $post ) { $i++;
        $items[] = array( '@type' => 'ListItem', 'position' => $i, 'url' => get_permalink( $post->ID ), 'name' => get_the_title( $post->ID ) ); }
    }
    if ( $items ) $graph[] = array( '@type' => 'ItemList', 'numberOfItems' => count( $items ), 'itemListElement' => $items );
  }

  // FAQ
  if ( is_singular() ) {
    $content = get_post_field( 'post_content', get_the_ID() );
    if ( $content && preg_match_all( '/<details>\\s*<summary>(.*?)<\\/summary>\\s*<p>(.*?)<\\/p>/s', $content, $m, PREG_SET_ORDER ) ) {
      $qs = array();
      foreach ( $m as $pair ) $qs[] = array( '@type'=>'Question','name'=>wp_strip_all_tags($pair[1]),'acceptedAnswer'=>array('@type'=>'Answer','text'=>wp_strip_all_tags($pair[2])) );
      if ( $qs ) $graph[] = array( '@type'=>'FAQPage','mainEntity'=>$qs );
    }
  }

  echo '<script type="application/ld+json">' . wp_json_encode( array( '@context'=>'https://schema.org','@graph'=>$graph ), JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES ) . '</script>' . "\n";
}

/* ---------- 4. llms.txt ve Merchant Center feed ---------- */
add_action( 'init', 'gs_rules' );
function gs_rules() {
  add_rewrite_rule( '^llms\\.txt$', 'index.php?gs_out=llms', 'top' );
  add_rewrite_rule( '^urun-feed\\.xml$', 'index.php?gs_out=feed', 'top' );
}
add_filter( 'query_vars', function( $v ){ $v[] = 'gs_out'; return $v; } );
add_action( 'template_redirect', 'gs_outputs' );
function gs_outputs() {
  $w = get_query_var( 'gs_out' );
  if ( ! $w ) return;
  if ( $w === 'llms' ) gs_llms();
  if ( $w === 'feed' ) gs_feed();
  exit;
}

function gs_llms() {
  header( 'Content-Type: text/plain; charset=utf-8' );
  echo "# " . get_bloginfo( 'name' ) . "\n\n";
  echo "> İstanbul merkezli güvenlik ekipmanı tedarikçisi. Bariyer sistemleri (protokol, şerit, akordiyon, boy, mojo, çit, zabıta), X-ray bagaj tarama cihazları, kapı ve el tipi metal dedektörler, kordon ve aksesuarlar. Bariyer ve aksesuar fiyatları sitede açık yayınlanır. Sipariş siteden alınmaz; telefon veya e-posta ile teklif verilir. Türkiye geneline kargo ve nakliye, İstanbul içinde montaj.\n\n";
  echo "İletişim: " . GS_PHONE_H . " / " . GS_PHONE2_H . " / " . GS_MAIL . "\n";
  echo "Sipariş biçimi: Telefon veya e-posta ile teklif. Online sepet yoktur.\n";
  echo "Para birimi: TRY. Fiyatlar KDV hariçtir.\n\n";

  echo "## Kategoriler\n";
  $parents = get_terms( array( 'taxonomy'=>'product_cat','hide_empty'=>false,'parent'=>0 ) );
  if ( $parents && ! is_wp_error( $parents ) ) {
    foreach ( $parents as $p ) {
      if ( $p->slug === 'genel' ) continue;
      echo "\n### " . $p->name . " — " . get_term_link( $p ) . "\n";
      echo trim( preg_replace( '/\\s+/', ' ', wp_strip_all_tags( $p->description ) ) ) . "\n";
      $kids = get_terms( array( 'taxonomy'=>'product_cat','hide_empty'=>false,'parent'=>$p->term_id ) );
      if ( $kids && ! is_wp_error( $kids ) ) {
        foreach ( $kids as $k ) {
          echo "- [" . $k->name . "](" . get_term_link( $k ) . "): " . trim( preg_replace( '/\\s+/', ' ', wp_strip_all_tags( $k->description ) ) ) . "\n";
        }
      }
    }
  }

  echo "\n## Sayfalar\n";
  foreach ( array( 'urunler'=>'Tüm ürünler ve fiyatlar','nasil-siparis-verilir'=>'Sipariş, ödeme, teslimat ve iade','hakkimizda'=>'Hakkımızda','sorular'=>'Sık sorulan sorular','iletisim'=>'İletişim ve teklif' ) as $slug => $label ) {
    $pg = get_page_by_path( $slug );
    if ( $pg ) echo "- [" . $label . "](" . get_permalink( $pg ) . ")\n";
  }

  echo "\n## Ürünler\n";
  $q = new WP_Query( array( 'post_type'=>'product','posts_per_page'=>300,'post_status'=>'publish','orderby'=>'title','order'=>'ASC' ) );
  while ( $q->have_posts() ) { $q->the_post();
    $pr = wc_get_product( get_the_ID() );
    $cats = wp_get_post_terms( get_the_ID(), 'product_cat', array( 'fields'=>'names' ) );
    $price = ( $pr && $pr->get_price() ) ? number_format( (float) $pr->get_price(), 0, ',', '.' ) . ' TL (KDV hariç)' : 'Fiyat teklifle verilir';
    $sd = trim( preg_replace( '/\\s+/', ' ', wp_strip_all_tags( $pr ? $pr->get_short_description() : '' ) ) );
    echo "- **" . get_the_title() . "** (" . ( $cats ? implode( ', ', $cats ) : '' ) . ") — " . $price . " — " . get_permalink() . "\n";
    if ( $sd ) echo "  " . $sd . "\n";
  }
  wp_reset_postdata();
}

function gs_feed() {
  header( 'Content-Type: application/xml; charset=utf-8' );
  echo '<?xml version="1.0" encoding="UTF-8"?>' . "\n";
  echo '<rss version="2.0" xmlns:g="http://base.google.com/ns/1.0"><channel>' . "\n";
  echo '<title>' . esc_html( get_bloginfo( 'name' ) ) . '</title>' . "\n";
  echo '<link>' . esc_url( home_url( '/' ) ) . '</link>' . "\n";
  echo '<description>Bariyer, X-ray ve dedektör sistemleri ürün listesi</description>' . "\n";
  $q = new WP_Query( array( 'post_type'=>'product','posts_per_page'=>300,'post_status'=>'publish' ) );
  while ( $q->have_posts() ) { $q->the_post();
    $p = wc_get_product( get_the_ID() );
    if ( ! $p || ! $p->get_price() ) continue;
    $img = '';
    if ( $p->get_image_id() ) { $s = wp_get_attachment_image_src( $p->get_image_id(), 'full' ); if ( $s ) $img = $s[0]; }
    $cats = wp_get_post_terms( get_the_ID(), 'product_cat', array( 'fields'=>'names' ) );
    $desc = trim( preg_replace( '/\\s+/', ' ', wp_strip_all_tags( $p->get_short_description() ? $p->get_short_description() : $p->get_description() ) ) );
    echo '<item>' . "\n";
    echo '<g:id>GS-' . get_the_ID() . '</g:id>' . "\n";
    echo '<g:title><![CDATA[' . get_the_title() . ']]></g:title>' . "\n";
    echo '<g:description><![CDATA[' . mb_substr( $desc, 0, 4500 ) . ']]></g:description>' . "\n";
    echo '<g:link>' . esc_url( get_permalink() ) . '</g:link>' . "\n";
    if ( $img ) echo '<g:image_link>' . esc_url( $img ) . '</g:image_link>' . "\n";
    echo '<g:availability>in_stock</g:availability>' . "\n";
    echo '<g:condition>new</g:condition>' . "\n";
    echo '<g:price>' . wc_format_decimal( $p->get_price(), 2 ) . ' TRY</g:price>' . "\n";
    echo '<g:brand><![CDATA[' . get_bloginfo( 'name' ) . ']]></g:brand>' . "\n";
    echo '<g:mpn>GS-' . get_the_ID() . '</g:mpn>' . "\n";
    echo '<g:identifier_exists>no</g:identifier_exists>' . "\n";
    if ( $cats ) echo '<g:product_type><![CDATA[' . implode( ' > ', $cats ) . ']]></g:product_type>' . "\n";
    echo '</item>' . "\n";
  }
  wp_reset_postdata();
  echo '</channel></rss>';
}

/* ---------- 5. Kategori sayfası başlığı ve breadcrumb şeridi ---------- */
add_action( 'woocommerce_before_main_content', 'gs_cat_hero', 5 );
function gs_cat_hero() {
  if ( ! function_exists( 'is_product_category' ) ) return;
  if ( is_product_category() ) {
    $t = get_queried_object(); if ( ! $t ) return;
    $parent = $t->parent ? get_term( $t->parent, 'product_cat' ) : null;
    echo '<section class="gshop-intro"><div class="gw">';
    echo '<nav class="gcrumb"><a href="' . esc_url( home_url( '/' ) ) . '">Anasayfa</a><span>/</span>';
    echo '<a href="' . esc_url( home_url( '/urunler/' ) ) . '">Ürünler</a><span>/</span>';
    if ( $parent && ! is_wp_error( $parent ) ) echo '<a href="' . esc_url( get_term_link( $parent ) ) . '">' . esc_html( $parent->name ) . '</a><span>/</span>';
    echo '<b>' . esc_html( $t->name ) . '</b></nav>';
    echo '<h1>' . esc_html( $t->name ) . ' Fiyatları ve Modelleri</h1>';
    if ( $t->description ) echo '<p>' . wp_kses_post( $t->description ) . '</p>';
    echo '</div></section>';
  } elseif ( is_product() ) {
    $tt = get_the_terms( get_the_ID(), 'product_cat' );
    echo '<nav class="gcrumb gcrumb--solo"><div class="gw"><a href="' . esc_url( home_url( '/' ) ) . '">Anasayfa</a><span>/</span><a href="' . esc_url( home_url( '/urunler/' ) ) . '">Ürünler</a>';
    if ( $tt && ! is_wp_error( $tt ) ) { $t = array_shift( $tt );
      if ( $t->parent ) { $p = get_term( $t->parent, 'product_cat' ); if ( $p && ! is_wp_error( $p ) ) echo '<span>/</span><a href="' . esc_url( get_term_link( $p ) ) . '">' . esc_html( $p->name ) . '</a>'; }
      echo '<span>/</span><a href="' . esc_url( get_term_link( $t ) ) . '">' . esc_html( $t->name ) . '</a>'; }
    echo '<span>/</span><b>' . esc_html( get_the_title() ) . '</b></div></nav>';
  }
}

// Kategori sayfasının altına alt kategori kartları
add_action( 'woocommerce_after_main_content', 'gs_cat_children', 5 );
function gs_cat_children() {
  if ( ! function_exists( 'is_product_category' ) || ! is_product_category() ) return;
  $t = get_queried_object(); if ( ! $t ) return;
  $kids = get_terms( array( 'taxonomy'=>'product_cat','hide_empty'=>false,'parent'=>$t->term_id ) );
  if ( ! $kids || is_wp_error( $kids ) || ! count( $kids ) ) return;
  echo '<section class="gsec gsec--grey"><div class="gw"><div class="ghead"><div><h2>' . esc_html( $t->name ) . ' alt kategorileri</h2></div></div><div class="gcats">';
  foreach ( $kids as $k ) {
    $thumb = get_term_meta( $k->term_id, 'thumbnail_id', true );
    $img = $thumb ? wp_get_attachment_image_url( $thumb, 'medium' ) : '';
    if ( ! $img ) {
      $q = new WP_Query( array( 'post_type'=>'product','posts_per_page'=>1,'tax_query'=>array( array( 'taxonomy'=>'product_cat','field'=>'term_id','terms'=>$k->term_id ) ) ) );
      if ( $q->have_posts() ) { $q->the_post(); $img = get_the_post_thumbnail_url( get_the_ID(), 'medium' ); } wp_reset_postdata();
    }
    echo '<a class="gcat" href="' . esc_url( get_term_link( $k ) ) . '">';
    if ( $img ) echo '<span class="im"><img src="' . esc_url( $img ) . '" alt="' . esc_attr( $k->name ) . '"></span>';
    echo '<span class="b"><strong>' . esc_html( $k->name ) . '</strong><span>' . esc_html( $k->count ) . ' ürün</span></span></a>';
  }
  echo '</div></div></section>';
}

/* ---------- 6. Ürün sayfası altına ilgili kategori CTA ---------- */
add_action( 'woocommerce_after_single_product_summary', 'gs_product_band', 20 );
function gs_product_band() {
  echo '<section class="gband gband--inline"><div class="gw"><div><h2>Bu ürün için teklif alın</h2><p>Adet, teslimat ili ve kullanım yerini iletin; stok durumunu ve net fiyatı aynı gün bildirelim.</p></div><div class="gacts"><a class="gbtn gbtn--y" href="tel:' . GS_PHONE . '">' . GS_PHONE_H . '</a><a class="gbtn gbtn--line" href="' . esc_url( home_url( '/iletisim/' ) ) . '">Teklif formu</a></div></div></section>';
}

/* ---------- 7. Ürün açıklaması (sekmeler yerine blok) ---------- */
add_action( 'woocommerce_after_single_product_summary', 'gs_product_desc', 12 );
function gs_product_desc() {
  global $post;
  if ( ! $post ) return;
  $c = apply_filters( 'the_content', $post->post_content );
  if ( ! trim( wp_strip_all_tags( $c ) ) ) return;
  echo '<div class="gs-desc"><div class="gspecwrap">' . $c . '</div></div>';
}
add_filter( 'woocommerce_structured_data_breadcrumblist', '__return_empty_array' );
add_filter( 'woocommerce_product_tabs', '__return_empty_array' );
