it-swarm.com.de

Teilen Sie den Post-Inhalt für jeweils 500 Zeichen (oder jede andere Zeichenanzahl) in separaten Divs auf.

Was ist die beste Methode, um den Inhalt eines Posts (für eine einzelne Postseite) abzufangen, den Inhalt in Abschnitte mit 500 Zeichen (oder eine beliebige andere Anzahl von Zeichen) zu unterteilen und dann jeden Abschnitt mit 500 Zeichen auszugeben, der in einen eigenen div-Container eingeschlossen ist?

Ich verstehe, dass get_the_content () den Inhalt des Posts als Zeichenfolge zurückgibt, die in einer Variablen gespeichert werden kann. Als PHP-Neuling bin ich mir jedoch nicht sicher, wie ich den Inhalt basierend auf der Anzahl der Zeichen segmentieren soll. Wir können die Anzahl der Zeichen ermitteln mit:

    <?php
      $content = get_the_content();
      echo strlen($content);
    ?>

Soweit ich weiß. Kann mir jemand bei dieser Herausforderung helfen?

UPDATE: Mit Hilfe von Lukas Kolletzki zum Stackoverflow bin ich so weit gekommen:

    <?php
    $content = get_the_content();
    $chunks = str_split($content, 500);

    //Printing each chunk in a div
    foreach($chunks as $chunk_content) {
        echo "<div>";
        echo $chunk_content;
        echo "</div>";
    }
    ?>

Dadurch wird der Inhalt der Posts erfolgreich in Abschnitte mit 500 Wörtern aufgeteilt und in separate Container eingeschlossen.

Noch weitergehend schlug Lukas vor, die Funktionen wordwrap () und explode () zu verwenden, um sicherzustellen, dass Wörter nicht in zwei Hälften geschnitten werden:

    <?php
    $content = get_the_content();
    $strings = wordwrap($content, 500, "<br />"); //Put a {BREAK} every 500 characters
    $chunks = explode("<br />", $strings); //Put each segment separated by {BREAK} into an array field

    //Printing each chunk in a div
    foreach($chunks as $chunk_content) {
        echo "<div class="post-content">";
        echo $chunk_content;
        echo "</div>";
    }
    ?>

Das funktioniert ganz gut, aber jetzt merke ich, dass der normale WordPress

tags werden nicht ausgegeben. Liegt das daran, dass get_the_content () nur Text ohne HTML ausgibt?

Wie kann ich die Absätze wieder in den Beitragsinhalt aufnehmen und trotzdem die oben genannten Funktionen beibehalten?

Nochmals vielen Dank. Bitte markieren Sie dies nicht als Duplikat. Es ist eine ganz andere Frage als die Filterfrage excerpt_length ... oder zumindest denke ich.

1
user2655393

