Support » Allgemeine Fragen » the_content() und the_excerpt() vergleichen

  • Gelöst radarin

    (@radarin)


    Hallo zusammen

    Ich verwende ein Theme, das bei Beiträgen den Weiterlesen-Button auch anzeigt, wenn im Inhalt nicht mehr drin steht, als bereits schon im Auszug. Das ist Blödsinn. (und ja, ich habe auch sehr kurze Beiträge)

    Gibt es in WordPress vielleicht schon eine Funktion oder Variable die feststellt, ob der Inhalt länger ist als der Auszug?

    Ich habe es zuerst versucht mit Zeichen oder Wörter zählen, erhalte da aber bei vermeintlich identischem Inhalt unterschiedliche Werte.

    Mein aktueller Versuch sollte eigentlich alles entfernen was nicht Text ist. Und obwohl die Ausgabe der beiden Variablen $auszug und $inhalt optisch identisch sind, ergibt das IF immer die Ausgabe des Links ‚Weiterlesen‘.

    //Auszug und Inhalt vergleichen
    function vs_exerpt_content(){
        global $post;
    	$auszug = get_the_excerpt($post->ID);
    	$auszug = strip_tags($auszug);
    	$auszug = strip_shortcodes($auszug);
      
            $inhalt = get_the_content($post->ID);
    	$inhalt = strip_tags($inhalt);
    	$inhalt = strip_shortcodes($inhalt);
      
      echo "<b>Test Auszug: </b>".$auszug."<br><br>";
      
      echo "<b>Test Inhalt: </b>".$inhalt."<br><br>";
      
      if($auszug == $inhalt) {
    	  echo 'Test Ausgabe: Der komplette Inhalt ist im Auszug vorhanden.';
    	}else{
    	  echo 'Test Ausgabe: <a class="readmore" href="' . get_permalink() . '" title="'.the_title( '', '', false ).'">'.__( 'Read more', 'travelify' ).'</a>';
    	  
    	}
      
    }

    Ich kann hier keinen Fehler erkennen.

    Gruß René

