403Webshell
Server IP : 202.61.199.114  /  Your IP : 216.73.217.139
Web Server : nginx/1.22.1
System : Linux de.arni-solutions.de 6.1.0-49-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.174-1 (2026-05-26) x86_64
User : web20 ( 1018)
PHP Version : 8.4.23
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : OFF  |  Sudo : ON  |  Pkexec : ON
Directory :  /proc/3951573/root/tmp/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /proc/3951573/root/tmp/seo_audit.php
<?php
/**
 * SEO Audit Script for drogentest-online.de
 * Generates comprehensive CSV report at /tmp/seo_audit_report.csv
 */

// Load WordPress
define('ABSPATH', '/var/www/clients/client2/web20/web/');
require_once ABSPATH . 'wp-load.php';

/* =========================================================================
   Configuration & Helpers
   ========================================================================= */

// German preposition overrides for country names
$prep_im    = ['Iran', 'Irak', 'Libanon', 'Jemen', 'Oman', 'Tschad', 'Kongo', 'Sudan', 'Niger', 'Senegal', 'Kosovo'];
$prep_inder = ['Schweiz', 'Türkei', 'Ukraine', 'Slowakei', 'Mongolei', 'Dominikanischen Republik'];
$prep_ander = ['Elfenbeinküste'];
$prep_inden = ['Niederlanden', 'USA', 'Philippinen', 'Vereinigten Arabischen Emiraten'];
$prep_aufden = ['Bahamas', 'Malediven'];

// Special display names for countries whose post_title differs from the prep form
$country_prep_names = [
    'Niederlande'  => 'Niederlanden',
    'Dominikanische Republik' => 'Dominikanischen Republik',
    'Vereinigte Arabische Emirate' => 'Vereinigten Arabischen Emiraten',
];

function get_country_preposition($country_name) {
    global $prep_im, $prep_inder, $prep_ander, $prep_inden, $prep_aufden, $country_prep_names;

    // Check for special name forms needed in preposition context
    $prep_name = isset($country_prep_names[$country_name]) ? $country_prep_names[$country_name] : $country_name;

    foreach ($prep_im as $c) {
        if (stripos($prep_name, $c) !== false || stripos($country_name, $c) !== false) return 'im ' . $country_name;
    }
    foreach ($prep_inder as $c) {
        if (stripos($prep_name, $c) !== false || stripos($country_name, $c) !== false) return 'in der ' . $country_name;
    }
    foreach ($prep_ander as $c) {
        if (stripos($prep_name, $c) !== false || stripos($country_name, $c) !== false) return 'an der ' . $country_name;
    }
    foreach ($prep_inden as $c) {
        if (stripos($prep_name, $c) !== false || stripos($country_name, $c) !== false) return 'in den ' . $prep_name;
    }
    foreach ($prep_aufden as $c) {
        if (stripos($prep_name, $c) !== false || stripos($country_name, $c) !== false) return 'auf den ' . $country_name;
    }
    return 'in ' . $country_name;
}

// Build country slug lookup from continent data
function get_all_country_slugs() {
    $slugs = [];
    if (function_exists('dgt_dp_continents')) {
        foreach (dgt_dp_continents() as $cont_slug => $cont) {
            foreach ($cont['countries'] as $cs) {
                $slugs[$cs] = $cont['name'];
            }
        }
    }
    return $slugs;
}

// Determine if a URL contains relevant keywords
function url_has_keywords($url) {
    $path = parse_url($url, PHP_URL_PATH);
    if (!$path) return false;
    $parts = explode('/', trim($path, '/'));
    foreach ($parts as $p) {
        if (strlen($p) > 3 && !is_numeric($p)) return true;
    }
    return false;
}

// Truncate description to target length
function truncate_desc($text, $max = 155) {
    if (mb_strlen($text) <= $max) return $text;
    $text = mb_substr($text, 0, $max);
    $last_space = mb_strrpos($text, ' ');
    if ($last_space !== false && $last_space > $max - 30) {
        $text = mb_substr($text, 0, $last_space);
    }
    return $text;
}

function clean_csv_field($text) {
    $text = str_replace(["\r\n", "\r", "\n"], ' ', $text);
    $text = preg_replace('/\s+/', ' ', $text);
    return trim($text);
}

