<?php
/**
* 遊漁船検索サイト カスタマイズ用ファイル
* プログラマー監修：メーカー管理機能 ＆ お気に入り表示ロジック統合版
* v2.8: 管理画面「詳細・設備」に設備チェックボックス表示・保存機能を追加
*/
if ( ! defined( 'ABSPATH' ) ) exit;

// ==========================================
// 1. システム設定・定数定義
// ==========================================
final class FishingApp {
    const BOAT_PT    = 'fishing_boat';
    const GIRL_PT    = 'fishing_girl';
    const REVIEW_PT  = 'fishing_review';
    const INQUIRY_PT = 'fishing_inquiry';
    const MAKER_PT   = 'fishing_maker';
    const AREA_TAX   = 'fishing_area';

    public static function get_facilities() {
        return [
            'toilet'  => '          🚽           洋式トイレ',
            'aircon'  => '          ❄️           エアコン',
            'ice'     => '          🧊           氷',
            'tankyu'  => '          📡           魚探',
            'rest'    => '          ☕           休憩室',
            'rental'  => '          🎣           レンタル',
            'pump'    => '          🌊           ポンプ',
            'power12' => '          🔌           12V',
            'power24' => '          🔌           24V',
            'range'   => '          🔥           レンジ',
            'pot'     => '          🍵           ポット',
            'shime'   => '          🔪           締め',
            'ikesu'   => '          🐟           生簀',
            'tamo'    => '          🤝           タモ入れサポート',
            'shower'  => '          🚿           シャワー',
            'bedroom' => '          🛌           寝室',
            'holder'  => '          🎣           ロッドホルダー',
            'cashless'=> '          💳           キャッシュレス決済'
        ];
    }

    public static function get_review_questions() {
        return [
            'r_tel'       => ['q' => '電話受付時の対応はどうでしたか？', 'opts' => ['良い', '普通', '悪い']],
            'r_reception' => ['q' => '現地受付対応はどうでしたか？', 'opts' => ['良い', '普通', '悪い']],
            'r_seat'      => ['q' => '釣り座決めはどうでしたか？', 'opts' => ['先着', '抽選', 'じゃんけん', '釣り物による']],
            'r_captain'   => ['q' => '船長の対応(言葉遣いや態度など)はどうでしたか？', 'opts' => ['良い', '普通', '悪い']],
            'r_ride'      => ['q' => '船の乗り心地はどうでしたか？', 'opts' => ['良い', '普通', '悪い']],
            'r_equip'     => ['q' => '船の設備(ロッドホルダー・海水ポンプなど)はどうでしたか？', 'opts' => ['良い', '普通', '悪い']],
            'r_cabin'     => ['q' => '船にキャビン(休憩所・雨をしのげる場所)はありましたか？', 'opts' => ['ある', 'ない']],
            'r_support'   => ['q' => '船長または中乗りのサポート対応はどうでしたか？', 'opts' => ['良い', '普通', '悪い']],
            'r_advice'    => ['q' => '釣果の上がるようなアドバイスなどありましたか？', 'opts' => ['ある', 'ない']],
            'r_skill'     => ['q' => '船の流し方やポイント選びはどうでしたか？', 'opts' => ['良い', '普通', '悪い']],
            'r_fish'      => ['q' => '釣った魚の処理(活け締め・血抜きなど)はありましたか？', 'opts' => ['ある', 'ない']],
            'r_service'   => ['q' => 'その船独自のサービスは何かありましたか？', 'opts' => ['ある', 'ない']],
            'r_safety'    => ['q' => '釣行は安全でしたか？', 'opts' => ['安全だった', '安全ではなかった']],
            'r_repeat'    => ['q' => 'この船をまた利用したいと思いましたか？', 'opts' => ['はい', 'いいえ']],
        ];
    }
}

// Lightningテーマの投稿前後ナビゲーション制御
add_filter( 'lightning_is_post_next_prev_show', function($show){
    if ( get_post_type() === FishingApp::BOAT_PT || get_post_type() === FishingApp::GIRL_PT ) return false;
    return $show;
} );

add_action( 'after_setup_theme', function() {
    add_theme_support( 'title-tag' );
    add_theme_support( 'post-thumbnails' );
} );

