<?php
/**
 * AdSense 测试网站 - 清空和重建脚本
 * 
 * 功能:
 * 1. 清空所有现有文章和页面
 * 2. 重置网站设置
 * 3. 创建新的分类结构
 * 4. 创建作者账号
 * 5. 创建必需页面
 */

// 配置
$sites = [
    'alonzopichardo.com' => [
        'path' => '/home/kimiclaw/public_html/alonzopichardo.com',
        'title' => 'NHS Complete Guide',
        'description' => 'Your Essential Guide to UK Healthcare',
        'theme' => 'nhs',
        'categories' => [
            'GP Services',
            'Emergency Care',
            'Prescriptions & Pharmacy',
            'Dental & Optical',
            'Mental Health',
            'Private Healthcare'
        ],
        'authors' => [
            ['username' => 'sarah_mitchell', 'display_name' => 'Dr. Sarah Mitchell', 'role' => 'Founder & Medical Editor'],
            ['username' => 'james_thompson', 'display_name' => 'James Thompson', 'role' => 'Healthcare Writer'],
            ['username' => 'emma_roberts', 'display_name' => 'Emma Roberts', 'role' => 'Patient Advocate']
        ]
    ],
    'blueup.shop' => [
        'path' => '/home/kimiclaw/public_html/blueup.shop',
        'title' => 'London Rent Guide',
        'description' => 'Your Complete Guide to Renting in London',
        'theme' => 'rent',
        'categories' => [
            'Area Guides',
            'Renting Process',
            'Costs & Budgeting',
            'Tenant Rights',
            'Student Housing',
            'Tips & Advice'
        ],
        'authors' => [
            ['username' => 'michael_chen', 'display_name' => 'Michael Chen', 'role' => 'Founder & Property Expert'],
            ['username' => 'sophie_williams', 'display_name' => 'Sophie Williams', 'role' => 'Area Specialist'],
            ['username' => 'david_brown', 'display_name' => 'David Brown', 'role' => 'Tenant Rights Advisor']
        ]
    ],
    'dgbgtee.shop' => [
        'path' => '/home/kimiclaw/public_html/dgbgtee.shop',
        'title' => 'UK IT Jobs Guide',
        'description' => 'Your Complete Guide to Tech Careers in the UK',
        'theme' => 'itjobs',
        'categories' => [
            'Company Guides',
            'Interview Prep',
            'Career Paths',
            'Salaries & Benefits',
            'Skills & Learning',
            'Visa & Relocation'
        ],
        'authors' => [
            ['username' => 'alex_kumar', 'display_name' => 'Alex Kumar', 'role' => 'Founder & Tech Recruiter'],
            ['username' => 'rachel_green', 'display_name' => 'Rachel Green', 'role' => 'Career Coach'],
            ['username' => 'tom_anderson', 'display_name' => 'Tom Anderson', 'role' => 'Senior Developer']
        ]
    ]
];

// 获取当前域名
$current_domain = $_SERVER['HTTP_HOST'];
$current_domain = str_replace('www.', '', $current_domain);

// 检查是哪个网站
$site_config = null;
foreach ($sites as $domain => $config) {
    if (strpos($current_domain, $domain) !== false) {
        $site_config = $config;
        $site_config['domain'] = $domain;
        break;
    }
}

if (!$site_config) {
    die("错误: 无法识别当前域名 ($current_domain)");
}

// 加载 WordPress
require_once($site_config['path'] . '/wp-load.php');

echo "<h1>AdSense 测试网站 - 清空和重建</h1>";
echo "<h2>网站: {$site_config['domain']}</h2>";
echo "<hr>";

// 步骤 1: 清空现有内容
echo "<h3>步骤 1: 清空现有内容</h3>";

// 删除所有文章
$posts = get_posts(['post_type' => 'post', 'numberposts' => -1, 'post_status' => 'any']);
$deleted_posts = 0;
foreach ($posts as $post) {
    wp_delete_post($post->ID, true);
    $deleted_posts++;
}
echo "✅ 删除了 $deleted_posts 篇文章<br>";

// 删除所有页面 (保留默认页面)
$pages = get_posts(['post_type' => 'page', 'numberposts' => -1, 'post_status' => 'any']);
$deleted_pages = 0;
foreach ($pages as $page) {
    if ($page->ID > 2) { // 保留 ID 1 和 2 (默认页面)
        wp_delete_post($page->ID, true);
        $deleted_pages++;
    }
}
echo "✅ 删除了 $deleted_pages 个页面<br>";