function calculate_seo_score($meta_title, $meta_desc, $meta_kw, $word_count, $url, $is_content_page = true) {
    $score = 0;
    $title_len = mb_strlen($meta_title);
    $desc_len = mb_strlen($meta_desc);

    // +25 if has meta title within 30-60 chars
    if ($title_len >= 30 && $title_len <= 60) {
        $score += 25;
    } elseif ($title_len > 0 && $title_len < 30) {
        $score += 10;
    } elseif ($title_len > 60) {
        $score += 15;
    }

    // +25 if has meta description within 80-160 chars
    if ($desc_len >= 80 && $desc_len <= 160) {
        $score += 25;
    } elseif ($desc_len > 0 && $desc_len < 80) {
        $score += 10;
    } elseif ($desc_len > 160) {
        $score += 10;
    }

    // +15 if has meta keywords
    if (!empty($meta_kw)) {
        $score += 15;
    }

    // +10 if has good word count (>300 for content pages)
    if ($is_content_page) {
        if ($word_count > 300) {
            $score += 10;
        } elseif ($word_count > 100) {
            $score += 5;
        }
    } else {
        $score += 5;
    }

    // +10 if URL is keyword-rich
    if (url_has_keywords($url)) {
        $score += 10;
    }

    // +15 if title contains main keyword
    if (!empty($meta_title)) {
        $path = parse_url($url, PHP_URL_PATH);
        if ($path) {
            $slug = trim(basename(rtrim($path, '/')), '/');
            $slug_words = explode('-', $slug);
            $title_lower = mb_strtolower($meta_title);
            $match = false;
            foreach ($slug_words as $sw) {
                if (mb_strlen($sw) > 3 && mb_strpos($title_lower, mb_strtolower($sw)) !== false) {
                    $match = true;
                    break;
                }
            }
            if ($match) $score += 15;
        }
    }

    return min($score, 100);
}

function determine_status($meta_title, $meta_desc, $title_len, $desc_len, $meta_kw) {
    if (empty($meta_title) && empty($meta_desc)) {
        return 'Kritischer Fehler';
    }
    if ($title_len > 60 || $desc_len > 160 || ($desc_len > 0 && $desc_len < 80) || empty($meta_kw) || empty($meta_title) || empty($meta_desc)) {
        return 'Optimierung empfohlen';
    }
    return 'OK';
}

function determine_action($current_title, $new_title, $current_desc, $new_desc, $current_kw, $new_kw) {
    $needs_title = (!empty($new_title) && $new_title !== $current_title);
    $needs_desc  = (!empty($new_desc) && $new_desc !== $current_desc);
    $needs_kw    = (!empty($new_kw) && $new_kw !== $current_kw);

    if ($needs_title && $needs_desc && $needs_kw) return 'alles setzen';
    if ($needs_title && $needs_desc) return 'beides ersetzen';
    if ($needs_title && $needs_kw) return 'alles setzen';
    if ($needs_desc && $needs_kw) return 'alles setzen';
    if ($needs_title) return 'Title ersetzen';
    if ($needs_desc) return 'Description ersetzen';
    if ($needs_kw) return 'alles setzen';
    return 'unverändert lassen';
}

/* =========================================================================
   Meta data generators
   ========================================================================= */

function generate_country_title($post_title) {
    $prep = get_country_preposition($post_title);
    $title = "Drogenpolitik {$prep}: Gesetze, Strafen & Reisehinweise 2026";
    if (mb_strlen($title) > 60) {
        $title = "Drogenpolitik {$prep}: Gesetze & Strafen 2026";
    }
    if (mb_strlen($title) > 60) {
        $title = "Drogenpolitik {$prep} – Überblick 2026";
    }
    if (mb_strlen($title) > 60) {
        $title = "Drogenpolitik {$prep} 2026";
    }
    return $title;
}

function generate_us_state_title($state_name) {
    $title = "Drogenpolitik in {$state_name} (USA): Cannabis & Drogengesetze 2026";
    if (mb_strlen($title) > 60) {
        $title = "Drogenpolitik in {$state_name} (USA) 2026";
    }
    if (mb_strlen($title) > 60) {
        $title = "Drogenpolitik {$state_name} (USA)";
    }
    return $title;
}