daher schätze ich das Feedback und die Antwort von @kaiser und @ t31os sehr. Ich bin wackelig mit PHP, daher war es schwierig, einen funktionierenden Codeblock mit der Antwort von kasier & t31os zusammenzustellen. Das ist mein Fehler, weil ich kein sehr talentierter Coder bin :-(

Aber ich wollte die Lösung, die ich gefunden habe, veröffentlichen, indem ich meine eigenen Recherchen zu PHP.net durchführte und eine ähnliche Frage zu StackOverflow stellte.

Hier ist der Code, den ich verwende, um das zu erreichen, was ich ursprünglich vorhatte:

    <?php
    $content = get_the_content();
    $strings = wordwrap($content, 500, "<!--break-->"); //insert this every 500 chars, but preserve whole words.
    $chunks = explode("<!--break-->", $strings); create a new string of 500-char sections.

    ob_start(); // buffer the output of the following expressions...
    foreach($chunks as $chunk_content) {
        echo '<span>'; // use <span> instead of <div> so as to not interrupt the paragraph formatting of the content when viewed normally (graceful degradation).
        echo $chunk_content;
        echo '</span> ';
        }
    $segmented_content = ob_get_contents(); // put the results of the above expressions into a variable.
    ob_end_clean(); // discard the expressions that were buffered.
    echo nl2br($segmented_content); // put the result through a filter which replaces line-breaks with <br> tags.
    ?>

ANMERKUNGEN:

  • Der Zweck dieser Segmentierung des Inhalts besteht darin, separate Frames oder "Seiten" zu erstellen, die vom BookBlock-Seiten-Flip-Plug-In verwendet werden (lesen Sie dieses Codrops-Tutorial Für mehr Information). Jeder Abschnitt mit 500 Zeichen wird als "Seite" behandelt, und die Navigationssteuerelemente auf der Seite ermöglichen es dem Benutzer, mit einem Nice CSS3 3D-Transformationsübergang durch die Seiten zu blättern.

  • Ich habe <span> -Container verwendet, um die Ausgabe zu verpacken, da diese Methode zu einer angemessenen Verschlechterung führt. Wenn das Gerät des Benutzers kein Javascript oder einige wichtige CSS3-Eigenschaften unterstützt, erkennt Modernizer dies und mein CSS passt sich an und zeigt eine normale Seite mit Inhalten an, die nicht in separate Frames unterteilt ist. In diesem Fall stört der <span> den normalen Code nicht Absatzstruktur des Inhalts.

  • Ich habe die Ausgabepufferung verwendet, um alle 500-Zeichen-Abschnitte in eine Variable zu kompilieren, die für die endgültige Ausgabe durch den Filter nl2br(); geleitet werden soll.

  • Zuerst habe ich versucht, mit dem Filter wpautop(); sicherzustellen, dass Absätze in der Ausgabe richtig gerendert werden, aber bald wurde mir klar, dass sich die Tags <span> und <p> nicht überlappen können :-P Und wenn ich den Filter wpautop(); auf jeden Abschnitt mit 500 Zeichen einzeln anwenden würde, würde er ausgegeben <p> tags manchmal mitten in Sätzen. Die Lösung bestand darin, den Filter nl2br(); zu verwenden, um bei jedem Zeilenumbruch im Inhalt <br>-Tags hinzuzufügen. Da für diese Tags kein schließendes Tag erforderlich ist, wird die Absatzstruktur beibehalten, ohne die 500-Zeichen-Container zu stören.

FRAGE: Dieser Code funktioniert und wird auf einer Website verwendet, die keinen starken Datenverkehr aufweist (wahrscheinlich weniger als 50 Besuche pro Tag). Aber ich bin immer noch besorgt (weil ich nicht sehr gut mit PHP vertraut bin), dass dieser Code träge und nicht sehr elegant sein könnte.

Angenommen, ich wüsste genau, wie die von kaiser und t31os in ihrer Antwort empfohlenen Ergebnisse erzielt werden. Wäre ihre Lösung für die Rechengeschwindigkeit besser (d. H. Weniger Serveranforderungen, Datenbankabfragen, weniger Code usw.)? Oder ist meine Lösung genauso gut?

1
user2655393

get_the_content() gibt zurück, was sich im Editor befindet, aber wpautop-Filter und dergleichen sind an the_content angehängt (den Sie in Ihrer Split-Funktion nicht benötigen - wenden Sie ihn später einfach manuell mit an

apply_filters( 'the_content', $output );

am Ende.

Sie sollten auch strip_shortcodes( get_the_content() ); verwenden, bevor Sie es aufteilen:

$output = get_the_content();
$output = wp_trim_words( $output, 500 );

Sie müssen eine Schleife durchlaufen, solange Sie Inhalt und array_Push() zu Ihrer $output = array(); haben.

1
kaiser

Auf Anfrage von user2655393 habe ich eine Version seines Codes geschrieben, die keine Ausgabepufferung verwendet, sondern stattdessen eine Zeichenfolgenverkettung.

$content = get_the_content();
$strings = wordwrap($content, 500, "<!--break-->"); //insert this every 500 chars, but preserve whole words.
$chunks = explode("<!--break-->", $strings); create a new string of 500-char sections.  
$segmented_content = '';
foreach($chunks as $chunk_content) {
  $segmented_content .= '<span>'; // use <span> instead of <div> so as to not interrupt the paragraph formatting of the content when viewed normally (graceful degradation).
    $segmented_content .= $chunk_content;
  $segmented_content .= '</span> ';
}
echo nl2br($segmented_content); // put the result through a filter which replaces line-breaks with <br> tags.
1
s_ha_dum