// 删除所有分类 (保留默认分类)
$categories = get_categories(['hide_empty' => false]);
$deleted_cats = 0;
foreach ($categories as $category) {
    if ($category->term_id > 1) { // 保留 ID 1 (Uncategorized)
        wp_delete_category($category->term_id);
        $deleted_cats++;
    }
}
echo "✅ 删除了 $deleted_cats 个分类<br>";

// 步骤 2: 更新网站设置
echo "<h3>步骤 2: 更新网站设置</h3>";

update_option('blogname', $site_config['title']);
update_option('blogdescription', $site_config['description']);
update_option('permalink_structure', '/%postname%/');

echo "✅ 网站标题: {$site_config['title']}<br>";
echo "✅ 网站描述: {$site_config['description']}<br>";
echo "✅ 永久链接: /%postname%/<br>";

// 步骤 3: 创建分类
echo "<h3>步骤 3: 创建分类</h3>";

$created_categories = [];
foreach ($site_config['categories'] as $cat_name) {
    $cat_id = wp_create_category($cat_name);
    $created_categories[$cat_name] = $cat_id;
    echo "✅ 创建分类: $cat_name (ID: $cat_id)<br>";
}

// 步骤 4: 创建作者账号
echo "<h3>步骤 4: 创建作者账号</h3>";

$created_authors = [];
foreach ($site_config['authors'] as $author_data) {
    // 检查用户是否已存在
    $user = get_user_by('login', $author_data['username']);
    
    if (!$user) {
        // 创建新用户
        $user_id = wp_create_user(
            $author_data['username'],
            wp_generate_password(12, true),
            $author_data['username'] . '@' . $site_config['domain']
        );
        
        if (!is_wp_error($user_id)) {
            // 更新用户信息
            wp_update_user([
                'ID' => $user_id,
                'display_name' => $author_data['display_name'],
                'role' => 'author'
            ]);
            
            // 添加作者描述
            update_user_meta($user_id, 'description', $author_data['role']);
            
            $created_authors[$author_data['display_name']] = $user_id;
            echo "✅ 创建作者: {$author_data['display_name']} (ID: $user_id)<br>";
        } else {
            echo "❌ 创建作者失败: {$author_data['display_name']}<br>";
        }
    } else {
        $created_authors[$author_data['display_name']] = $user->ID;
        echo "ℹ️ 作者已存在: {$author_data['display_name']} (ID: {$user->ID})<br>";
    }
}

// 步骤 5: 创建必需页面
echo "<h3>步骤 5: 创建必需页面</h3>";

$required_pages = [
    'About Us' => get_about_content($site_config),
    'Contact' => get_contact_content($site_config),
    'Privacy Policy' => get_privacy_content($site_config),
    'Disclaimer' => get_disclaimer_content($site_config),
    'Terms of Service' => get_terms_content($site_config),
    'Cookie Policy' => get_cookie_content($site_config)
];

$created_pages = [];
foreach ($required_pages as $page_title => $page_content) {
    $page_id = wp_insert_post([
        'post_title' => $page_title,
        'post_content' => $page_content,
        'post_status' => 'publish',
        'post_type' => 'page',
        'post_author' => reset($created_authors) // 使用第一个作者
    ]);
    
    if ($page_id && !is_wp_error($page_id)) {
        $created_pages[$page_title] = $page_id;
        echo "✅ 创建页面: $page_title (ID: $page_id)<br>";
    } else {
        echo "❌ 创建页面失败: $page_title<br>";
    }
}

// 完成
echo "<h3>✅ 清空和重建完成!</h3>";
echo "<p><strong>下一步</strong>: 开始生成文章内容</p>";
echo "<p><a href='/'>返回首页</a></p>";

// ===== 页面内容生成函数 =====