function generate_country_desc($post_title) {
    $prep = get_country_preposition($post_title);
    $desc = "Aktuelle Drogengesetze und Strafen {$prep}: Cannabis, Kokain & mehr. Reisehinweise, Risiken und Entwicklungen 2026.";
    if (mb_strlen($desc) < 80) {
        $desc = "Drogengesetze {$prep}: Alles zu Cannabis, Strafen, Reisehinweisen und aktuellen Entwicklungen in der Drogenpolitik 2026.";
    }
    return truncate_desc($desc);
}

function generate_us_state_desc($state_name) {
    $desc = "Drogenpolitik in {$state_name}: Cannabis-Gesetze, Drogenstrafen und aktuelle Entwicklungen im US-Bundesstaat. Überblick 2026.";
    if (mb_strlen($desc) < 80) {
        $desc = "Alle Drogengesetze in {$state_name}, USA: Cannabis-Status, Strafen für Besitz und Handel sowie aktuelle Reformen im Überblick.";
    }
    return truncate_desc($desc);
}

function generate_country_keywords($post_title) {
    return "Drogenpolitik {$post_title}, Drogengesetze {$post_title}, Cannabis {$post_title}, Strafen Drogen {$post_title}";
}

function generate_product_title($product_name) {
    $name = preg_replace('/^DROGENTEST\s+/i', '', $product_name);
    $name = preg_replace('/\s+\d+\s+St\.\s*$/', '', $name);
    $title = "{$name} kaufen | Drogentest-Online.de";
    if (mb_strlen($title) > 60) {
        $title = "{$name} | Drogentest-Online.de";
    }
    if (mb_strlen($title) > 60) {
        $title = mb_substr($name, 0, 57) . '...';
    }
    return $title;
}

function generate_product_desc($product_name, $post_id) {
    $name = preg_replace('/^DROGENTEST\s+/i', '', $product_name);
    $name = preg_replace('/\s+\d+\s+St\.\s*$/', '', $name);
    $substances = wp_get_post_terms($post_id, 'dgt_substanz', ['fields' => 'names']);
    $sub_str = !empty($substances) ? implode(', ', array_slice($substances, 0, 3)) : '';
    $desc = "$name: Schnelltest";
    if ($sub_str) $desc .= " für $sub_str";
    $desc .= ". Sofortergebnis in Minuten – günstig bestellen bei Drogentest-Online.de.";
    return truncate_desc($desc);
}

function generate_product_keywords($product_name, $post_id) {
    $substances = wp_get_post_terms($post_id, 'dgt_substanz', ['fields' => 'names']);
    $test_type = wp_get_post_terms($post_id, 'dgt_testart', ['fields' => 'names']);
    $kw = ['drogentest kaufen'];
    if (!empty($test_type)) $kw[] = strtolower($test_type[0]);
    foreach ($substances as $s) {
        $kw[] = strtolower($s) . ' test';
    }
    $kw[] = 'schnelltest';
    return implode(', ', array_unique(array_slice($kw, 0, 8)));
}

function generate_blog_title($wp_title) {
    $title = $wp_title;
    if (mb_strpos($title, '|') === false && mb_strlen($title) < 40) {
        $title .= ' | Drogentest-Online.de';
    }
    if (mb_strlen($title) > 60) {
        $title = mb_substr($wp_title, 0, 57) . '...';
    }
    return $title;
}

function generate_blog_desc($wp_title, $content) {
    $plain = wp_strip_all_tags($content);
    $plain = preg_replace('/\s+/', ' ', $plain);
    $plain = trim($plain);
    if (mb_strlen($plain) > 80) {
        $desc = truncate_desc($plain, 155);
    } else {
        $desc = "{$wp_title} – alle wichtigen Informationen, Tipps und Hintergründe auf Drogentest-Online.de.";
        $desc = truncate_desc($desc, 155);
    }
    if (mb_strlen($desc) < 80) {
        $desc = "{$wp_title} – umfassender Ratgeber mit allen Informationen, Tipps und Hintergründen auf Drogentest-Online.de.";
        $desc = truncate_desc($desc, 155);
    }
    return $desc;
}