Ansicht von 8 Antworten - 1 bis 8 (von insgesamt 8)
  • Ändere mal diese Zeilen

    echo "<b>Test Auszug: </b>".$auszug."<br><br>";
      
      echo "<b>Test Inhalt: </b>".$inhalt."<br><br>";

    in

    echo "<b>Test Auszug: </b><br>";
     var_dump($auszug);
      
    echo "<br><br><b>Test Inhalt: </b><br>";
    var_dump($inhalt);

    und vergleiche dann mal die Ausgabe

    Thread-Starter radarin

    (@radarin)

    2 Zeichen mehr im $inhalt. Am Anfang und am Schluss ein Leerzeichen. Das kann ja so nicht funktionieren.

    Mit trim() krieg ich die beiden ‚Querolanten‘ zwar weg, aber das IF funktioniert trotzdem nicht. Da var_dump jedoch eine identische Zeichenzahl angibt, läuft es wohl wieder auf das Zeichen zählen hinaus.

    Ein neuer Absatz führt zu einer Differenz von 3, da muss einiger mehr getrimmt werden.

    • Diese Antwort wurde geändert vor 5 Jahren, 3 Monaten von radarin.
    • Diese Antwort wurde geändert vor 5 Jahren, 3 Monaten von radarin.
    Thread-Starter radarin

    (@radarin)

    Ich hab das Ganze mal erweitert.

    $inhalt = trim($inhalt, " \t\n\r\0\x0B");
    $inhalt = preg_replace("%(\r\n)|(\r)%", "", $inhalt);

    Test Auszug:
    string(82) „WordPress 5 steht auf der Seite de-ch.wordpress.org/download/ zum download bereit.“

    Test Inhalt:
    string(82) „WordPress 5 steht auf der Seite de-ch.wordpress.org/download/ zum download bereit.“

    Das müsste doch jetzt funktionieren, ausser Gross-/Klein-Buchstaben werden wie bei Passwörtern unterschieden. Im Content habe ich WordPress NICHT mit einem grossen P geschrieben. Im Auszug steht es nun aber anders da. Und funktioniert nicht. Bei einem anderen Beitrag ohne diese Differenz klappt es wunderbar.

    Mit $auszug = strtolower($auszug); ist aber auch das Problem gelöst.

    Ein Problem besteht aber noch wenn ein Absatz innerhalb des Auszugs vorkommt. 3 Zeichen Differenz verursacht das. Wenn ich nach Absatz entfernen suche, liefert Google mir nur die Antwort auf den Zeilenumbruch.

    Bei der Ausgabe nicht sichtbar, sind im Quellcode 3 leere Zeilen dazwischen.

    Wenn \n die nicht raus kriegt, muss es ein anderes Steuerzeichen sein.

    • Diese Antwort wurde geändert vor 5 Jahren, 3 Monaten von radarin.
    • Diese Antwort wurde geändert vor 5 Jahren, 3 Monaten von radarin.
    • Diese Antwort wurde geändert vor 5 Jahren, 3 Monaten von radarin.

    Probiere es mal so:

    $auszug = trim(get_the_excerpt($post->ID));
    $inhalt = trim(get_the_content($post->ID));
    
    $auszug = strtolower($auszug);
    $inhalt = strtolower($inhalt);
    
    echo "Auszug:<br><pre>\n";
    var_dump($auszug);
    echo "</pre><br><br>Inhalt:<br><pre>\n");
    var_dump($inhalt);
    echo "</pre>";

    Vergleiche die Ausgabe und auch den HTML-Code, der im Browser ankommt. Poste dann mal das Ergebnis.

    Thread-Starter radarin

    (@radarin)

    Das geht komplett schief, ein Beitrag von 82 Zeichen zählt im Auszug 347 Zeichen.

    Die vorherige Variante funktioniert soweit ich es bis jetzt feststellen kann einwandfrei, solange es innerhalb des Auszugs keinen neuen Absatz hat.

    Eigentlich unwahrscheinlich, dass es zu dieser Situation kommt, aber wenn, dann soll das doch komplett funktionieren.

    Die Ausgabe mit der funktionierenden Funktion:

    Test Auszug:
    string(28) „das ist ein kurzer be/itrag.“

    Test Inhalt:
    string(31) „das ist ein kurzer be/itrag.“

    Der Quellcode:

    <b>Test Auszug: </b><br>string(28) "das ist ein kurzer be/itrag."
    <br><br><br><br><b>Test Inhalt: </b><br>string(31) "das
    
    ist ein kurzer be/itrag."

    Im Auszug hab ich keinen Umbruch im Code, beim Inhalt hab ich 3 Leerzeilen.

    Auch wenn ich mit str_replace(" ", "", $inhalt) alle Leerzeichen entferne, die Leerzeilen im Code bleiben bestehen.

    In der Funktion the_excerpt() scheint das entfernen ja zu funktionieren. Ich mach mich mal auf die Suche nach den genauen Code.

    • Diese Antwort wurde geändert vor 5 Jahren, 3 Monaten von radarin.
    • Diese Antwort wurde geändert vor 5 Jahren, 3 Monaten von radarin.
    • Diese Antwort wurde geändert vor 5 Jahren, 3 Monaten von radarin.
    Thread-Starter radarin

    (@radarin)

    Ich denke ich habe das Problem gelöst preg_replace() war wohl völlig für die Katz. Mit str_replace() hab ich jetzt auch den Absatz entfernt. Werde morgen die fertige Lösung posten.

    Erst mal vielen Dank für die Unterstützung.

    Thread-Starter radarin

    (@radarin)

    Und hier noch die fertige Funktion.

    Der Weiterlesen-Button, welcher im Theme fest verankert ist und immer angezeigt wird, auch wenn der komplette Inhalt des des Beitrages bereits im Auszug zu lesen ist, macht meines Erachtens wenig Sinn. Um den Button (Weiterlesen-Link) nur anzuzeigen, wenn es auch mehr zu lesen gibt als im Auszug, habe ich den Link im Theme gegen diese Funktion ersetzt:

    // Auszug und Inhalt vergleichen
    function vs_excerpt_content(){
      global $post;
      // Auszug laden
      $auszug = get_the_excerpt($post->ID);
      // HTML und PHP entfernen
      $auszug = strip_tags($auszug);
      // Shortcodes entfernen
      $auszug = strip_shortcodes($auszug);
      // Wandelt alle Buchstaben in Kleinbuchstaben um.
      // Word press schreibt sich im Auszug automatisch WordPress,
      // was zu einem Fehler beim Vergleich führt, wenn WordPress
      // im Inhalt vorhanden ist
      $auszug = strtolower($auszug);
      // Leerzeichen entfernen
      $auszug = str_replace(" ", "", $auszug);
      
      $inhalt = get_the_content($post->ID);
      $inhalt = strip_tags($inhalt);
      $inhalt = strip_shortcodes($inhalt);
      $inhalt = strtolower($inhalt);
      $inhalt = str_replace(" ", "", $inhalt);
      // Zeilenumbrüche und Absätze entfernen
      // Die Funktion get_the_excerpt() hat dies bereits erledigt
      // Die Funktion get_the_content() liefert Diese noch mit
      $inhalt = str_replace("\r", "", $inhalt);
      $inhalt = str_replace("\n", "", $inhalt);
      
      if($auszug != $inhalt) {
        // hier Original Link aus dem Theme einfügen. Im Theme dafür statt des Links
    	// den Funktionsaufruf einfügen. >>> vs_excerpt_content();
    	echo '<a class="readmore" href="' . get_permalink() . '" title="'.the_title( '', '', false ).'">'.__( 'Read more', 'travelify' ).'</a>'; 
    	}
    }

    Den Link den ich aus dem Theme entfernt habe, ist entsprechend in der Funktion wieder eingefügt, sodass der identische Code im Theme ausgegeben wird. Wie der Link geschrieben wird, hängt also auch vom Theme ab.

    Soweit ich es getestet habe, führt ein vorhandenes Bild im Inhalt zu einer Differenz beim Vergleich. Auch wenn der komplette Text des Inhaltes im Auszug zu lesen ist, ein vorhandenes Bild das ja im Auszug nicht zu sehen ist, führt zum Weiterlesen Link. So wie es auch Sinn macht.

    Hinweis:
    Auch hier im Forum erlaubt sich die Software ‚Word press‘ einfach anders zu schreiben, und aus dem kleinen p ein grosses P zu machen.

    • Diese Antwort wurde geändert vor 5 Jahren, 3 Monaten von radarin.
    • Diese Antwort wurde geändert vor 5 Jahren, 3 Monaten von radarin.
    • Diese Antwort wurde geändert vor 5 Jahren, 3 Monaten von radarin.
Ansicht von 8 Antworten - 1 bis 8 (von insgesamt 8)
  • Das Thema „the_content() und the_excerpt() vergleichen“ ist für neue Antworten geschlossen.