• Gelöst hessi2

    (@hessi2)


    Hallo Leute,

    wenn ich dieses Code-Snippet in die functions.php meines Child-Themes einfüge, kann ich ihn im Template-Datei-Editor nicht mehr abspeichern. Die Fehlermeldung ist:

    „Etwas ging schief. Deine Änderung wurde vermutlich nicht gespeichert. Bitte erneut versuchen. Es besteht die Möglichkeit, dass du den Fehler manuell beheben und die Datei per FTP hochladen musst.“

    /**
    * Text über Readmore als manuellen Textauszug festlegen. Problem: Embedded interne Link-Excerpts werden teils ab TOC ausgegeben
    * Entfernt den Table of Contents (TOC) und verwendet nur den Text vor dem more-Tag.
    */
    function custom_embed_excerpt_filter($content) {
    // Nur in Embed-Vorschau anwenden
    if (is_embed()) {
    global $post;

    // Manuellen Excerpt prüfen und verwenden, falls vorhanden
    $manual_excerpt = get_post_field('post_excerpt', $post->ID);
    if (!empty($manual_excerpt)) {
    return '<p>' . esc_html($manual_excerpt) . '</p>';
    }

    // Rohen, ungefilterten Inhalt aus der Datenbank abrufen
    $raw_content = get_post_field('post_content', $post->ID);

    // Table of Contents (TOC) entfernen
    $raw_content = preg_replace('/\[toc(.*?)\]/', '', $raw_content); // TOC-Shortcode entfernen
    $raw_content = preg_replace('/<div[^>]*id=["\']?toc["\']?[^>]*>.*?<\/div>/is', '', $raw_content); // TOC in einem Div entfernen

    // Text bis zum <!--more-->-Tag oder der ersten Überschrift extrahieren
    $excerpt = '';

    // 1. Prüfen, ob ein <!--more-->-Tag vorhanden ist
    $read_more_position = strpos($raw_content, '<!--more-->');
    if ($read_more_position !== false) {
    $excerpt = substr($raw_content, 0, $read_more_position); // Text vor dem more-Tag
    } else {
    // 2. Falls kein more-Tag vorhanden, Text bis zur ersten Überschrift verwenden
    preg_match('/<(h[1-6])[^>]*>(.*?)<\/\1>/is', $raw_content, $matches);
    if (!empty($matches)) {
    $first_heading_position = strpos($raw_content, $matches[0]); // Position der ersten Überschrift
    $excerpt = substr($raw_content, 0, $first_heading_position); // Text vor der ersten Überschrift
    } else {
    // 3. Falls weder more-Tag noch Überschrift vorhanden, gesamten Inhalt verwenden
    $excerpt = $raw_content;
    }
    }

    // HTML-Tags entfernen und den Text auf 25 Wörter begrenzen
    return '<p>' . wp_trim_words(wp_strip_all_tags($excerpt), 25, '...') . '</p>';
    }

    // In allen anderen Fällen den ursprünglichen Inhalt zurückgeben
    return $content;
    }
    add_filter('the_content', 'custom_embed_excerpt_filter');
    ?>

    Speichere ich über FTP: kein Problem.
    Speichere ich über den Editor OHNE das Snippet: kein Problem.

    Ist etwas am Code unter WP „verboten“? Ich habe ihn online durch verschiedene Tools testen lassen: keine Fehler. Er funktioniert auch so, wie erwartet.

    Danke im Voraus
    Gruß
    Michael

Ansicht von 4 Antworten – 1 bis 4 (von insgesamt 4)
  • Moderator threadi

    (@threadi)

    Sieht syntaktisch richtig aus, ich kann ihn bei mir problemlos einfügen. Vermutung wäre, dass der Funktionsname „custom_embed_excerpt_filter“ bei dir bereits woanders genutzt wird und es daher zu einem PHP-Fehler beim Aktivieren kommt. Ändere den mal testweise.

    Thread-Starter hessi2

    (@hessi2)

    Danke für diese Idee. Klang schlüssig, aber funktionierte nicht. Damit ich später man nicht von vorn rätsele, wieso ich nicht speichern kann, habe ich den Codeschnipsel einfach ausgelagert: require get_stylesheet_directory() . ‚/hessi-embed-excerpt.php‘;
    Das funktioniert nun und ich habe meine Ruhe. 🙂

    Moderator Hans-Gerd Gerhards

    (@hage)

    super – freut uns. Danke für die Rückmeldung und “Gelöst”-Markieren. 👍

    Thread-Starter hessi2

    (@hessi2)

    Ich habe zu danken. 🙂

Ansicht von 4 Antworten – 1 bis 4 (von insgesamt 4)