function generate_blog_keywords($wp_title, $post_id) {
    $tags = wp_get_post_tags($post_id, ['fields' => 'names']);
    if (!empty($tags)) {
        return implode(', ', array_map('strtolower', array_slice($tags, 0, 8)));
    }
    $words = explode(' ', mb_strtolower($wp_title));
    $stop = ['der','die','das','und','in','von','für','mit','auf','ein','eine','wie','als','zu','am','im','um','ist','es','den','dem','des','oder','nicht','sich','auch','an','bei','nach','über','so','was','aus','kann','wenn','nur','man','&'];
    $kw = [];
    foreach ($words as $w) {
        $w = preg_replace('/[^a-zäöüß-]/u', '', $w);
        if (mb_strlen($w) > 3 && !in_array($w, $stop)) $kw[] = $w;
    }
    return implode(', ', array_unique(array_slice($kw, 0, 8)));
}

/* =========================================================================
   Main Processing
   ========================================================================= */

$rows = [];
$country_slugs = get_all_country_slugs();
$stats = ['total' => 0, 'ok' => 0, 'optimierung' => 0, 'kritisch' => 0];

// --- 1. Process ALL published posts ---

$post_types = ['page', 'post', 'dgt_product', 'drogenpolitik'];

foreach ($post_types as $ptype) {
    $all_posts = get_posts([
        'post_type'   => $ptype,
        'post_status' => 'publish',
        'numberposts' => -1,
        'orderby'     => 'title',
        'order'       => 'ASC',
    ]);

    foreach ($all_posts as $p) {
        $url = get_permalink($p->ID);
        $current_title = get_post_meta($p->ID, '_dgt_meta_title', true) ?: '';
        $current_desc  = get_post_meta($p->ID, '_dgt_meta_description', true) ?: '';
        $current_kw    = get_post_meta($p->ID, '_dgt_meta_keywords', true) ?: '';
        $wp_title      = $p->post_title;
        $word_count    = str_word_count(wp_strip_all_tags($p->post_content));
        $title_len     = mb_strlen($current_title);
        $desc_len      = mb_strlen($current_desc);

        $new_title = '';
        $new_desc  = '';
        $new_kw    = '';
        $type_label = '';

        switch ($ptype) {
            case 'drogenpolitik':
                if ($p->post_parent == 0) {
                    $type_label = 'Drogenpolitik Land';

                    if (empty($current_title) || $title_len > 60) {
                        $new_title = generate_country_title($wp_title);
                    }
                    if (empty($current_desc) || $desc_len > 160 || ($desc_len > 0 && $desc_len < 80)) {
                        $new_desc = generate_country_desc($wp_title);
                    }
                    if (empty($current_kw)) {
                        $new_kw = generate_country_keywords($wp_title);
                    }
                } else {
                    $parent = get_post($p->post_parent);
                    $parent_title = $parent ? $parent->post_title : '';
                    $parent_slug = $parent ? $parent->post_name : '';

                    if ($parent_slug === 'usa') {
                        $type_label = 'Drogenpolitik US-Staat';
                        if (empty($current_title) || $title_len > 60) {
                            $new_title = generate_us_state_title($wp_title);
                        }
                        if (empty($current_desc) || $desc_len > 160 || ($desc_len > 0 && $desc_len < 80)) {
                            $new_desc = generate_us_state_desc($wp_title);
                        }
                        if (empty($current_kw)) {
                            $new_kw = "drogenpolitik {$wp_title}, cannabis {$wp_title}, drogengesetze {$wp_title} USA";
                        }
                    } else {
                        $type_label = 'Drogenpolitik Unterseite';
                        if (empty($current_title) || $title_len > 60) {
                            $new_title = "{$wp_title} | Drogenpolitik | Drogentest-Online.de";
                            if (mb_strlen($new_title) > 60) {
                                $new_title = "{$wp_title} | Drogentest-Online.de";
                            }
                            if (mb_strlen($new_title) > 60) {
                                $new_title = mb_substr($wp_title, 0, 57) . '...';
                            }
                        }
                        if (empty($current_desc) || $desc_len > 160 || ($desc_len > 0 && $desc_len < 80)) {
                            $new_desc = "{$wp_title} – Informationen, Gesetze und aktuelle Entwicklungen. Alles Wichtige auf Drogentest-Online.de.";
                            $new_desc = truncate_desc($new_desc);
                            if (mb_strlen($new_desc) < 80) {
                                $new_desc = "{$wp_title} – umfassende Informationen zu Drogengesetzen, Strafen und aktuellen Entwicklungen auf Drogentest-Online.de.";
                                $new_desc = truncate_desc($new_desc);
                            }
                        }
                        if (empty($current_kw)) {
                            $new_kw = mb_strtolower($wp_title) . ', drogenpolitik ' . mb_strtolower($parent_title);
                        }
                    }
                }
                break;

            case 'dgt_product':
                $type_label = 'Produkt';
                if (empty($current_title) || $title_len > 60) {
                    $new_title = generate_product_title($wp_title);
                }
                if (empty($current_desc) || $desc_len > 160 || ($desc_len > 0 && $desc_len < 80)) {
                    $new_desc = generate_product_desc($wp_title, $p->ID);
                }
                if (empty($current_kw)) {
                    $new_kw = generate_product_keywords($wp_title, $p->ID);
                }
                break;

            case 'post':
                $type_label = 'Blogbeitrag';
                if (empty($current_title) || $title_len > 60) {
                    $new_title = generate_blog_title($wp_title);
                }
                if (empty($current_desc) || $desc_len > 160 || ($desc_len > 0 && $desc_len < 80)) {
                    $new_desc = generate_blog_desc($wp_title, $p->post_content);
                }
                if (empty($current_kw)) {
                    $new_kw = generate_blog_keywords($wp_title, $p->ID);
                }
                break;

            case 'page':
                $type_label = 'Seite';
                if (empty($current_title) || $title_len > 60) {
                    $new_title = "{$wp_title} | Drogentest-Online.de";
                    if (mb_strlen($new_title) > 60) {
                        $new_title = mb_substr($wp_title, 0, 57) . '...';
                    }
                }
                if (empty($current_desc) || $desc_len > 160 || ($desc_len > 0 && $desc_len < 80)) {
                    if (!empty($p->post_content)) {
                        $new_desc = generate_blog_desc($wp_title, $p->post_content);
                    } else {
                        $new_desc = "{$wp_title} – alle Informationen auf Drogentest-Online.de. Drogentests, Substanzen und Ratgeber.";
                        $new_desc = truncate_desc($new_desc);
                        if (mb_strlen($new_desc) < 80) {
                            $new_desc = "{$wp_title} – umfassende Informationen zu Drogentests, Substanzen, Safer Use und Ratgeber auf Drogentest-Online.de.";
                            $new_desc = truncate_desc($new_desc);
                        }
                    }
                }
                if (empty($current_kw)) {
                    $kw_parts = array_filter(explode(' ', mb_strtolower($wp_title)), function($w) {
                        $stop = ['der','die','das','und','in','von','für','mit','auf','ein','eine','wie','als','zu','am','im','um','&'];
                        return mb_strlen($w) > 3 && !in_array($w, $stop);
                    });
                    $new_kw = implode(', ', array_slice(array_values($kw_parts), 0, 5));
                    if (empty($new_kw)) $new_kw = 'drogentest, information';
                }
                break;
        }

        // Determine status based on CURRENT data
        $status = determine_status($current_title, $current_desc, $title_len, $desc_len, $current_kw);

        // SEO Score based on current state
        $seo_score = calculate_seo_score($current_title, $current_desc, $current_kw, $word_count, $url, true);

        // Action
        $action = determine_action($current_title, $new_title, $current_desc, $new_desc, $current_kw, $new_kw);

        $rows[] = [
            'url'       => $url,
            'type'      => $type_label,
            'status'    => $status,
            'cur_title' => clean_csv_field($current_title),
            'title_len' => $title_len,
            'new_title' => clean_csv_field($new_title),
            'cur_desc'  => clean_csv_field($current_desc),
            'desc_len'  => $desc_len,
            'new_desc'  => clean_csv_field($new_desc),
            'cur_kw'    => clean_csv_field($current_kw),
            'new_kw'    => clean_csv_field($new_kw),
            'action'    => $action,
            'seo_score' => $seo_score,
        ];

        $stats['total']++;
        if ($status === 'OK') $stats['ok']++;
        elseif ($status === 'Optimierung empfohlen') $stats['optimierung']++;
        else $stats['kritisch']++;
    }
}

