web-dev-qa-db-fra.com

Diviser le contenu de la publication en divs séparés pour 500 caractères (ou tout autre nombre de caractères)

Quelle est la meilleure méthode pour intercepter le contenu d'une publication (pour une page de publication unique) et diviser le contenu en sections de 500 caractères (ou tout autre nombre de caractères), puis pour afficher chaque section de 500 caractères dans son propre conteneur div?

Je comprends que get_the_content () renvoie le contenu du message sous forme de chaîne pouvant être stockée dans une variable. Mais, étant nouveau sur PHP, je ne sais pas trop comment segmenter le contenu en fonction du nombre de caractères. Nous pourrions obtenir le nombre de caractères en utilisant:

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

Mais c’est tout ce que je sais. Quelqu'un peut-il m'aider avec ce défi?

MISE À JOUR: Avec l'aide de Lukas Kolletzki sur stackoverflow, j'ai obtenu jusqu'ici:

    <?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>";
    }
    ?>

Cela permet de fractionner le contenu de la publication en sections de 500 mots et de les insérer dans des conteneurs distincts.

Pour aller encore plus loin, Lukas suggéra d'utiliser les fonctions wordwrap () et explode () pour s'assurer que les mots n'étaient pas coupés en deux:

    <?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>";
    }
    ?>

Cela fonctionne assez bien, mais maintenant je me rends compte que le wordpress normal

les balises ne sont pas en sortie. Est-ce parce que get_the_content () génère uniquement du texte, sans le code HTML?

Comment puis-je récupérer les paragraphes dans le contenu de l'article tout en conservant les fonctionnalités ci-dessus?

Merci encore, et s'il vous plaît ne marquez pas cela comme un doublon. C'est une question bien différente de la question filtre exterpt_length ... ou du moins je le pense.

1
user2655393

j'apprécie donc vraiment tous les commentaires et la réponse apportée par @kaiser et @ t31os. Je suis fragile avec PHP et il était donc difficile de mettre en place un bloc de code fonctionnel avec la réponse de kasier & t31os. C'est ma faute pour ne pas être un codeur très talentueux :-(

Mais, je voulais publier la solution que j'ai trouvée en faisant mes propres recherches sur PHP.net et en posant une question similaire sur StackOverflow.

Voici le code que j'utilise pour accomplir ce que je voulais faire à l'origine:

    <?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.
    ?>

REMARQUES:

  • Le but de cette segmentation du contenu est de créer des cadres ou des "pages" distincts qui seront utilisés par le plug-in BookBlock page-flip (consultez ce tutoriel sur le codrops pour plus d'informations). Chaque section de 500 caractères sera traitée comme une "page" et les commandes de navigation de la page permettent à l'utilisateur de parcourir les pages avec une transition de transformation Nice CSS3 3D.

  • J'ai utilisé des conteneurs <span> pour envelopper la sortie, car cette méthode se prête à une dégradation progressive. Si l'appareil de l'utilisateur ne prend pas en charge JavaScript ou certaines propriétés essentielles de CSS3, Modernizer le détectera et mon CSS s'adaptera, affichant une page de contenu normale, non divisée en trames séparées, et dans ce cas, le <span> ne perturbera pas le fonctionnement normal. structure de paragraphe du contenu.

  • J'ai utilisé la mise en tampon de sortie afin de compiler toutes les sections de 500 caractères en une seule variable à transmettre par le filtre nl2br(); pour la sortie finale.

  • Au début, j'ai essayé d'utiliser le filtre wpautop(); pour m'assurer que les paragraphes étaient bien restitués dans la sortie, mais je me suis vite rappelé que les balises <span> et <p> ne pouvaient pas se chevaucher :-P Et si j'appliquais le filtre wpautop(); à chaque 500 -char section individuellement, cela produirait parfois des balises <p> au milieu de phrases. La solution consistait à utiliser le filtre nl2br(); afin d'ajouter des balises <br> à chaque saut de ligne dans le contenu, ce qui, comme elles ne nécessitent pas de balise de fermeture, conservera la structure de paragraphe sans perturber les conteneurs de 500 caractères. .

QUESTION: Ce code fonctionne et il sera utilisé sur un site Web ne générant pas un trafic important (probablement moins de 50 visites par jour). Mais, je suis toujours préoccupé (parce que je ne connais pas vraiment PHP) que ce code puisse être lent et ne pas être très élégant.

En supposant que je sache exactement comment accomplir ce que kaiser et t31os recommandent dans leur réponse, leur solution serait-elle meilleure en termes de vitesse de calcul (c'est-à-dire moins de demandes de serveur, de requêtes de base de données, moins de code, etc.)? Ou ma solution est-elle aussi bonne?

1
user2655393

get_the_content() renvoie ce qu'il y a dans l'éditeur, mais les filtres wpautop et autres sont attachés à the_content (dont vous n'avez pas besoin dans votre fonction split - appliquez-le plus tard manuellement à l'aide de

apply_filters( 'the_content', $output );

à la fin.

Vous devriez également utiliser strip_shortcodes( get_the_content() ); avant de le séparer:

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

Vous devrez le parcourir tant que vous aurez le contenu et la fonction array_Push() dans votre $output = array();.

1
kaiser

Par demande de user2655393, j'ai écrit une version de son code qui n'utilise pas la mise en mémoire tampon de la sortie mais utilise plutôt la concaténation de chaînes.

$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