function get_about_content($config) {
    $title = $config['title'];
    $domain = $config['domain'];
    
    return <<<HTML
<h2>Welcome to $title</h2>

<p>$title is your comprehensive resource for [topic]. We're dedicated to providing accurate, up-to-date, and practical information to help you [goal].</p>

<h3>Our Mission</h3>
<p>Our mission is to make [topic] accessible and understandable for everyone. Whether you're [audience 1], [audience 2], or [audience 3], we're here to help you navigate [topic] with confidence.</p>

<h3>Our Team</h3>
<p>Our team consists of experienced professionals who are passionate about [topic]. We combine years of practical experience with in-depth research to bring you the most reliable information.</p>

<h3>What We Offer</h3>
<ul>
<li>Comprehensive guides and tutorials</li>
<li>Up-to-date information and news</li>
<li>Practical tips and advice</li>
<li>Expert insights and analysis</li>
<li>Useful tools and resources</li>
</ul>

<h3>Contact Us</h3>
<p>Have questions or suggestions? We'd love to hear from you. Visit our <a href="/contact/">Contact page</a> to get in touch.</p>

<p><strong>Address:</strong> 123 Example Street, London, UK, SW1A 1AA</p>
<p><strong>Email:</strong> hello@$domain</p>

<h3>Our Commitment</h3>
<p>We are committed to providing accurate, unbiased, and helpful information. All our content is thoroughly researched and regularly updated to ensure you have access to the latest information.</p>

<p>Thank you for choosing $title as your trusted resource!</p>
HTML;
}

function get_contact_content($config) {
    return <<<HTML
<h2>Get in Touch</h2>

<p>We'd love to hear from you! Whether you have a question, suggestion, or just want to say hello, feel free to reach out.</p>

<h3>Contact Form</h3>
[contact-form-7 id="1" title="Contact form 1"]

<h3>Other Ways to Reach Us</h3>
<p><strong>Email:</strong> hello@{$config['domain']}</p>
<p><strong>Address:</strong> 123 Example Street, London, UK, SW1A 1AA</p>

<h3>Response Time</h3>
<p>We typically respond to all inquiries within 24-48 hours during business days.</p>
HTML;
}

function get_privacy_content($config) {
    $title = $config['title'];
    $domain = $config['domain'];
    $date = date('F j, Y');
    
    return <<<HTML
<h2>Privacy Policy</h2>

<p><strong>Last updated:</strong> $date</p>

<p>$title ("we", "our", or "us") is committed to protecting your privacy. This Privacy Policy explains how we collect, use, disclose, and safeguard your information when you visit our website $domain.</p>

<h3>1. Information We Collect</h3>

<h4>Personal Data</h4>
<p>We may collect personally identifiable information, such as your name and email address, when you voluntarily provide it to us through contact forms or newsletter subscriptions.</p>

<h4>Usage Data</h4>
<p>We automatically collect certain information when you visit our website, including your IP address, browser type, operating system, referring URLs, and pages viewed.</p>

<h3>2. Use of Your Information</h3>
<p>We use the information we collect to:</p>
<ul>
<li>Respond to your inquiries and provide customer support</li>
<li>Send you newsletters and marketing communications (with your consent)</li>
<li>Improve our website and services</li>
<li>Analyze website usage and trends</li>
<li>Comply with legal obligations</li>
</ul>

<h3>3. Cookies and Tracking Technologies</h3>
<p>We use cookies and similar tracking technologies to enhance your experience on our website. You can control cookie settings through your browser. For more information, see our <a href="/cookie-policy/">Cookie Policy</a>.</p>

<h3>4. Third-Party Services</h3>
<p>We may use third-party services such as:</p>
<ul>
<li><strong>Google Analytics:</strong> To analyze website traffic and usage</li>
<li><strong>Google AdSense:</strong> To display advertisements</li>
<li><strong>Mailchimp:</strong> To manage email newsletters (if applicable)</li>
</ul>

<p>These third parties have their own privacy policies governing their use of your information.</p>

<h3>5. Data Protection Rights (GDPR)</h3>
<p>If you are a resident of the European Economic Area (EEA), you have certain data protection rights under the General Data Protection Regulation (GDPR):</p>
<ul>
<li><strong>Right to access:</strong> You can request copies of your personal data</li>
<li><strong>Right to rectification:</strong> You can request correction of inaccurate data</li>
<li><strong>Right to erasure:</strong> You can request deletion of your personal data</li>
<li><strong>Right to restrict processing:</strong> You can request restriction of processing</li>
<li><strong>Right to data portability:</strong> You can request transfer of your data</li>
<li><strong>Right to object:</strong> You can object to processing of your data</li>
</ul>

<p>To exercise these rights, please contact us at privacy@$domain.</p>

<h3>6. Data Security</h3>
<p>We implement appropriate technical and organizational measures to protect your personal data. However, no method of transmission over the Internet is 100% secure.</p>

<h3>7. Children's Privacy</h3>
<p>Our website is not intended for children under 13 years of age. We do not knowingly collect personal information from children under 13.</p>

<h3>8. Changes to This Privacy Policy</h3>
<p>We may update this Privacy Policy from time to time. We will notify you of any changes by posting the new Privacy Policy on this page and updating the "Last updated" date.</p>

<h3>9. Contact Us</h3>
<p>If you have questions about this Privacy Policy, please contact us at:</p>
<p><strong>Email:</strong> privacy@$domain<br>
<strong>Address:</strong> 123 Example Street, London, UK, SW1A 1AA</p>
HTML;
}