// --- 2. Process ALL taxonomy terms ---

$taxonomies = ['category', 'post_tag', 'dgt_substanz', 'dgt_testart', 'dgt_ngwert'];
$tax_labels = [
    'category'     => 'Kategorie',
    'post_tag'     => 'Schlagwort',
    'dgt_substanz' => 'Substanz',
    'dgt_testart'  => 'Testart',
    'dgt_ngwert'   => 'Nachweisgrenze',
];

foreach ($taxonomies as $tax) {
    $terms = get_terms(['taxonomy' => $tax, 'hide_empty' => false]);
    if (is_wp_error($terms)) continue;

    foreach ($terms as $term) {
        $link = get_term_link($term);
        if (is_wp_error($link)) continue;

        $url = $link;
        $current_title = get_term_meta($term->term_id, '_dgt_meta_title', true) ?: '';
        $current_desc  = get_term_meta($term->term_id, '_dgt_meta_description', true) ?: '';
        $current_kw    = get_term_meta($term->term_id, '_dgt_meta_keywords', true) ?: '';
        $title_len     = mb_strlen($current_title);
        $desc_len      = mb_strlen($current_desc);
        $type_label    = $tax_labels[$tax] ?? $tax;

        $new_title = '';
        $new_desc  = '';
        $new_kw    = '';

        switch ($tax) {
            case 'post_tag':
                if (empty($current_title) || $title_len > 60) {
                    $new_title = "Beiträge zum Thema {$term->name} | Drogentest-Online.de";
                    if (mb_strlen($new_title) > 60) {
                        $new_title = "Thema {$term->name} | Drogentest-Online.de";
                    }
                    if (mb_strlen($new_title) > 60) {
                        $new_title = mb_substr($term->name, 0, 30) . ' | Drogentest-Online.de';
                    }
                }
                if (empty($current_desc) || $desc_len > 160 || ($desc_len > 0 && $desc_len < 80)) {
                    $new_desc = "Alle Beiträge zum Thema {$term->name}: Ratgeber, Hintergründe und aktuelle Informationen auf Drogentest-Online.de.";
                    $new_desc = truncate_desc($new_desc);
                    if (mb_strlen($new_desc) < 80) {
                        $new_desc = "Alle Beiträge zum Thema {$term->name} auf Drogentest-Online.de – Drogentests, Substanzen, Safer Use und mehr verständlich erklärt.";
                        $new_desc = truncate_desc($new_desc);
                    }
                }
                if (empty($current_kw)) {
                    $new_kw = mb_strtolower($term->name) . ', drogentest, ratgeber';
                }
                break;

            case 'dgt_substanz':
                if (empty($current_title) || $title_len > 60) {
                    $new_title = "{$term->name} nachweisen: Drogentests & Cutoffs";
                    if (mb_strlen($new_title) > 60) {
                        $new_title = "{$term->name}: Drogentests & Cutoffs";
                    }
                }
                if (empty($current_desc) || $desc_len > 160 || ($desc_len > 0 && $desc_len < 80)) {
                    $new_desc = "{$term->name} im Drogentest nachweisen: Schnelltests, Nachweiszeiten und Cutoff-Werte. Passende Urintests bei Drogentest-Online.de.";
                    $new_desc = truncate_desc($new_desc);
                    if (mb_strlen($new_desc) < 80) {
                        $new_desc = "{$term->name} im Drogentest: Schnelltests, Nachweiszeiten, Cutoff-Werte und passende Urintests im Überblick auf Drogentest-Online.de.";
                        $new_desc = truncate_desc($new_desc);
                    }
                }
                if (empty($current_kw)) {
                    $name_lower = mb_strtolower($term->name);
                    $new_kw = "{$name_lower} test, {$name_lower} nachweisen, drogentest {$name_lower}, {$name_lower} urintest";
                }
                break;

            case 'dgt_testart':
                if (empty($current_title) || $title_len > 60) {
                    $new_title = "{$term->name} – Drogentests | Drogentest-Online.de";
                    if (mb_strlen($new_title) > 60) {
                        $new_title = "{$term->name} | Drogentest-Online.de";
                    }
                }
                if (empty($current_desc) || $desc_len > 160 || ($desc_len > 0 && $desc_len < 80)) {
                    $new_desc = "Alle Drogentests der Kategorie {$term->name}: Schnelltests für verschiedene Substanzen. Einfache Anwendung und zuverlässige Ergebnisse.";
                    $new_desc = truncate_desc($new_desc);
                }
                if (empty($current_kw)) {
                    $new_kw = mb_strtolower($term->name) . ', drogentest, schnelltest, substanztest';
                }
                break;

            case 'dgt_ngwert':
                if (empty($current_title) || $title_len > 60) {
                    $new_title = "Drogentests mit {$term->name} Cutoff | Drogentest-Online.de";
                    if (mb_strlen($new_title) > 60) {
                        $new_title = "{$term->name} Cutoff-Drogentests";
                    }
                }
                if (empty($current_desc) || $desc_len > 160 || ($desc_len > 0 && $desc_len < 80)) {
                    $new_desc = "Drogentests mit Nachweisgrenze von {$term->name}: Alle verfügbaren Schnelltests mit diesem Cutoff-Wert im Überblick.";
                    $new_desc = truncate_desc($new_desc);
                    if (mb_strlen($new_desc) < 80) {
                        $new_desc = "Alle Drogentests mit Nachweisgrenze {$term->name} im Überblick. Schnelltests, Cutoff-Werte und Produktvergleich auf Drogentest-Online.de.";
                        $new_desc = truncate_desc($new_desc);
                    }
                }
                if (empty($current_kw)) {
                    $new_kw = "{$term->name}, nachweisgrenze, cutoff, drogentest, schnelltest";
                }
                break;

            case 'category':
                if (empty($current_title) || $title_len > 60) {
                    $new_title = "{$term->name} – Beiträge | Drogentest-Online.de";
                    if (mb_strlen($new_title) > 60) {
                        $new_title = "{$term->name} | Drogentest-Online.de";
                    }
                }
                if (empty($current_desc) || $desc_len > 160 || ($desc_len > 0 && $desc_len < 80)) {
                    $new_desc = "Beiträge in der Kategorie {$term->name}: Ratgeber, Informationen und Tipps rund um Drogentests und Substanzen auf Drogentest-Online.de.";
                    $new_desc = truncate_desc($new_desc);
                    if (mb_strlen($new_desc) < 80) {
                        $new_desc = "Alle Beiträge in der Kategorie {$term->name} auf Drogentest-Online.de – Ratgeber, Hintergründe und Tipps rund um Drogentests.";
                        $new_desc = truncate_desc($new_desc);
                    }
                }
                if (empty($current_kw)) {
                    $new_kw = mb_strtolower($term->name) . ', drogentest, ratgeber';
                }
                break;
        }

        $status = determine_status($current_title, $current_desc, $title_len, $desc_len, $current_kw);
        $seo_score = calculate_seo_score($current_title, $current_desc, $current_kw, 0, $url, false);
        $action = determine_action($current_title, $new_title, $current_desc, $new_desc, $current_kw, $new_kw);

        $rows[] = [
            'url'       => $url,
            'type'      => $type_label,
            'status'    => $status,
            'cur_title' => clean_csv_field($current_title),
            'title_len' => $title_len,
            'new_title' => clean_csv_field($new_title),
            'cur_desc'  => clean_csv_field($current_desc),
            'desc_len'  => $desc_len,
            'new_desc'  => clean_csv_field($new_desc),
            'cur_kw'    => clean_csv_field($current_kw),
            'new_kw'    => clean_csv_field($new_kw),
            'action'    => $action,
            'seo_score' => $seo_score,
        ];

        $stats['total']++;
        if ($status === 'OK') $stats['ok']++;
        elseif ($status === 'Optimierung empfohlen') $stats['optimierung']++;
        else $stats['kritisch']++;
    }
}

