'Keine Berechtigung.' ) ); } $post_id = intval( $_POST['post_id'] ?? 0 ); $post = get_post( $post_id ); if ( ! $post ) { wp_send_json_error( array( 'msg' => 'Beitrag nicht gefunden.' ) ); } $variants = $this->build_meta_variants( $post ); if ( empty( $variants ) ) { wp_send_json_error( array( 'msg' => 'Nicht genug Inhalt.' ) ); } $existing = get_post_meta( $post_id, '_yoast_wpseo_metadesc', true ); if ( empty( $existing ) ) { $existing = get_post_meta( $post_id, 'rank_math_description', true ); } if ( empty( $existing ) ) { $existing = get_post_meta( $post_id, '_aioseo_description', true ); } $seo = $this->get_active_seo_plugin(); $target = $seo === 'rankmath' ? 'rankmath' : ( $seo === 'aioseo' ? 'aioseo' : ( $seo === 'yoast' ? 'yoast' : 'none' ) ); wp_send_json_success( array( 'variants' => $variants, 'existing_meta' => $existing ?: '', 'target' => $target, 'post_id' => $post_id ) ); } public function aije_save_meta_handler() { if ( ! current_user_can( 'edit_posts' ) ) { wp_send_json_error( array( 'msg' => 'Keine Berechtigung.' ) ); } $post_id = intval( $_POST['post_id'] ?? 0 ); $meta = sanitize_text_field( wp_unslash( $_POST['meta_text'] ?? '' ) ); $target = sanitize_key( $_POST['target'] ?? 'none' ); if ( ! $post_id || empty( $meta ) ) { wp_send_json_error( array( 'msg' => 'Ungültige Parameter.' ) ); } switch ( $target ) { case 'rankmath': update_post_meta( $post_id, 'rank_math_description', $meta ); break; case 'aioseo': update_post_meta( $post_id, '_aioseo_description', $meta ); break; case 'none': update_post_meta( $post_id, '_aije_metadesc', $meta ); break; default: update_post_meta( $post_id, '_yoast_wpseo_metadesc', $meta ); break; } update_post_meta( $post_id, '_aije_metadesc', $meta ); clean_post_cache( $post_id ); wp_send_json_success( array( 'msg' => 'Gespeichert.', 'chars' => mb_strlen( $meta ), 'meta' => $meta ) ); } private function build_meta_variants( $post ) { $title = wp_strip_all_tags( get_the_title( $post ) ); $content = apply_filters( 'the_content', $post->post_content ); $content = preg_replace( '/]*>\s*(SEO\s*·|Lesedauer|Reading time)[^<]*<\/p>/iu', '', $content ); $content = wp_strip_all_tags( $content ); $content = preg_replace( '/\s+/', ' ', trim( $content ) ); if ( mb_strlen( $content ) < 100 ) { return array(); } preg_match_all( '/(\d+)\s*(%|Tipps?|Schritte?|Methoden?|Wege?)?/u', $content, $nums ); $number = ! empty( $nums[1] ) ? $nums[1][0] : ''; $main_kw = $this->meta_extract_short_keyword( trim( preg_replace( '/\s+/', ' ', wp_strip_all_tags( get_the_title( $post ) ) ) ) ?: $title ); $variants = array(); $v1 = $this->meta_variant_keyword( $main_kw ); if ( $v1 ) { $variants[] = array( 'strategy' => 'Keyword-Fokus', 'text' => $v1, 'chars' => mb_strlen( $v1 ), 'score' => $this->meta_quality_score( $v1, $title ) ); } $v2 = $this->meta_variant_benefit( $main_kw, $number ); if ( $v2 ) { $variants[] = array( 'strategy' => 'Nutzen-Fokus', 'text' => $v2, 'chars' => mb_strlen( $v2 ), 'score' => $this->meta_quality_score( $v2, $title ) ); } $v3 = $this->meta_variant_question( $main_kw, $title ); if ( $v3 ) { $variants[] = array( 'strategy' => 'Frage-Format', 'text' => $v3, 'chars' => mb_strlen( $v3 ), 'score' => $this->meta_quality_score( $v3, $title ) ); } $v4 = $this->meta_variant_cta( $main_kw ); if ( $v4 ) { $variants[] = array( 'strategy' => 'Handlungsaufforderung', 'text' => $v4, 'chars' => mb_strlen( $v4 ), 'score' => $this->meta_quality_score( $v4, $title ) ); } return $variants; } private function meta_variant_keyword( $kw ) { $t = array( $kw . ' – verständlich erklärt mit konkreten Tipps und Beispielen.', 'Alles über ' . $kw . ': Hintergründe, Tipps und häufige Fehler vermeiden.', $kw . ' im Überblick: Das Wichtigste kompakt zusammengefasst.' ); return $this->meta_finalize( $t[ array_rand( $t ) ] ); } private function meta_variant_benefit( $kw, $number ) { if ( ! empty( $number ) && intval( $number ) > 1 && intval( $number ) < 20 ) { $n = intval( $number ); $t = array( "Mit $n praktischen Tipps zu $kw – konkret und direkt anwendbar.", "$n hilfreiche Wege für $kw – Schritt für Schritt erklärt." ); } else { $t = array( 'So gelingt ' . $kw . ' wirklich – mit Tipps aus der Praxis.', $kw . ': Was wirklich hilft und worauf es ankommt.', 'Alles was du über ' . $kw . ' wissen musst – kompakt auf den Punkt.' ); } return $this->meta_finalize( $t[ array_rand( $t ) ] ); } private function meta_variant_question( $kw, $title ) { $tl = mb_strtolower( $title ); if ( mb_strpos( $tl, 'wie ' ) !== false ) { $t = array( 'Wie gelingt ' . $kw . '? Schritt für Schritt erklärt mit Tipps aus der Praxis.', 'Wie du ' . $kw . ' richtig angehst – klar erklärt und sofort umsetzbar.' ); } elseif ( mb_strpos( $tl, 'warum' ) !== false ) { $t = array( 'Warum ' . $kw . ' so wichtig ist – und was du konkret tun kannst.', $kw . ': Die Gründe, Hintergründe und besten Lösungen.' ); } elseif ( mb_strpos( $tl, 'was ' ) !== false ) { $t = array( 'Was ist ' . $kw . '? Einfach erklärt mit konkreten Beispielen.', $kw . ' einfach erklärt: Was es ist, was es bringt und wie du startest.' ); } else { $t = array( $kw . ' – alle wichtigen Fragen beantwortet, kompakt und verständlich.', 'Rund um ' . $kw . ': Die häufigsten Fragen klar beantwortet.' ); } return $this->meta_finalize( $t[ array_rand( $t ) ] ); } private function meta_variant_cta( $kw ) { $t = array( $kw . ' – jetzt mehr erfahren und direkt umsetzen.', $kw . ' verstehen und anwenden: Der praktische Einstieg.', 'Starte jetzt mit ' . $kw . ' – Schritt für Schritt erklärt.' ); return $this->meta_finalize( $t[ array_rand( $t ) ] ); } private function meta_extract_short_keyword( $title ) { $kw = rtrim( trim( $title ), '?!.:,;' ); foreach ( array( '/^(Was ist|Was sind|Was bedeutet|Was macht|Was kostet)\s+/iu', '/^(Wie funktioniert|Wie geht|Wie kann|Wie wird)\s+/iu', '/^(Warum ist|Warum sind|Warum rankt|Warum funktioniert)\s+/iu', '/^(Wann ist|Wann sollte|Welche|Welcher|Welches)\s+/iu' ) as $p ) { $kw = preg_replace( $p, '', $kw ); } $kw = rtrim( trim( $kw ), '?!.:,;' ); if ( strpos( $kw, ':' ) !== false ) { $p = explode( ':', $kw, 2 ); if ( str_word_count( trim( $p[0] ) ) >= 2 ) { $kw = trim( $p[0] ); } } foreach ( array( ' – ', ' — ', ' - ' ) as $sep ) { if ( strpos( $kw, $sep ) !== false ) { $p = explode( $sep, $kw, 2 ); if ( str_word_count( trim( $p[0] ) ) >= 2 ) { $kw = trim( $p[0] ); break; } } } $kw = rtrim( trim( $kw ), '?!.:,;–- ' ); return mb_strlen( $kw ) >= 3 ? $kw : $title; } private function meta_trim_to_word( $text, $max ) { if ( mb_strlen( $text ) <= $max ) { return $text; } $cut = mb_substr( $text, 0, $max ); $pos = mb_strrpos( $cut, ' ' ); if ( $pos !== false ) { $cut = mb_substr( $cut, 0, $pos ); } return rtrim( $cut, ',:;' ); } private function meta_finalize( $text ) { $text = trim( preg_replace( '/\s+/', ' ', $text ) ); if ( mb_strlen( $text ) > 160 ) { $text = $this->meta_trim_to_word( $text, 157 ); if ( ! preg_match( '/[.!?]$/', $text ) ) { $text = rtrim( $text, ',:; ' ) . '.'; } } if ( mb_strlen( $text ) < 120 ) { foreach ( array( ' Jetzt informieren.', ' Hier nachlesen.', ' Alle Infos hier.' ) as $f ) { if ( mb_strlen( $text . $f ) <= 160 ) { $text .= $f; break; } } } return mb_strtoupper( mb_substr( $text, 0, 1 ) ) . mb_substr( $text, 1 ); } private function meta_quality_score( $meta, $title ) { $score = 0; $len = mb_strlen( $meta ); if ( $len >= 140 && $len <= 160 ) { $score += 40; } elseif ( $len >= 120 ) { $score += 25; } elseif ( $len > 0 ) { $score += 10; } $stops = array( 'der','die','das','und','oder','mit','von','zu','in','an','auf','bei' ); $twords = array_filter( preg_split( '/\s+/', mb_strtolower( $title ) ), fn( $w ) => mb_strlen( $w ) >= 4 && ! in_array( $w, $stops ) ); $ml = mb_strtolower( $meta ); $hits = 0; foreach ( $twords as $w ) { if ( mb_strpos( $ml, $w ) !== false ) { $hits++; } } if ( count( $twords ) > 0 ) { $score += (int) round( ( $hits / count( $twords ) ) * 40 ); } if ( preg_match( '/[.!?]$/', $meta ) ) { $score += 20; } return min( 100, $score ); } private function render_meta_generator_box( $post ) { $nonce = wp_create_nonce( 'aije_meta_nonce' ); $seo = $this->get_active_seo_plugin(); $target = array( 'rankmath' => 'rankmath', 'aioseo' => 'aioseo', 'yoast' => 'yoast' )[ $seo ] ?? 'none'; $tl = array( 'rankmath' => 'RankMath', 'aioseo' => 'AIOSEO', 'yoast' => 'Yoast', 'none' => 'WP Rankify' )[ $target ] ?? 'WP Rankify'; $ex = get_post_meta( $post->ID, '_yoast_wpseo_metadesc', true ) ?: get_post_meta( $post->ID, 'rank_math_description', true ) ?: get_post_meta( $post->ID, '_aioseo_description', true ) ?: get_post_meta( $post->ID, '_aije_metadesc', true ); $el = mb_strlen( $ex ); $ec = ( $el >= 140 && $el <= 160 ) ? '#22c55e' : ( $el > 0 ? '#f59e0b' : '#ef4444' ); echo '
'; echo '
Meta-Description Generator
'; if ( ! empty( $ex ) ) { echo '
Aktuelle Meta (' . esc_html( $tl ) . ')' . $el . ' Zeichen
' . esc_html( mb_substr( $ex, 0, 120 ) ) . ( $el > 120 ? '...' : '' ) . '
'; } else { echo '
Noch keine Meta-Description vorhanden.
'; } echo ''; echo ''; echo '
'; // JS aus separater Datei laden require plugin_dir_path( AIJE_PLUGIN_FILE ) . 'admin/metabox-meta-js.php'; } public function aije_topic_analysis_handler() { check_ajax_referer( 'aije_topic_nonce', 'nonce' ); if ( ! current_user_can( 'edit_posts' ) ) { wp_send_json_error( array( 'msg' => 'Keine Berechtigung.' ) ); } $post_id = intval( $_POST['post_id'] ?? 0 ); $post = get_post( $post_id ); if ( ! $post ) { wp_send_json_error( array( 'msg' => 'Beitrag nicht gefunden.' ) ); } if ( ! in_array( $post->post_status, array( 'publish','draft','pending','private','future' ), true ) ) { wp_send_json_error( array( 'msg' => 'Ungültiger Status.' ) ); } $lock_key = 'aije_analysis_lock_' . $post_id . '_' . get_current_user_id(); if ( get_transient( $lock_key ) ) { wp_send_json_error( array( 'msg' => 'Bitte kurz warten.' ) ); } set_transient( $lock_key, 1, 15 ); $title = get_the_title( $post ) ?: '(Kein Titel)'; $content = mb_substr( preg_replace( '/\s+/', ' ', wp_strip_all_tags( $post->post_content ) ), 0, 3000 ); $force = ! empty( $_POST['force'] ); if ( ! $force ) { $cached = get_transient( 'aije_topic_' . $post_id ); if ( $cached ) { wp_send_json_success( array( 'data' => $cached, 'quota' => array(), 'cached' => true ) ); } } $payload = array( 'secret' => self::stats_secret(), 'site_url' => home_url(), 'title' => $title, 'content' => $content, 'action' => 'analyze' ); $response = wp_remote_post( self::AI_PROXY_URL, array( 'timeout' => 35, 'headers' => array( 'Content-Type' => 'application/json' ), 'body' => wp_json_encode( $payload ), 'sslverify' => false ) ); if ( is_wp_error( $response ) ) { wp_send_json_error( array( 'msg' => 'Verbindungsfehler: ' . $response->get_error_message() ) ); } $http_code = wp_remote_retrieve_response_code( $response ); $body = json_decode( wp_remote_retrieve_body( $response ), true ); if ( empty( $body['success'] ) ) { $err = $body['error'] ?? 'Fehler'; if ( $http_code === 429 ) { wp_send_json_error( array( 'msg' => $err, 'limit' => true, 'upgrade_url' => $body['upgrade_url'] ?? 'https://wprankify.de/#pricing' ) ); } wp_send_json_error( array( 'msg' => $err ) ); } delete_transient( 'aije_topic_' . $post_id ); set_transient( 'aije_topic_' . $post_id, $body['data'], DAY_IN_SECONDS ); wp_send_json_success( array( 'data' => $body['data'], 'quota' => $body['quota'] ?? array() ) ); } private function render_topic_analysis_box( $post ) { $nonce = wp_create_nonce( 'aije_topic_nonce' ); $cached = get_transient( 'aije_topic_' . $post->ID ); $pro_status = $this->get_pro_status(); $tier = $pro_status['tier'] ?? 'free'; $remaining = $pro_status['remaining'] ?? 3; $is_pro = ! empty( $pro_status['is_pro'] ); $tc = array( 'free' => '#888', 'starter' => '#22c55e', 'pro' => '#f29400', 'agency' => '#3b82f6' )[ $tier ] ?? '#888'; echo '
'; echo '
🧠 KI-Themen-Analyse
'; echo '
' . esc_html( strtoupper( $tier ) ) . ''; if ( ! $is_pro ) { echo '' . (int) $remaining . ' verbleibend'; } echo '
'; echo ''; echo ''; echo ''; if ( $cached ) { echo '
💾 Letzte Analyse verfügbar.
'; } echo '
'; require plugin_dir_path( AIJE_PLUGIN_FILE ) . 'admin/metabox-topic-js.php'; } public function aije_insert_link_handler() { check_ajax_referer( 'aije_insert_link', 'nonce' ); if ( ! current_user_can( 'edit_posts' ) ) { wp_send_json_error( array( 'msg' => 'Keine Berechtigung.' ) ); } $post_id = intval( $_POST['post_id'] ?? 0 ); $target_id = intval( $_POST['target_id'] ?? 0 ); if ( ! $post_id || ! $target_id ) { wp_send_json_error( array( 'msg' => 'Ungültige Parameter.' ) ); } $post = get_post( $post_id ); $target = get_post( $target_id ); if ( ! $post || ! $target ) { wp_send_json_error( array( 'msg' => 'Beitrag nicht gefunden.' ) ); } $content = $post->post_content; $target_url = get_permalink( $target_id ); $target_title = get_the_title( $target_id ); $stopwords = array( 'der','die','das','den','dem','des','ein','eine','einer','eines','und','oder','aber','wenn','weil','dass','dann','ist','sind','hat','haben','wird','werden','kann','muss','soll','sein','nicht','auch','noch','nur','sehr','mehr','alle','hier','dort','jetzt','mit','von','zu','bei','in','an','auf','aus','nach','the','and','for','with','this','that','are','was','have','not','artikel','beitrag','tipps','hilfe','guide','alles','wissen' ); $keywords = array_values( array_filter( preg_split( '/\s+/', mb_strtolower( wp_strip_all_tags( $target_title ) ), -1, PREG_SPLIT_NO_EMPTY ), function( $w ) use ( $stopwords ) { return mb_strlen( $w ) >= 5 && ! in_array( $w, $stopwords ); } ) ); usort( $keywords, function( $a, $b ) { return mb_strlen( $b ) - mb_strlen( $a ); } ); $linked = false; $linked_kw = ''; $plain = wp_strip_all_tags( $content ); $work = preg_replace( '/^(\s*]*>.*?<\/p>)/is', '___FIRST_P___$1', $content, 1 ); foreach ( $keywords as $kw ) { if ( stripos( $plain, $kw ) === false ) { continue; } $found = false; $new = preg_replace_callback( '/(]*>.*?<\/h[1-6]>)|(]*>.*?<\/a>)|(___FIRST_P___]*>.*?<\/p>)|(' . preg_quote( $kw, '/' ) . ')/isu', function( $m ) use ( $target_url, $target_title, &$found ) { if ( ! empty( $m[1] ) ) { return $m[1]; } if ( ! empty( $m[2] ) ) { return $m[2]; } if ( ! empty( $m[3] ) ) { return str_replace( '___FIRST_P___', '', $m[3] ); } if ( ! $found ) { $found = true; return '' . $m[4] . ''; } return $m[4]; }, $work ); $new = str_replace( '___FIRST_P___', '', $new ); if ( $found && $new !== $content ) { $linked = true; $linked_kw = $kw; $content = $new; break; } } $content = str_replace( '___FIRST_P___', '', $content ); if ( ! $linked ) { $content .= "\n\n" . '

📖 Wenn dich dieses Thema interessiert, lies auch unseren Artikel: ' . esc_html( $target_title ) . '

'; } global $wpdb; $updated = $wpdb->update( $wpdb->posts, array( 'post_content' => $content, 'post_modified' => current_time( 'mysql' ), 'post_modified_gmt' => current_time( 'mysql', 1 ) ), array( 'ID' => $post_id ), array( '%s', '%s', '%s' ), array( '%d' ) ); clean_post_cache( $post_id ); if ( $updated === false ) { wp_send_json_error( array( 'msg' => 'Datenbankfehler.' ) ); } $method = $linked ? 'keyword' : 'paragraph'; wp_send_json_success( array( 'method' => $method, 'keyword' => $linked_kw, 'msg' => $method === 'keyword' ? '✓ „' . esc_html( $linked_kw ) . '" verlinkt.' : '✓ Lese-auch-Absatz eingefügt.', 'new_content' => $content ) ); } }