| 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/3951574/root/tmp/ |
Upload File : |
<?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;