/* =========================================================================
   Write CSV with BOM, semicolon delimiter
   ========================================================================= */

$csv_path = '/tmp/seo_audit_report.csv';
$fp = fopen($csv_path, 'w');

// BOM for Excel UTF-8
fwrite($fp, "\xEF\xBB\xBF");

// Header
$header = ['URL', 'Type', 'Status', 'Current_Title', 'Title_Length', 'New_Title', 'Current_Description', 'Desc_Length', 'New_Description', 'Current_Keywords', 'New_Keywords', 'Action', 'SEO_Score'];

// Write header manually with semicolons
fwrite($fp, implode(';', array_map(function($h) { return '"' . str_replace('"', '""', $h) . '"'; }, $header)) . "\n");

// Data rows
foreach ($rows as $row) {
    $line = [
        $row['url'],
        $row['type'],
        $row['status'],
        $row['cur_title'],
        (string)$row['title_len'],
        $row['new_title'],
        $row['cur_desc'],
        (string)$row['desc_len'],
        $row['new_desc'],
        $row['cur_kw'],
        $row['new_kw'],
        $row['action'],
        (string)$row['seo_score'],
    ];
    fwrite($fp, implode(';', array_map(function($f) {
        return '"' . str_replace('"', '""', $f) . '"';
    }, $line)) . "\n");
}