function get_disclaimer_content($config) {
    $title = $config['title'];
    
    return <<<HTML
<h2>Disclaimer</h2>

<p><strong>Last updated:</strong> <?php echo date('F j, Y'); ?></p>

<h3>1. General Information</h3>
<p>The information provided on $title is for general informational purposes only. While we strive to keep the information up-to-date and accurate, we make no representations or warranties of any kind, express or implied, about the completeness, accuracy, reliability, suitability, or availability of the information.</p>

<h3>2. Professional Advice Disclaimer</h3>
<p>The content on this website is not intended to be a substitute for professional advice. Always seek the advice of qualified professionals regarding any questions you may have.</p>

<h3>3. External Links Disclaimer</h3>
<p>Our website may contain links to external websites that are not provided or maintained by us. We do not guarantee the accuracy, relevance, timeliness, or completeness of any information on these external websites.</p>

<h3>4. Affiliate Links Disclaimer</h3>
<p>This website may contain affiliate links. If you click on an affiliate link and make a purchase, we may receive a commission at no additional cost to you. We only recommend products or services that we believe will add value to our readers.</p>

<h3>5. Errors and Omissions Disclaimer</h3>
<p>While we make every effort to ensure that the information on this website is correct, we do not warrant its completeness or accuracy. We will not be responsible for any errors or omissions, or for the results obtained from the use of this information.</p>

<h3>6. Fair Use Disclaimer</h3>
<p>This website may use copyrighted material that has not always been specifically authorized by the copyright owner. We believe this constitutes 'fair use' of any such copyrighted material as provided for in applicable copyright law.</p>

<h3>7. Views Expressed Disclaimer</h3>
<p>The views and opinions expressed on this website are those of the authors and do not necessarily reflect the official policy or position of any other agency, organization, employer, or company.</p>

<h3>8. No Responsibility Disclaimer</h3>
<p>We will not be liable for any loss or damage arising from the use of information on this website, including but not limited to indirect or consequential loss or damage, or any loss or damage whatsoever arising from loss of data or profits.</p>

<h3>9. Contact Us</h3>
<p>If you have any questions about this Disclaimer, please contact us through our <a href="/contact/">Contact page</a>.</p>
HTML;
}

function get_terms_content($config) {
    $title = $config['title'];
    $domain = $config['domain'];
    
    return <<<HTML
<h2>Terms of Service</h2>

<p><strong>Last updated:</strong> <?php echo date('F j, Y'); ?></p>

<p>Please read these Terms of Service ("Terms") carefully before using $title (the "Website").</p>

<h3>1. Acceptance of Terms</h3>
<p>By accessing and using this Website, you accept and agree to be bound by these Terms. If you do not agree to these Terms, please do not use this Website.</p>

<h3>2. Use of the Website</h3>
<p>You agree to use this Website only for lawful purposes and in a way that does not infringe the rights of, restrict, or inhibit anyone else's use and enjoyment of the Website.</p>

<h3>3. Intellectual Property Rights</h3>
<p>The content on this Website, including text, graphics, logos, images, and software, is the property of $title or its content suppliers and is protected by UK and international copyright laws.</p>

<h3>4. User Content</h3>
<p>If you submit content to this Website (such as comments), you grant us a non-exclusive, royalty-free, perpetual, and worldwide license to use, reproduce, modify, and distribute that content.</p>

<h3>5. Prohibited Activities</h3>
<p>You agree not to:</p>
<ul>
<li>Use the Website for any illegal purpose</li>
<li>Attempt to gain unauthorized access to the Website or its systems</li>
<li>Interfere with or disrupt the Website or servers</li>
<li>Transmit any viruses, malware, or harmful code</li>
<li>Collect or harvest any information from the Website</li>
<li>Impersonate any person or entity</li>
</ul>

<h3>6. Disclaimer of Warranties</h3>
<p>This Website is provided "as is" without any representations or warranties, express or implied. We make no representations or warranties in relation to this Website or the information and materials provided on it.</p>

<h3>7. Limitation of Liability</h3>
<p>We will not be liable for any indirect, special, or consequential loss or damage arising under these Terms or in connection with our Website, whether arising in tort, contract, or otherwise.</p>

<h3>8. Indemnification</h3>
<p>You agree to indemnify and hold harmless $title and its affiliates from any claims, damages, losses, liabilities, and expenses arising out of your use of the Website or violation of these Terms.</p>

<h3>9. Governing Law</h3>
<p>These Terms shall be governed by and construed in accordance with the laws of England and Wales. Any disputes shall be subject to the exclusive jurisdiction of the courts of England and Wales.</p>

<h3>10. Changes to Terms</h3>
<p>We reserve the right to modify these Terms at any time. We will notify you of any changes by posting the new Terms on this page and updating the "Last updated" date.</p>

<h3>11. Termination</h3>
<p>We may terminate or suspend your access to the Website immediately, without prior notice or liability, for any reason, including if you breach these Terms.</p>

<h3>12. Severability</h3>
<p>If any provision of these Terms is found to be invalid or unenforceable, the remaining provisions shall continue to be valid and enforceable.</p>

<h3>13. Contact Us</h3>
<p>If you have any questions about these Terms, please contact us at:</p>
<p><strong>Email:</strong> legal@$domain<br>
<strong>Address:</strong> 123 Example Street, London, UK, SW1A 1AA</p>
HTML;
}

