<?php
/**
 * AdSense 内容生成器 - 最终版本
 * 直接在服务器上执行，生成所有必需的内容
 */

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

// 网站配置
$sites_config = [
    'alonzopichardo.com' => [
        'title' => 'NHS Complete Guide',
        'categories' => ['GP Services', 'Emergency Care', 'Prescriptions & Pharmacy', 
                        'Dental & Optical', 'Mental Health', 'Private Healthcare'],
        'articles_per_category' => 8
    ],
    'blueup.shop' => [
        'title' => 'London Rent Guide',
        'categories' => ['Area Guides', 'Renting Process', 'Costs & Budgeting',
                        'Tenant Rights', 'Student Housing', 'Tips & Advice'],
        'articles_per_category' => 8
    ],
    'dgbgtee.shop' => [
        'title' => 'UK IT Jobs Guide',
        'categories' => ['Company Guides', 'Interview Prep', 'Career Paths',
                        'Salaries & Benefits', 'Skills & Learning', 'Visa & Relocation'],
        'articles_per_category' => 8
    ]
];

// 确定当前网站
$site_config = null;
foreach ($sites_config as $domain => $config) {
    if (strpos($current_domain, $domain) !== false) {
        $site_config = $config;
        $site_config['domain'] = $domain;
        break;
    }
}

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

// 加载 WordPress
$wp_load_path = dirname(__FILE__) . '/wp-load.php';
if (!file_exists($wp_load_path)) {
    die("错误: 找不到 wp-load.php");
}
require_once($wp_load_path);

echo "<h1>AdSense 内容生成器</h1>";
echo "<h2>网站: {$site_config['title']}</h2>";
echo "<hr>";

// 生成文章内容
function generate_article_content($category, $index) {
    $title = "Complete Guide to $category: Everything You Need to Know (Part $index)";
    
    $paragraphs = [];
    for ($i = 0; $i < 10; $i++) {
        $paragraphs[] = "<p>This is paragraph " . ($i+1) . " providing detailed information about $category. " .
                       "Understanding this topic is essential for anyone looking to navigate this area effectively. " .
                       "We provide comprehensive coverage of all important aspects you need to know. " .
                       "Our expert team has researched extensively to bring you accurate and up-to-date information. " .
                       "This guide will help you make informed decisions and achieve your goals successfully.</p>";
    }
    
    $content = "
<h2>Introduction to $category</h2>
<p>Welcome to our comprehensive guide on $category. This article provides detailed information to help you understand everything you need to know about this important topic.</p>

<h2>Key Information</h2>
" . implode("\n", array_slice($paragraphs, 0, 3)) . "

<h3>Important Points to Consider</h3>
<ul>
<li>First important aspect that you should be aware of</li>
<li>Second critical point for your consideration</li>
<li>Third essential element to understand</li>
<li>Fourth vital factor in your decision-making</li>
<li>Fifth crucial consideration for success</li>
</ul>

<h2>Detailed Analysis</h2>
" . implode("\n", array_slice($paragraphs, 3, 3)) . "

<h3>Expert Recommendations</h3>
<ol>
<li>Start by thoroughly researching all available options</li>
<li>Consult with qualified professionals when needed</li>
<li>Keep detailed records of all important information</li>
<li>Stay updated with the latest developments</li>
<li>Make informed decisions based on reliable data</li>
</ol>

<h2>Practical Tips and Advice</h2>
" . implode("\n", array_slice($paragraphs, 6, 3)) . "

<h2>Frequently Asked Questions</h2>

<h3>What is the most important thing to know?</h3>
<p>The most important thing is to understand the fundamentals thoroughly before making any decisions. Take your time to research and consult with experts.</p>

<h3>How long does this typically take?</h3>
<p>The timeline varies depending on individual circumstances, but typically ranges from a few weeks to several months. Planning ahead is essential.</p>

<h3>What are the costs involved?</h3>
<p>Costs can vary significantly based on your specific situation. It's recommended to get detailed quotes from multiple sources for comparison.</p>

<h2>Conclusion</h2>
" . $paragraphs[9] . "
<p>We hope this guide has provided you with valuable insights into $category. For more information, explore our other articles and resources.</p>
";
    
    return [$title, $content];
}

// 获取所有分类
$all_categories = get_categories(['hide_empty' => false]);
$category_map = [];
foreach ($all_categories as $cat) {
    $category_map[$cat->name] = $cat->term_id;
}

echo "<h3>开始生成文章</h3>";
echo "<p>目标: " . (count($site_config['categories']) * $site_config['articles_per_category']) . " 篇文章</p>";

$total_created = 0;

foreach ($site_config['categories'] as $cat_name) {
    if (!isset($category_map[$cat_name])) {
        echo "<p>⚠️ 分类不存在: $cat_name</p>";
        continue;
    }
    
    $cat_id = $category_map[$cat_name];
    echo "<h4>分类: $cat_name</h4>";
    
    for ($i = 1; $i <= $site_config['articles_per_category']; $i++) {
        list($title, $content) = generate_article_content($cat_name, $i);
        
        $post_data = [
            'post_title' => $title,
            'post_content' => $content,
            'post_status' => 'publish',
            'post_type' => 'post',
            'post_category' => [$cat_id]
        ];
        
        $post_id = wp_insert_post($post_data);
        
        if ($post_id && !is_wp_error($post_id)) {
            $total_created++;
            echo "✅ [$total_created] " . substr($title, 0, 60) . "...<br>";
            flush();
        } else {
            echo "❌ 创建失败: $title<br>";
        }
    }
}

echo "<hr>";
echo "<h3>✅ 完成!</h3>";
echo "<p>共创建 $total_created 篇文章</p>";
echo "<p><a href='/'>返回首页</a> | <a href='/wp-admin/'>进入后台</a></p>";
?>