fclose($fp);

/* =========================================================================
   Summary
   ========================================================================= */

echo "=== SEO AUDIT REPORT SUMMARY ===" . PHP_EOL;
echo "=================================" . PHP_EOL;
echo PHP_EOL;
echo "Gesamtanzahl Seiten:           " . $stats['total'] . PHP_EOL;
echo "Status OK:                     " . $stats['ok'] . PHP_EOL;
echo "Optimierung empfohlen:         " . $stats['optimierung'] . PHP_EOL;
echo "Kritische Fehler:              " . $stats['kritisch'] . PHP_EOL;
echo PHP_EOL;

// Breakdown by type
$by_type = [];
foreach ($rows as $r) {
    $t = $r['type'];
    if (!isset($by_type[$t])) $by_type[$t] = ['total' => 0, 'ok' => 0, 'opt' => 0, 'krit' => 0];
    $by_type[$t]['total']++;
    if ($r['status'] === 'OK') $by_type[$t]['ok']++;
    elseif ($r['status'] === 'Optimierung empfohlen') $by_type[$t]['opt']++;
    else $by_type[$t]['krit']++;
}

echo "--- Aufschlüsselung nach Typ ---" . PHP_EOL;
foreach ($by_type as $type => $data) {
    echo sprintf("  %-30s Gesamt: %3d | OK: %3d | Optimierung: %3d | Kritisch: %3d",
        $type, $data['total'], $data['ok'], $data['opt'], $data['krit']) . PHP_EOL;
}