function get_cookie_content($config) {
    $title = $config['title'];
    
    return <<<HTML
<h2>Cookie Policy</h2>

<p><strong>Last updated:</strong> <?php echo date('F j, Y'); ?></p>

<p>This Cookie Policy explains how $title uses cookies and similar technologies on our website.</p>

<h3>1. What Are Cookies?</h3>
<p>Cookies are small text files that are placed on your device when you visit a website. They are widely used to make websites work more efficiently and provide information to website owners.</p>

<h3>2. Types of Cookies We Use</h3>

<h4>Essential Cookies</h4>
<p>These cookies are necessary for the website to function properly. They enable basic functions like page navigation and access to secure areas of the website.</p>

<h4>Analytics Cookies</h4>
<p>We use Google Analytics to collect information about how visitors use our website. These cookies help us understand which pages are most popular and how visitors move around the site.</p>

<h4>Advertising Cookies</h4>
<p>We use Google AdSense to display advertisements on our website. These cookies are used to make advertising more relevant to you and your interests.</p>

<h4>Functionality Cookies</h4>
<p>These cookies allow the website to remember choices you make (such as your language preference) and provide enhanced, more personal features.</p>

<h3>3. Third-Party Cookies</h3>
<p>We use the following third-party services that may set cookies:</p>
<ul>
<li><strong>Google Analytics:</strong> For website analytics</li>
<li><strong>Google AdSense:</strong> For displaying advertisements</li>
</ul>

<p>These third parties have their own privacy policies and cookie policies.</p>

<h3>4. How to Control Cookies</h3>
<p>You can control and/or delete cookies as you wish. You can delete all cookies that are already on your computer and you can set most browsers to prevent them from being placed.</p>

<h4>Browser Settings</h4>
<p>Most web browsers allow you to control cookies through their settings preferences. However, if you limit the ability of websites to set cookies, you may worsen your overall user experience.</p>

<h4>Opt-Out Links</h4>
<ul>
<li><strong>Google Analytics:</strong> <a href="https://tools.google.com/dlpage/gaoptout" target="_blank" rel="noopener">Google Analytics Opt-out Browser Add-on</a></li>
<li><strong>Google Ads:</strong> <a href="https://www.google.com/settings/ads" target="_blank" rel="noopener">Google Ads Settings</a></li>
</ul>

<h3>5. Cookie Consent</h3>
<p>When you first visit our website, you will be asked to consent to our use of cookies. You can withdraw your consent at any time by changing your browser settings.</p>

<h3>6. Updates to This Policy</h3>
<p>We may update this Cookie Policy from time to time. We will notify you of any changes by posting the new Cookie Policy on this page and updating the "Last updated" date.</p>

<h3>7. Contact Us</h3>
<p>If you have any questions about our use of cookies, please contact us through our <a href="/contact/">Contact page</a>.</p>
HTML;
}
?>