// ==========================================
// 2. サイト共通CSS & AdSense Script (HEAD)
// ==========================================
add_action( 'wp_head', function() {
    ?>
    <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-5098161129672460" crossorigin="anonymous"></script>

    <style>
    .entry-meta, .vcard, .updated, .author, .published { display: none !important; }
    .site-footer-copyright p:nth-child(2) { display: none !important; }
    .adsense-container { margin: 30px auto; text-align: center; min-height: 20px; background: #fcfcfc; padding: 15px 0; }
    .ads-label { display: block; font-size: 11px; color: #aaa; margin-bottom: 8px; letter-spacing: 1px; }
    .search-container { background: linear-gradient(135deg, #003356 0%, #005a96 100%); padding: 25px; border-radius: 12px; display: flex; gap: 10px; flex-wrap: wrap; justify-content: center; margin: 30px auto; max-width: 900px; }
    .search-container select { padding: 0 12px; border-radius: 8px; min-width: 250px; height: 45px; border: none; font-weight: bold; background: #fff; }
    .search-btn { background: #ff9800; color: #fff; border: none; padding: 0 35px; border-radius: 8px; font-weight: bold; cursor: pointer; height: 45px; transition: 0.3s; }
    .search-btn:hover { background: #e68a00; transform: translateY(-2px); }
    .page-btn-container { display: flex; flex-direction: column; gap: 15px; margin: 30px auto; max-width: 600px; padding: 0 20px; }
    .page-link-btn { background: #004471; color: #fff !important; text-align: center; padding: 18px; border-radius: 12px; text-decoration: none !important; font-weight: bold; box-shadow: 0 5px 0 #002a46; display: block; transition: 0.2s; }
    .page-link-btn:hover { background: #005a96; }
    .page-link-btn:active { transform: translateY(3px); box-shadow: 0 2px 0 #002a46; }
    .back-home-container { text-align: center; margin: 40px auto; }
    .btn-back-home { display: inline-block; background: #666; color: #fff !important; padding: 12px 30px; border-radius: 50px; text-decoration: none !important; font-weight: bold; transition: 0.3s; border: 2px solid #666; }
    .btn-back-home:hover { background: #fff; color: #666 !important; }
    .facility-icons { display: flex; flex-wrap: wrap; gap: 6px; margin: 10px 0; min-height: 25px; }
    .f-icon { font-size: 10px; padding: 2px 6px; border-radius: 4px; font-weight: bold; color: #fff; display: inline-flex; align-items: center; gap: 3px; }
    .f-toilet { background: #5d9cec; } .f-aircon { background: #4fc1e9; } .f-ice { background: #a0d468; }
    .f-tankyu { background: #ffce54; color: #333; } .f-rest { background: #fc6e51; } .f-rental { background: #ac92ec; }
    .f-pump { background: #48cfad; } .f-power12, .f-power24 { background: #4a89dc; }
    .f-range { background: #ed5565; } .f-pot { background: #ff8200; } .f-shime { background: #a0d468; }
    .f-ikesu { background: #4fc1e9; } .f-tamo { background: #ff9800; } .f-shower { background: #5d9cec; }
    .f-bedroom { background: #ac92ec; } .f-holder { background: #48cfad; } .f-cashless { background: #ed5565; }
    .rating-display { display: flex; align-items: center; gap: 10px; margin: 10px 0; text-decoration: none !important; }
    .rating-score { font-size: 24px; font-weight: bold; color: #333; }
    .rating-stars { color: #ff9800; font-size: 20px; letter-spacing: 2px; }
    .rating-count { font-size: 14px; color: #007bff; }
    .star-empty { color: #ddd; }
    .fishing-form-container { background: #ffffff; border: 1px solid #e0e6ed; border-radius: 16px; padding: 30px; margin-top: 40px; box-shadow: 0 10px 25px rgba(0,0,0,0.05); }
    .fishing-form-title { font-size: 22px; font-weight: bold; margin-bottom: 25px; text-align: center; color: #004471; position: relative; padding-bottom: 10px; }
    .fishing-form-title::after { content: ""; position: absolute; bottom: 0; left: 50%; transform: translateX(-50%); width: 50px; height: 3px; background: #ff9800; }
    .form-group { margin-bottom: 20px; }
    .form-group label { display: block; font-weight: bold; margin-bottom: 8px; font-size: 15px; color: #444; }
    .form-group input, .form-group textarea, .form-group select { width: 100%; padding: 14px; border: 2px solid #edf2f7; border-radius: 10px; box-sizing: border-box; font-size: 16px; transition: all 0.3s ease; background: #f8fafc; }
    .form-group input:focus, .form-group textarea:focus { border-color: #004471; background: #fff; outline: none; box-shadow: 0 0 0 4px rgba(0,68,113,0.1); }
    .form-group input[type="file"] { padding: 10px; background: #fff; border: 2px dashed #edf2f7; }
    .form-facility-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 10px; background: #f1f5f9; padding: 15px; border-radius: 10px; }
    .form-facility-grid label { display: flex; align-items: center; gap: 8px; font-weight: normal; font-size: 14px; margin-bottom: 0; cursor: pointer; }
    .form-facility-grid input[type="checkbox"] { width: auto; }
    .form-review-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 15px; margin-bottom: 25px; }
    @media (max-width: 600px) { .form-review-grid { grid-template-columns: 1fr; } }
    .review-q-item { background: #f8fafc; padding: 12px; border-radius: 8px; border: 1px solid #edf2f7; }
    .review-q-label { font-size: 13px !important; color: #555 !important; margin-bottom: 5px !important; }
    .submit-btn { background: #004471; color: #fff; border: none; width: 100%; padding: 18px; border-radius: 10px; font-weight: bold; cursor: pointer; font-size: 18px; transition: all 0.3s ease; margin-top: 10px; }
    .submit-btn:hover { background: #005a96; transform: translateY(-2px); box-shadow: 0 5px 15px rgba(0,68,113,0.2); }
    .form-msg { padding: 20px; border-radius: 10px; margin-bottom: 25px; font-weight: bold; text-align: center; font-size: 16px; }
    .form-msg-success { background: #e6fffa; color: #234e52; border: 1px solid #b2f5ea; }
    .fishing-card-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 25px; margin: 30px 0; }
    .fishing-card { position: relative; background: #fff; border-radius: 12px; overflow: hidden; box-shadow: 0 4px 15px rgba(0,0,0,0.1); display: flex; flex-direction: column; text-decoration: none !important; color: inherit !important; border: 1px solid #eee; height: 100%; transition: 0.3s; }
    .fishing-card:hover { transform: translateY(-5px); }
    .card-img-wrapper { width: 100%; height: 200px; position: relative; background: #f0f0f0; }
    .card-img-wrapper img { width: 100%; height: 100%; object-fit: cover; }
    .card-content { padding: 15px; flex-grow: 1; }
    .card-title { font-size: 17px; font-weight: bold; color: #004471; margin-bottom: 4px; }
    .card-address { font-size: 12px; color: #666; margin-bottom: 8px; }
    .recommend-badge { position: absolute; top: 12px; left: 12px; background: #ff4500; color: #fff; padding: 6px 14px; border-radius: 8px; font-size: 12px; font-weight: 800; z-index: 10; box-shadow: 0 4px 8px rgba(0,0,0,0.3); border: 2px solid #fff; letter-spacing: 0.5px; }
    .fishing-main-slider-wrapper { position: relative; overflow: hidden; width: 100vw; margin-left: calc(-50vw + 50%); margin-right: calc(-50vw + 50%); background: #f4f7f9; margin-bottom: 40px; padding: 40px 0; }
    .fishing-main-slider { display: flex; transition: transform 0.8s cubic-bezier(0.45, 0, 0.55, 1); }
    .slider-item { flex: 0 0 100%; display: flex; justify-content: center; align-items: center; padding: 0 20px; box-sizing: border-box; }
    .slider-item .fishing-card { width: 100%; max-width: 500px; height: auto; background: #fff; }
    .maker-logo-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 20px; margin: 30px 0; }
    .maker-logo-item { background: #fff; border: 1px solid #eee; border-radius: 10px; padding: 15px; display: flex; align-items: center; justify-content: center; aspect-ratio: 1 / 1; transition: all 0.3s ease; box-shadow: 0 2px 8px rgba(0,0,0,0.05); }
    .maker-logo-item:hover { transform: translateY(-5px); box-shadow: 0 8px 20px rgba(0,0,0,0.12); border-color: #004471; }
    .maker-logo-item img { max-width: 100%; max-height: 100%; object-fit: contain; filter: grayscale(10%); transition: 0.3s; }
    .maker-logo-item:hover img { filter: grayscale(0%); }
    .fav-btn { position: absolute; top: 10px; right: 10px; background: rgba(255,255,255,0.95); border: 1px solid #ddd; border-radius: 20px; padding: 4px 12px; cursor: pointer; z-index: 10; font-size: 12px; font-weight: bold; display: flex; align-items: center; gap: 4px; transition: 0.2s; outline: none; }
    .fav-btn.active { color: #e91e63; border-color: #ffc1d6; }
    .heart-icon::before { content: "♡"; } .fav-btn.active .heart-icon::before { content: "♥"; }
    .btn-group { display: flex; flex-direction: column; gap: 10px; margin-bottom: 25px; }
    .btn-tel { background: #28a745; color: #fff !important; padding: 15px; border-radius: 10px; font-weight: bold; text-align: center; text-decoration: none; font-size: 18px; }
    .btn-web { background: #007bff; color: #fff !important; padding: 15px; border-radius: 10px; font-weight: bold; text-align: center; text-decoration: none; font-size: 18px; }
    .btn-insta-follow { display: flex; align-items: center; justify-content: center; gap: 8px; background: linear-gradient(45deg, #f09433, #bc1888); color: #fff !important; padding: 12px; border-radius: 8px; font-weight: bold; text-decoration: none !important; margin: 15px auto; max-width: 280px; transition: 0.3s; }
    .btn-insta-follow:hover { opacity: 0.9; transform: scale(1.02); }
    .single-boat-thumb-wrapper { position: relative; width: 100%; max-height: 500px; margin-bottom: 20px; overflow: hidden; border-radius: 12px; }
    .single-boat-thumb { width: 100%; height: auto; object-fit: cover; display: block; }
    .area-section { margin-bottom: 30px; border: 1px solid #eee; border-radius: 8px; overflow: hidden; }
    .area-title { background: #f8f9fa; padding: 10px 15px; font-weight: bold; border-bottom: 2px solid #004471; color: #004471; margin: 0; }
    .area-boat-list { list-style: none; padding: 10px 15px; margin: 0; display: flex; flex-wrap: wrap; gap: 10px; }
    .area-boat-list li a { text-decoration: none; color: #333; background: #fff; border: 1px solid #ccc; padding: 5px 12px; border-radius: 4px; font-size: 14px; }
    .admin-footer-nav { background: #f8f9fa; padding: 20px; text-align: center; border-top: 1px solid #ddd; margin-top: 50px; font-size: 14px; }
    .admin-footer-nav a { color: #666 !important; text-decoration: none; margin: 0 15px; }
    .admin-footer-nav a:hover { text-decoration: underline; color: #004471 !important; }
    .insta-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 20px; }
    .insta-item { background: #fff; border: 1px solid #eee; border-radius: 12px; padding: 15px; }
    .insta-boat-name { font-weight: bold; display: block; margin-bottom: 10px; color: #004471; }
    </style>
    <?php
} );

// ==========================================
// 3. 補助関数 (HTML生成)
// ==========================================
function get_adsense_html() {
    return '
    <div class="adsense-container">
    <span class="ads-label">SPONSORED LINK</span>
    <ins class="adsbygoogle"
    style="display:block"
    data-ad-client="ca-pub-5098161129672460"
    data-ad-slot=""
    data-ad-format="auto"
    data-full-width-responsive="true"></ins>
    <script>
    (adsbygoogle = window.adsbygoogle || []).push({});
    </script>
    </div>';
}

function get_facility_icons_html($post_id) {
    $facilities = FishingApp::get_facilities(); $html = '<div class="facility-icons">';
    foreach($facilities as $k => $label) { if(get_post_meta($post_id, '_boat_fac_' . $k, true) === '1') { $html .= sprintf('<span class="f-icon f-%s">%s</span>', esc_attr($k), esc_html($label));
    } }
    return $html . '</div>';
}

function get_boat_rating_html($boat_id) {
    $reviews = get_posts(['post_type' => FishingApp::REVIEW_PT, 'meta_key' => '_review_boat_id', 'meta_value' => $boat_id, 'posts_per_page' => -1]); $count = count($reviews);
    if($count === 0) return '<div class="rating-display"><span class="rating-count">まだ評価がありません</span></div>';
    $total = array_reduce($reviews, function($carry, $r) { return $carry + (float)get_post_meta($r->ID, '_review_stars', true); }, 0); $avg = round($total / $count, 1);
    $stars = str_repeat('★', (int)floor($avg)) . str_repeat('<span class="star-empty">☆</span>', 5 - (int)floor($avg));
    return sprintf('<a href="%s#reviews" class="rating-display"><span class="rating-score">%s</span><span class="rating-stars">%s</span><span class="rating-count">(%d件)</span></a>', get_permalink($boat_id), number_format($avg, 1), $stars, $count);
}

function get_favorite_button($post_id) { return sprintf('<button class="fav-btn" data-id="%d" onclick="toggleFavorite(event, this)"><span class="heart-icon"></span><span class="fav-text">お気に入り</span></button>', intval($post_id)); }

function get_instagram_follow_button($username) { if (empty($username)) return ''; return sprintf('<a href="https://www.instagram.com/%s/" target="_blank" class="btn-insta-follow">Instagramでフォロー</a>', esc_attr($username)); }

function get_related_area_boats_html($post_id) {
    $terms = get_the_terms($post_id, FishingApp::AREA_TAX); if ( ! $terms || is_wp_error($terms) ) return '';
    $term_ids = wp_list_pluck($terms, 'term_id'); $args = ['post_type' => FishingApp::BOAT_PT, 'posts_per_page' => 3, 'post__not_in' => [$post_id], 'tax_query' => [['taxonomy' => FishingApp::AREA_TAX, 'field' => 'term_id', 'terms' => $term_ids, 'operator' => 'IN', 'include_children' => false]], 'orderby' => 'rand', 'no_found_rows' => true];
    $query = new WP_Query($args); if ( !$query->have_posts() ) return '';
    $html = '<h3 class="related-title" style="margin-top:60px; font-size:20px; font-weight:bold; color:#004471; border-left:5px solid #ff9800; padding-left:15px;">同じ地域の遊漁船</h3><div class="fishing-card-grid">';
    while ( $query->have_posts() ) { $query->the_post(); $pid = get_the_ID(); $thumb = get_the_post_thumbnail_url($pid, 'medium') ?: 'https://via.placeholder.com/400x300';
    $html .= sprintf('<a href="%s" class="fishing-card">%s<div class="card-img-wrapper"><img src="%s"></div><div class="card-content"><h3 class="card-title">%s</h3><div class="card-address">          📍           %s</div>%s %s</div></a>', get_permalink(), get_favorite_button($pid), esc_url($thumb), get_the_title(), esc_html(get_post_meta($pid, '_boat_address', true)), get_boat_rating_html($pid), get_facility_icons_html($pid));
    }
    $html .= '</div>'; wp_reset_postdata(); return $html;
}

// ==========================================
// 4. 送信ロジック
// ==========================================
add_action('template_redirect', function() {
    if(isset($_POST['fishing_review_submit'])) {
        if(!wp_verify_nonce($_POST['review_nonce_field'], 'submit_fishing_review')) wp_die('Security Check'); $boat_id = intval($_POST['target_boat_id']); $rev_name = !empty($_POST['rev_name']) ? sanitize_text_field($_POST['rev_name']) : '無記名ユーザー'; $rev_comment = !empty($_POST['rev_comment']) ?
        sanitize_textarea_field($_POST['rev_comment']) : ''; $new_id = wp_insert_post(['post_title' => $rev_name, 'post_content' => $rev_comment, 'post_status' => 'publish', 'post_type' => FishingApp::REVIEW_PT]);
        if($new_id){ update_post_meta($new_id, '_review_boat_id', $boat_id); update_post_meta($new_id, '_review_stars', intval($_POST['rev_stars'])); foreach(FishingApp::get_review_questions() as $key => $data) { if(isset($_POST[$key])) { update_post_meta($new_id, '_' . $key, sanitize_text_field($_POST[$key]));
        } } wp_redirect(add_query_arg('review_sent', '1', get_permalink($boat_id)) . '#reviews'); exit; }
    }
    if(isset($_POST['fishing_inquiry_submit'])) {
        if(!wp_verify_nonce($_POST['inquiry_nonce_field'], 'submit_fishing_inquiry')) wp_die('Security Check'); $boat_name = sanitize_text_field($_POST['inq_boat_name']); $owner_name = sanitize_text_field($_POST['inq_owner_name']); $email = sanitize_email($_POST['inq_email']); $tel = sanitize_text_field($_POST['inq_tel']); $address = sanitize_text_field($_POST['inq_address']);
        $insta = sanitize_text_field($_POST['inq_insta']); $web_url = esc_url_raw($_POST['inq_web_url']); $message = sanitize_textarea_field($_POST['inq_message']); $selected_facs = [];
        foreach(FishingApp::get_facilities() as $k => $v) { if(isset($_POST['inq_fac'][$k])) $selected_facs[] = strip_tags($v); } $fac_text = empty($selected_facs) ? 'なし' : implode(', ', $selected_facs);
        $post_content = "船名: $boat_name\n 代表者: $owner_name\n メール: $email\n 電話: $tel\n 住所: $address\n 公式サイト: $web_url\n Instagram ID: @$insta\n 設備: $fac_text\n\n 【お問い合わせ・ご要望】\n$message";
        $inq_id = wp_insert_post(['post_title' => '【掲載希望】' . $boat_name, 'post_content' => $post_content, 'post_status' => 'publish', 'post_type' => FishingApp::INQUIRY_PT]);
        if($inq_id){ update_post_meta($inq_id, '_inq_email', $email); update_post_meta($inq_id, '_inq_tel', $tel); update_post_meta($inq_id, '_inq_insta', $insta); update_post_meta($inq_id, '_inq_web_url', $web_url);
        if ( ! empty( $_FILES['inq_boat_img']['name'] ) ) { require_once( ABSPATH . 'wp-admin/includes/image.php' ); require_once( ABSPATH . 'wp-admin/includes/file.php' );
        require_once( ABSPATH . 'wp-admin/includes/media.php' ); $attachment_id = media_handle_upload( 'inq_boat_img', $inq_id );
        if ( ! is_wp_error( $attachment_id ) ) set_post_thumbnail( $inq_id, $attachment_id ); } $admin_email = get_option('admin_email');
        wp_mail($admin_email, '【釣果サイト】新規掲載依頼：' . $boat_name, "以下の依頼が届きました。\n\n" . $post_content); wp_redirect(add_query_arg('inquiry_sent', '1', $_SERVER['REQUEST_URI'])); exit; }
    }
});

// ==========================================
// 5. ショートコード
// ==========================================
add_shortcode('back_to_top_button', function() { return '<div class="back-home-container"><a href="'.esc_url(home_url('/')).'" class="btn-back-home">          🏠           トップページに戻る</a></div>'; });

add_shortcode('fishing_inquiry_form', function() {
    $msg = (isset($_GET['inquiry_sent'])) ? '<div class="form-msg form-msg-success">          ✨           お問い合わせを受け付けました。</div>' : '';
    $nonce = wp_nonce_field('submit_fishing_inquiry', 'inquiry_nonce_field', true, false); $fac_html = '<div class="form-facility-grid">';
    foreach(FishingApp::get_facilities() as $k => $v) { $fac_html .= sprintf('<label><input type="checkbox" name="inq_fac[%s]" value="1"> %s</label>', esc_attr($k), esc_html($v)); }
    return <<<HTML
<div class="fishing-form-container"><div class="fishing-form-title">掲載のお問い合わせ</div>{$msg}<form method="post" enctype="multipart/form-data">{$nonce}
<div class="form-group"><label>船名</label><input type="text" name="inq_boat_name" required></div>
<div class="form-group"><label>代表者名</label><input type="text" name="inq_owner_name" required></div>
<div class="form-group"><label>メール</label><input type="email" name="inq_email" required></div>
<div class="form-group"><label>電話番号</label><input type="tel" name="inq_tel" required></div>
<div class="form-group"><label>住所</label><input type="text" name="inq_address" required></div>
<div class="form-group"><label>公式ホームページURL</label><input type="url" name="inq_web_url" placeholder="https://example.com"></div>
<div class="form-group"><label>Instagram ID</label><input type="text" name="inq_insta" placeholder="例: fishing_boat_id"></div>
<div class="form-group"><label>登録用船体画像（1枚）</label><input type="file" name="inq_boat_img" accept="image/*"></div>
<div class="form-group"><label>備わっている設備</label>{$fac_html}</div></div>
<div class="form-group"><label>その他のお問い合わせ・ご要望など</label><textarea name="inq_message" rows="6" placeholder="追加したい情報やご質問があればご記入ください"></textarea></div>
<button type="submit" name="fishing_inquiry_submit" class="submit-btn">この内容で掲載依頼を送信する</button></form></div>
HTML;
});

add_shortcode('fishing_slider', function($atts) {
    $args = ['post_type' => FishingApp::BOAT_PT, 'posts_per_page' => -1, 'orderby' => 'rand', 'meta_query' => [['key' => '_boat_recommend', 'value' => '1']]];
    $query = new WP_Query($args); if(!$query->have_posts()) return '';
    $output = '<div class="fishing-main-slider-wrapper"><div class="fishing-main-slider" id="boatSlider">';
    while($query->have_posts()){ $query->the_post(); $pid = get_the_ID(); $thumb = get_the_post_thumbnail_url($pid, 'medium') ?: 'https://via.placeholder.com/400x300';
    $output .= sprintf('<div class="slider-item"><a href="%s" class="fishing-card"><span class="recommend-badge">おすすめの遊漁船</span>%s<div class="card-img-wrapper"><img src="%s"></div><div class="card-content"><h3 class="card-title">%s</h3><div class="card-address">          📍           %s</div>%s %s</div></a></div>', get_permalink(), get_favorite_button($pid), esc_url($thumb), get_the_title(), esc_html(get_post_meta($pid, '_boat_address', true)), get_boat_rating_html($pid), get_facility_icons_html($pid));
    }
    $output .= '</div></div>'; wp_reset_postdata(); return $output;
});

add_shortcode('fishing_search', function() {
    $areas = get_terms(['taxonomy' => FishingApp::AREA_TAX, 'hide_empty' => false]); ob_start(); ?>
<form role="search" method="get" class="search-container" action="<?php echo esc_url(home_url('/')); ?>"><input type="hidden" name="post_type" value="<?php echo FishingApp::BOAT_PT; ?>"><select name="<?php echo FishingApp::AREA_TAX; ?>"><option value="">地域から探す</option><?php if(!is_wp_error($areas)) foreach($areas as $a): ?><option value="<?php echo esc_attr($a->slug); ?>"><?php echo esc_html($a->name);
?></option><?php endforeach; ?></select><input type="submit" class="search-btn" value="検索"></form>
<?php return ob_get_clean();
});

add_shortcode('fishing_list', function($atts) {
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; $a = shortcode_atts(['recommend' => '', 'num' => 6, 'area' => ''], $atts);
    $args = ['post_type' => FishingApp::BOAT_PT, 'posts_per_page' => intval($a['num']), 'orderby' => 'date', 'order' => 'DESC', 'paged' => $paged];
    if($a['recommend']==='yes') $args['meta_query'] = [['key'=>'_boat_recommend','value'=>'1']]; if(!empty($a['area'])) $args['tax_query'] = [['taxonomy'=>FishingApp::AREA_TAX,'field'=>'slug','terms'=>$a['area']]]; $query = new WP_Query($args);
    $output = get_adsense_html(); $output .= '<div class="fishing-card-grid">';
    if($query->have_posts()){ while($query->have_posts()){ $query->the_post(); $pid=get_the_ID(); $thumb=get_the_post_thumbnail_url($pid,'medium')?:'https://via.placeholder.com/400x300'; $output .= sprintf('<a href="%s" class="fishing-card">%s<div class="card-img-wrapper"><img src="%s"></div><div class="card-content"><h3 class="card-title">%s</h3><div class="card-address">          📍           %s</div>%s %s</div></a>', get_permalink(), get_favorite_button($pid), esc_url($thumb), get_the_title(), esc_html(get_post_meta($pid,'_boat_address',true)), get_boat_rating_html($pid), get_facility_icons_html($pid));
    } }
    $output .= '</div>'; $big = 999999999; $pagination = paginate_links(['base' => str_replace($big, '%#%', esc_url(get_pagenum_link($big))), 'format' => '?paged=%#%', 'current' => max(1, $paged), 'total' => $query->max_num_pages, 'type' => 'list', 'prev_text' => '« 前へ', 'next_text' => '次へ »']);
    if($pagination) $output .= '<div class="fishing-pagination-wrapper"><nav class="fishing-pagination">' . $pagination . '</nav></div>';
    wp_reset_postdata(); return $output;
});

add_shortcode('fishing_girl_list', function($atts) {
    $a = shortcode_atts(['num' => 12], $atts); $query = new WP_Query(['post_type'=>FishingApp::GIRL_PT, 'posts_per_page'=>intval($a['num']), 'orderby'=>'date', 'order'=>'DESC']);
    $output = '<div class="fishing-card-grid">';
    while($query->have_posts()){ $query->the_post(); $thumb=get_the_post_thumbnail_url(get_the_ID(),'medium')?:'https://via.placeholder.com/400x300'; $output .= sprintf('<a href="%s" class="fishing-card"><div class="card-img-wrapper"><img src="%s"></div><div class="card-content"><h3 class="card-title" style="text-align:center;">%s</h3></div></a>', get_permalink(), esc_url($thumb), get_the_title()); }
    $output .= '</div>'; wp_reset_postdata(); return $output;
});

add_shortcode('fishing_insta_list', function() {
    $query = new WP_Query(['post_type'=>FishingApp::BOAT_PT,'posts_per_page'=>-1,'meta_query'=>[['key'=>'_boat_insta_username','value'=>'','compare'=>'!=']]]); if(!$query->have_posts()) return '<p>表示する釣果情報がありません。</p>';
    $output = '<div class="insta-grid">';
    while($query->have_posts()){ $query->the_post(); $insta = get_post_meta(get_the_ID(),'_boat_insta_username',true); $output .= sprintf('<div class="insta-item"><span class="insta-boat-name">          🚢           %s</span><blockquote class="instagram-media" data-instgrm-permalink="https://www.instagram.com/%s/" data-instgrm-version="14" style="width:100%%; min-width:unset !important;"></blockquote>%s</div>', get_the_title(), esc_attr($insta), get_instagram_follow_button($insta));
    }
    $output .= '</div><script async src="//www.instagram.com/embed.js"></script>'; wp_reset_postdata(); return $output;
});

add_shortcode('fishing_insta_single', function($atts) {
    $a = shortcode_atts(['id' => '', 'name' => 'Instagram'], $atts); if(empty($a['id'])) return ''; $insta = esc_attr($a['id']); $name = esc_html($a['name']);
    $output = '<div class="insta-grid" style="max-width:400px; margin:0 auto;"><div class="insta-item"><span class="insta-boat-name">          🚢           %s</span><blockquote class="instagram-media" data-instgrm-permalink="https://www.instagram.com/%s/" data-instgrm-version="14" style="width:100%%; min-width:unset !important;"></blockquote>%s</div></div><script async src="//www.instagram.com/embed.js"></script>';
    return sprintf($output, $name, $insta, get_instagram_follow_button($insta));
});

add_shortcode('fishing_area_list', function($atts) {
    $a = shortcode_atts(['only_fav' => 'no'], $atts); $is_fav_only = ($a['only_fav'] === 'yes'); $areas = get_terms(['taxonomy' => FishingApp::AREA_TAX, 'hide_empty' => true]);
    $container_id = $is_fav_only ? 'fav-only-list' : 'all-area-list'; $output = sprintf('<div id="%s">', $container_id);
    if ($is_fav_only) { $output .= '<p id="no-fav-message" style="display:none; text-align:center; padding:40px; color:#666;">お気に入り登録された遊漁船はまだありません。</p>'; }
    foreach($areas as $area){ $query = new WP_Query(['post_type'=>FishingApp::BOAT_PT,'posts_per_page'=>-1,'tax_query'=>[['taxonomy'=>FishingApp::AREA_TAX,'field'=>'term_id','terms'=>$area->term_id]]]); if($query->have_posts()){ $output .= sprintf('<div class="area-section"><h4 class="area-title">%s</h4><ul class="area-boat-list">', esc_html($area->name)); while($query->have_posts()){ $query->the_post();
    $output .= sprintf('<li class="boat-item" data-id="%d"><a href="%s">%s</a></li>', get_the_ID(), get_permalink(), get_the_title()); } $output .= '</ul></div>'; } wp_reset_postdata(); }
    $output .= '</div>'; return $output;
});

add_shortcode('page_buttons', function($atts) {
    $a = shortcode_atts(['ids' => ''], $atts); if(empty($a['ids'])) return ''; $output = '<div class="page-btn-container">';
    foreach(explode(',',$a['ids']) as $id){ $id=trim($id); if($id) $output .= sprintf('<a href="%s" class="page-link-btn">%s</a>', get_permalink($id), get_the_title($id)); }
    $output .= '</div>'; return $output;
});

add_shortcode('fishing_maker_list', function() {
    $args = ['post_type'=>FishingApp::MAKER_PT,'posts_per_page'=>-1,'orderby'=>'menu_order','order'=>'ASC']; $query = new WP_Query($args); if(!$query->have_posts()) return '<p>登録されているメーカーはありません。</p>';
    $output = '<div class="maker-logo-grid">'; while($query->have_posts()){ $query->the_post(); $pid = get_the_ID(); $url = get_post_meta($pid, '_maker_url', true); $thumb = get_the_post_thumbnail_url($pid, 'medium');
    if($thumb) { $img_tag = sprintf('<img src="%s" alt="%s">', esc_url($thumb), get_the_title()); if($url) { $output .= sprintf('<a href="%s" target="_blank" class="maker-logo-item" title="%s">%s</a>', esc_url($url), get_the_title(), $img_tag);
    } else { $output .= sprintf('<div class="maker-logo-item">%s</div>', $img_tag); } } }
    $output .= '</div>'; wp_reset_postdata(); return $output;
});

// ==========================================
// 6. 個別ページ自動挿入
// ==========================================
function get_boat_reviews_and_form_html($boat_id) {
    $reviews = get_posts(['post_type'=>FishingApp::REVIEW_PT, 'meta_key'=>'_review_boat_id', 'meta_value'=>$boat_id, 'posts_per_page'=>-1, 'orderby'=>'date', 'order'=>'DESC']); $html = '<div id="reviews" style="margin-top:60px; font-weight:bold; font-size:20px; color:#004471; border-left:5px solid #ff9800; padding-left:15px; margin-bottom:20px;">利用者の口コミ</div>';
    if(empty($reviews)){ $html .= '<p>まだ口コミはありません。</p>'; } else { $html .= '<div class="review-list" style="display:flex; flex-direction:column; gap:20px; margin-bottom:40px;">'; foreach($reviews as $r){ $s=(int)get_post_meta($r->ID,'_review_stars',true);
    $stars=str_repeat('★',$s).str_repeat('<span class="star-empty">☆</span>',5-$s); $html .= sprintf('<div class="review-card" style="background:#fff; border:1px solid #eee; padding:20px; border-radius:12px;"><div class="review-header" style="display:flex; justify-content:space-between; margin-bottom:10px;"><div class="review-user">          👤           %s</div><div class="review-stars" style="color:#ff9800;">%s</div></div><div class="review-comment">%s</div></div>', esc_html($r->post_title), $stars, nl2br(esc_html($r->post_content)));
    } $html .= '</div>'; }
    $nonce = wp_nonce_field('submit_fishing_review', 'review_nonce_field', true, false); $q_fields = '<div class="form-review-grid">'; foreach(FishingApp::get_review_questions() as $key => $data) { $options = '';
    foreach($data['opts'] as $opt) { $options .= sprintf('<option value="%s">%s</option>', esc_attr($opt), esc_html($opt)); } $q_fields .= sprintf('<div class="review-q-item"><label class="review-q-label">%s</label><select name="%s">%s</select></div>', esc_html($data['q']), esc_attr($key), $options);
    } $q_fields .= '</div>';
    $html .= <<<HTML
<div class="fishing-form-container"><div class="fishing-form-title">口コミを投稿する</div><form method="post">{$nonce}<input type="hidden" name="target_boat_id" value="{$boat_id}">
<div class="form-group"><label>お名前（無記名可）</label><input type="text" name="rev_name" placeholder="ニックネームなど（未入力は無記名）"></div>
<div class="form-group"><label>総合満足度</label><select name="rev_stars"><option value="5">★★★★★</option><option value="4">★★★★☆</option><option value="3" selected>★★★☆☆</option><option value="2">★★☆☆☆</option><option value="1">★☆☆☆☆</option></select></div>
<label style="display:block; font-weight:bold; margin-bottom:15px; color:#004471; border-bottom:1px solid #eee; padding-bottom:5px;">詳細評価</label>{$q_fields}
<div class="form-group"><label>コメント（任意）</label><textarea name="rev_comment" rows="5" placeholder="自由にご記入ください"></textarea></div>
<button type="submit" name="fishing_review_submit" class="submit-btn">投稿する</button></form></div>
HTML;
    return $html;
}

add_filter('the_content', function($content) {
    if(!is_singular() || !is_main_query() || is_admin()) return $content;
    $id = get_the_ID(); $type = get_post_type($id);
    if($type === FishingApp::BOAT_PT) {
        $address = get_post_meta($id,'_boat_address',true); $tel = get_post_meta($id,'_boat_tel',true); $web = get_post_meta($id,'_boat_website',true); $insta = get_post_meta($id,'_boat_insta_username',true); $thumb = get_the_post_thumbnail_url($id,'large'); $img_tag = $thumb ?
        sprintf('<div class="single-boat-thumb-wrapper">%s<img src="%s" class="single-boat-thumb"></div>', get_favorite_button($id), esc_url($thumb)) : ''; $btns = '<div class="btn-group">';
        if($tel) $btns .= sprintf('<a href="tel:%s" class="btn-tel">          📞           電話で予約・問合せ</a>', esc_attr($tel));
        if($web) $btns .= sprintf('<a href="%s" target="_blank" class="btn-web">          🌐           公式ホームページ</a>', esc_url($web));
        $btns .= '</div>'; $fac_box = sprintf('<div style="margin:20px 0; padding:15px; background:#f9f9f9; border-radius:8px;"><strong>【設備・評価】</strong>%s %s</div>', get_facility_icons_html($id), get_boat_rating_html($id)); $insta_embed = $insta ?
        sprintf('<div style="margin-top:40px;"><h3 style="border-left:5px solid #004471; padding-left:15px;">最新の投稿</h3><div style="max-width:540px; margin:0 auto;"><blockquote class="instagram-media" data-instgrm-permalink="https://www.instagram.com/%s/" data-instgrm-version="14"></blockquote></div>%s</div><script async src="//www.instagram.com/embed.js"></script>', esc_attr($insta), get_instagram_follow_button($insta)) : '';
        return $img_tag . '<p style="font-size:16px; font-weight:bold; color:#666;">          📍           住所：'.esc_html($address).'</p>' .
        $btns . $fac_box . $content . get_boat_reviews_and_form_html($id) . $insta_embed . get_related_area_boats_html($id);
    }
    if($type === FishingApp::GIRL_PT) {
        $insta = get_post_meta($id, '_boat_insta_username', true); $thumb = get_the_post_thumbnail_url($id, 'large'); $img_tag = $thumb ? sprintf('<div class="single-boat-thumb-wrapper"><img src="%s" class="single-boat-thumb"></div>', esc_url($thumb)) : '';
        $insta_embed = $insta ? sprintf('<div style="margin-top:40px;"><h3 style="border-left:5px solid #e91e63; padding-left:15px;">Instagram フィード</h3><div style="max-width:540px; margin:0 auto;"><blockquote class="instagram-media" data-instgrm-permalink="https://www.instagram.com/%s/" data-instgrm-version="14"></blockquote></div>%s</div><script async src="//www.instagram.com/embed.js"></script>', esc_attr($insta), get_instagram_follow_button($insta)) : '';
        return $img_tag . $content . $insta_embed;
    }
    return $content;
});

// ==========================================
// 7. 管理画面初期設定
// ==========================================
add_action('init', function() {
    register_post_type(FishingApp::BOAT_PT, ['labels'=>['name'=>'遊漁船'],'public'=>true,'has_archive'=>true,'menu_icon'=>'dashicons-anchor','supports'=>['title','editor','thumbnail'],'show_in_rest'=>true]); register_taxonomy(FishingApp::AREA_TAX, FishingApp::BOAT_PT, ['label'=>'エリア','hierarchical'=>true,'show_in_rest'=>true]); register_post_type(FishingApp::GIRL_PT, ['labels'=>['name'=>'釣ガール'],'public'=>true,'has_archive'=>true,'menu_icon'=>'dashicons-heart','supports'=>['title','editor','thumbnail'],'show_in_rest'=>true]); register_post_type(FishingApp::REVIEW_PT, ['labels'=>['name'=>'口コミ'],'public'=>false,'show_ui'=>true,'menu_icon'=>'dashicons-star-filled','supports'=>['title','editor']]); register_post_type(FishingApp::INQUIRY_PT, ['labels'=>['name'=>'問い合わせ'],'public'=>false,'show_ui'=>true,'menu_icon'=>'dashicons-email-alt','supports'=>['title','editor','thumbnail']]); register_post_type(FishingApp::MAKER_PT, ['labels'=>['name'=>'メーカー'],'public'=>true,'show_ui'=>true,'menu_icon'=>'dashicons-hammer','supports'=>['title','thumbnail','page-attributes'],'has_archive'=>false,'show_in_rest'=>true]);
});

add_action('admin_enqueue_scripts', function($hook) {
    if (in_array($hook, ['post.php', 'post-new.php'])) {
        wp_enqueue_media();
    }
});

add_action('add_meta_boxes', function() { add_meta_box('boat_details','詳細・設備','render_boat_metabox',FishingApp::BOAT_PT,'normal','high'); add_meta_box('girl_details','SNS情報','render_girl_metabox',FishingApp::GIRL_PT,'normal','high'); add_meta_box('maker_details','メーカー情報','render_maker_metabox',FishingApp::MAKER_PT,'normal','high'); });

function render_boat_metabox($post) {
    wp_nonce_field('boat_save','boat_nonce'); $address=get_post_meta($post->ID,'_boat_address',true); $tel=get_post_meta($post->ID,'_boat_tel',true); $insta=get_post_meta($post->ID,'_boat_insta_username',true); $web=get_post_meta($post->ID,'_boat_website',true); $recommend = get_post_meta($post->ID, '_boat_recommend', true);
    $thumb_id = get_post_thumbnail_id($post->ID);
    $img_url = $thumb_id ? wp_get_attachment_image_url($thumb_id, 'medium') : '';
    
    echo '<div class="boat-meta-box-content">';
    echo '<p>おすすめ登録<br><label><input type="checkbox" name="boat_recommend" value="1" '.checked($recommend, '1', false).'> この遊漁船をおすすめ（スライダー）に表示する</label></p>';
    
    echo '<div style="margin-bottom: 20px; padding: 10px; background: #f9f9f9; border: 1px solid #ddd; border-radius: 4px;">';
    echo '<strong>船体画像（アイキャッチ画像）</strong><br>';
    echo '<div id="boat-image-preview" style="margin: 10px 0;">';
    if ($img_url) { echo '<img src="' . esc_url($img_url) . '" style="max-width:200px; height:auto; display:block;">'; }
    echo '</div>';
    echo '<input type="hidden" name="_thumbnail_id" id="boat-image-id" value="' . esc_attr($thumb_id) . '">';
    echo '<button type="button" class="button" id="boat-image-upload">画像をセットする</button> ';
    echo '<button type="button" class="button" id="boat-image-remove" ' . ($img_url ? '' : 'style="display:none;"') . '>削除</button>';
    echo '</div>';

    // 【修正箇所】設備チェックボックスの表示
    echo '<div style="margin-bottom: 20px;">';
    echo '<strong>備わっている設備（アイコン表示）</strong><br>';
    echo '<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 5px; background: #f1f1f1; padding: 10px; border-radius: 4px; margin-top:5px;">';
    foreach (FishingApp::get_facilities() as $key => $label) {
        $checked = (get_post_meta($post->ID, '_boat_fac_' . $key, true) === '1') ? 'checked' : '';
        echo sprintf('<label style="font-size:12px;"><input type="checkbox" name="boat_fac[%s]" value="1" %s> %s</label>', esc_attr($key), $checked, esc_html($label));
    }
    echo '</div></div>';

    echo '<p>住所<br><input type="text" name="boat_address" value="'.esc_attr($address).'" style="width:100%"></p><p>電話<br><input type="text" name="boat_tel" value="'.esc_attr($tel).'" style="width:100%"></p><p>Instagram ID<br><input type="text" name="boat_insta_username" value="'.esc_attr($insta).'" style="width:100%"></p><p>HP URL<br><input type="url" name="boat_website" value="'.esc_url($web).'" style="width:100%"></p>';
    echo '</div>';
    ?>
    <script>
    jQuery(document).ready(function($){
        var frame;
        $('#boat-image-upload').on('click', function(e) {
            e.preventDefault();
            if (frame) { frame.open(); return; }
            frame = wp.media({ title: '画像を選択', button: { text: '画像を使用する' }, multiple: false });
            frame.on('select', function() {
                var attachment = frame.state().get('selection').first().toJSON();
                $('#boat-image-id').val(attachment.id);
                $('#boat-image-preview').html('<img src="'+attachment.url+'" style="max-width:200px;height:auto;display:block;">');
                $('#boat-image-remove').show();
            });
            frame.open();
        });
        $('#boat-image-remove').on('click', function(e) {
            e.preventDefault();
            $('#boat-image-id').val('-1');
            $('#boat-image-preview').empty();
            $(this).hide();
        });
    });
    </script>
    <?php
}

function render_girl_metabox($post) { wp_nonce_field('boat_save','boat_nonce'); $insta = get_post_meta($post->ID, '_boat_insta_username', true); echo '<p>Instagram ID (例: 123fishing_girl)<br><input type="text" name="boat_insta_username" value="'.esc_attr($insta).'" style="width:100%"></p>'; }

function render_maker_metabox($post) { wp_nonce_field('maker_save','maker_nonce'); $url = get_post_meta($post->ID, '_maker_url', true); echo '<p>公式サイトURL<br><input type="url" name="maker_url" value="'.esc_url($url).'" style="width:100%" placeholder="https://example.com"></p><p style="color:#666; font-size:12px;">※メーカーロゴは右側の「アイキャッチ画像」で設定してください。</p>'; }

add_action('save_post', function($post_id) {
    if(isset($_POST['boat_nonce']) && wp_verify_nonce($_POST['boat_nonce'], 'boat_save')) {
        if (isset($_POST['boat_address'])) update_post_meta($post_id, '_boat_address', sanitize_text_field($_POST['boat_address']));
        if (isset($_POST['boat_tel'])) update_post_meta($post_id, '_boat_tel', sanitize_text_field($_POST['boat_tel']));
        if (isset($_POST['boat_website'])) update_post_meta($post_id, '_boat_website', esc_url_raw($_POST['boat_website']));
        if (isset($_POST['boat_insta_username'])) update_post_meta($post_id, '_boat_insta_username', sanitize_text_field($_POST['boat_insta_username']));
        $recommend = isset($_POST['boat_recommend']) ? '1' : '0'; update_post_meta($post_id, '_boat_recommend', $recommend);
        
        // 【修正箇所】設備の保存処理
        $facilities = FishingApp::get_facilities();
        foreach ($facilities as $key => $label) {
            $val = (isset($_POST['boat_fac'][$key])) ? '1' : '0';
            update_post_meta($post_id, '_boat_fac_' . $key, $val);
        }

        if (isset($_POST['_thumbnail_id'])) {
            $thumb_id = intval($_POST['_thumbnail_id']);
            if ($thumb_id === -1) { delete_post_thumbnail($post_id); } else if ($thumb_id > 0) { set_post_thumbnail($post_id, $thumb_id); }
        }
    }
    if(isset($_POST['maker_nonce']) && wp_verify_nonce($_POST['maker_nonce'], 'maker_save')) {
        if (isset($_POST['maker_url'])) update_post_meta($post_id, '_maker_url', esc_url_raw($_POST['maker_url']));
    }
});

// ==========================================
// 8. JS & Footer
// ==========================================
add_action('wp_footer', function() {
    ?>
<div class="admin-footer-nav"><a href="<?php echo esc_url(home_url('/')); ?>">ホーム</a><a href="<?php echo esc_url(home_url('/inquiry')); ?>">遊漁船登録のお問い合わせ</a></div>
<script>
const FAV_KEY = 'fishing_favs_zenkoku';
function toggleFavorite(event, btn) { event.preventDefault(); event.stopPropagation(); const postId = btn.getAttribute('data-id'); let favs = JSON.parse(localStorage.getItem(FAV_KEY) || '[]'); const index = favs.indexOf(postId);
if (index > -1) { favs.splice(index, 1); btn.classList.remove('active'); const textSpan = btn.querySelector('.fav-text'); if (textSpan) textSpan.textContent = 'お気に入り';
} else { favs.push(postId); btn.classList.add('active'); const textSpan = btn.querySelector('.fav-text'); if (textSpan) textSpan.textContent = '登録済み'; } localStorage.setItem(FAV_KEY, JSON.stringify(favs));
if (typeof updateFavDisplay === 'function') { updateFavDisplay(); } }
function updateFavDisplay() { const favs = JSON.parse(localStorage.getItem(FAV_KEY) || '[]'); const noFavMsg = document.getElementById('no-fav-message'); const favOnlyList = document.getElementById('fav-only-list');
let visibleCountInFavPage = 0; document.querySelectorAll('.fav-btn').forEach(btn => { const id = btn.getAttribute('data-id'); if (favs.includes(id)) { btn.classList.add('active'); const textSpan = btn.querySelector('.fav-text'); if (textSpan) textSpan.textContent = '登録済み'; } else { btn.classList.remove('active'); const textSpan = btn.querySelector('.fav-text'); if (textSpan) textSpan.textContent = 'お気に入り'; } });
if (favOnlyList) { favOnlyList.querySelectorAll('.area-section').forEach(section => { let hasVisible = false; section.querySelectorAll('.boat-item').forEach(li => { const boatId = li.getAttribute('data-id'); if (favs.includes(boatId)) { li.style.display = 'block'; hasVisible = true; visibleCountInFavPage++; } else { li.style.display = 'none'; } }); section.style.display = hasVisible ? 'block' : 'none'; });
if (noFavMsg) { noFavMsg.style.display = visibleCountInFavPage === 0 ? 'block' : 'none'; } } }
document.addEventListener('DOMContentLoaded', function() { updateFavDisplay(); const slider = document.getElementById('boatSlider'); if (slider && slider.children.length > 1) { let index = 0; setInterval(() => { index = (index + 1) % slider.children.length; slider.style.transform = `translateX(-${index * 100}%)`; }, 5000); } });
</script>
<?php
} );