echo PHP_EOL;

// Action breakdown
$by_action = [];
foreach ($rows as $r) {
    $a = $r['action'];
    if (!isset($by_action[$a])) $by_action[$a] = 0;
    $by_action[$a]++;
}
echo "--- Empfohlene Aktionen ---" . PHP_EOL;
foreach ($by_action as $action => $count) {
    echo sprintf("  %-30s %d", $action, $count) . PHP_EOL;
}

echo PHP_EOL;

// Average SEO score
$total_score = array_sum(array_column($rows, 'seo_score'));
$avg_score = $stats['total'] > 0 ? round($total_score / $stats['total'], 1) : 0;
echo "Durchschnittlicher SEO-Score:  {$avg_score}/100" . PHP_EOL;

// Score distribution
$score_ranges = ['0-24' => 0, '25-49' => 0, '50-74' => 0, '75-100' => 0];
foreach ($rows as $r) {
    $s = $r['seo_score'];
    if ($s < 25) $score_ranges['0-24']++;
    elseif ($s < 50) $score_ranges['25-49']++;
    elseif ($s < 75) $score_ranges['50-74']++;
    else $score_ranges['75-100']++;
}
echo PHP_EOL . "--- SEO-Score Verteilung ---" . PHP_EOL;
foreach ($score_ranges as $range => $count) {
    echo sprintf("  Score %7s: %3d Seiten", $range, $count) . PHP_EOL;
}

echo PHP_EOL;
echo "CSV-Datei gespeichert unter:   {$csv_path}" . PHP_EOL;
echo "Dateigröße:                    " . number_format(filesize($csv_path)) . " Bytes" . PHP_EOL;
echo "Zeilen (inkl. Header):         " . ($stats['total'] + 1) . PHP_EOL;

Youez - 2016 - github.com/yon3zu
LinuXploit