<?php
/**
 * 自动导入文章 - 直接执行版本
 * 访问此文件即可自动导入所有文章
 */

// 安全检查
$secret_key = isset($_GET['key']) ? $_GET['key'] : '';
if ($secret_key !== 'import2024') {
    die('Access denied. Add ?key=import2024 to URL');
}

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

// 配置
$config = [
    'alonzopichardo.com' => [
        'db_host' => 'localhost',
        'db_user' => 'kimiclaw_alonzo',
        'db_pass' => 'AlonzoWP2024',
        'db_name' => 'kimiclaw_alonzo',
        'categories' => [
            'GP Services' => 2,
            'Emergency Care' => 3,
            'Prescriptions & Pharmacy' => 4,
            'Dental & Optical' => 5,
            'Mental Health' => 6,
            'Private Healthcare' => 7
        ]
    ],
    'blueup.shop' => [
        'db_host' => 'localhost',
        'db_user' => 'kimiclaw_blueup',
        'db_pass' => 'BlueupWP2024',
        'db_name' => 'kimiclaw_blueup',
        'categories' => [
            'Area Guides' => 2,
            'Renting Process' => 3,
            'Costs & Budgeting' => 4,
            'Tenant Rights' => 5,
            'Student Housing' => 6,
            'Tips & Advice' => 7
        ]
    ],
    'dgbgtee.shop' => [
        'db_host' => 'localhost',
        'db_user' => 'kimiclaw_dgbgtee',
        'db_pass' => 'DgbgteeWP2024',
        'db_name' => 'kimiclaw_dgbgtee',
        'categories' => [
            'Company Guides' => 2,
            'Interview Prep' => 3,
            'Career Paths' => 4,
            'Salaries & Benefits' => 5,
            'Skills & Learning' => 6,
            'Visa & Relocation' => 7
        ]
    ]
];

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

if (!$site_config) {
    die("Error: Cannot identify domain ($current_domain)");
}

// 生成文章内容函数
function generate_content($category, $index) {
    $title = "Complete Guide to $category: Everything You Need to Know (Part $index)";
    
    $content = "<h2>Introduction to $category</h2>
<p>Welcome to our comprehensive guide on $category. This detailed article provides essential information to help you understand everything you need to know.</p>

<h2>Key Information</h2>
<p>Understanding $category is crucial for success. Our expert team has researched extensively to bring you accurate information.</p>

<h3>Important Points</h3>
<ul>
<li>First essential concept about $category</li>
<li>Second important element to understand</li>
<li>Third critical factor for success</li>
<li>Fourth vital component</li>
<li>Fifth key consideration</li>
</ul>

<h2>Detailed Analysis</h2>
<p>This section provides detailed information. Understanding these elements is essential for achieving success in this area.</p>

<h2>Practical Recommendations</h2>
<ol>
<li>Start with thorough research</li>
<li>Consult with qualified professionals</li>
<li>Keep detailed records</li>
<li>Stay informed about changes</li>
<li>Plan for the long term</li>
</ol>

<h2>FAQ</h2>
<h3>What is most important?</h3>
<p>Understanding the fundamentals thoroughly before making decisions.</p>

<h3>How long does it take?</h3>
<p>Timeline varies but typically ranges from weeks to months.</p>

<h2>Conclusion</h2>
<p>Understanding $category is essential for success. Follow this guidance to achieve your goals.</p>" . str_repeat("<p>Additional detailed information about $category to ensure sufficient content length. This paragraph provides more context and valuable insights.</p>", 10);
    
    return [$title, $content];
}

// 连接数据库
$conn = new mysqli(
    $site_config['db_host'],
    $site_config['db_user'],
    $site_config['db_pass'],
    $site_config['db_name']
);

if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

$conn->set_charset('utf8mb4');

echo "<h1>Auto Import Articles</h1>";
echo "<h2>Site: {$site_config['domain']}</h2>";
echo "<hr>";

$total_created = 0;
$base_date = strtotime('-60 days');

foreach ($site_config['categories'] as $cat_name => $cat_id) {
    echo "<h3>Category: $cat_name</h3>";
    
    for ($i = 1; $i <= 8; $i++) {
        list($title, $content) = generate_content($cat_name, $i);
        
        $days_offset = rand(0, 60);
        $hours_offset = rand(0, 23);
        $post_date = date('Y-m-d H:i:s', $base_date + ($days_offset * 86400) + ($hours_offset * 3600));
        
        $title_esc = $conn->real_escape_string($title);
        $content_esc = $conn->real_escape_string($content);
        $post_name = strtolower(str_replace(' ', '-', substr($title, 0, 200)));
        $post_name = preg_replace('/[^a-z0-9-]/', '', $post_name);
        
        $sql = "INSERT INTO wp_posts 
                (post_author, post_date, post_date_gmt, post_content, post_title, 
                 post_excerpt, post_status, comment_status, ping_status, post_name, 
                 post_modified, post_modified_gmt, post_type)
                VALUES 
                (1, '$post_date', '$post_date', '$content_esc', '$title_esc', 
                 '', 'publish', 'open', 'open', '$post_name', '$post_date', '$post_date', 'post')";
        
        if ($conn->query($sql)) {
            $post_id = $conn->insert_id;
            $conn->query("INSERT INTO wp_term_relationships (object_id, term_taxonomy_id) VALUES ($post_id, $cat_id)");
            $conn->query("UPDATE wp_term_taxonomy SET count = count + 1 WHERE term_taxonomy_id = $cat_id");
            
            $total_created++;
            echo "✅ [$total_created] " . substr($title, 0, 60) . "...<br>";
            flush();
        }
    }
}

$conn->close();

echo "<hr><h3>✅ Complete!</h3>";
echo "<p>Created $total_created articles</p>";
echo "<p><a href='/'>View Site</a> | <a href='/wp-admin/'>Admin</a></p>";
?>
