web-dev-qa-db-fra.com

Créer automatiquement des pages dans un article en fonction du nombre de mots

J'ai besoin d'une méthode pour créer automatiquement des pages (en utilisant <!--nextpage-->) dans les publications en fonction du nombre de mots.

Par exemple ... Un message contenant 1 200 mots doit être divisé en 6 pages, le saut de page apparaissant tous les 200 mots.

Je comprends que je peux le faire manuellement. Mais cette fonctionnalité est nécessaire pour un site propulsé par WordPress qui contiendrait des archives de données importées dans plusieurs langues.

Essayé de chercher un plugin qui pourrait accomplir quelque chose comme ça. Impossible de le trouver.

2
OperaManiac

C'est difficile à faire par programme en raison des variations potentielles du langage HTML et de l'équilibre des balises. Cependant, si vous deviez essayer, voici comment je vous suggère de le faire.

Tout d’abord, WordPress configure la post-publication dans setup_postdata(), appelée à la fin de the_post(). Cela signifie que vous devez obtenir ces lignes <!--nextpage--> dans les publications avant la fin de the_post(). L'action 'loop_start' devrait fonctionner à ces fins. Il transmet même une copie de l'objet WP_Query actuel par référence, de sorte que vous pouvez modifier directement les publications interrogées!

Quelque chose comme ça est un début:

add_action( 'loop_start', 'wpse14677_loop_start' );

function wpse14677_loop_start( $query ) {
    foreach( $query->posts as $index => $post ) {
        $words = preg_split( '/ +/', $post->post_content, PREG_SPLIT_NO_EMPTY );
        $pages = array();
        while ( $words ) {
            $Word_count = count ( $words );
            if ( 200 >= $Word_count ) {
                $pages[] = implode( ' ', $words );
                $words = array();
            } else {
                $pages[] = implode( ' ', array_slice( $words, 0, 200 ) );
                $words = array_slice( $words, 200 );
            }
        }
        $page_count = count( $pages );
        if( 1 < $page_count ) {
            $query->posts[ $index ]->post_content = implode( "\n<!--nextpage-->\n", $pages );
        }
    }
}

J'espère que cela vous donne une idée de ce que vous devez faire. Je suggérerais de trouver un moyen de supprimer temporairement les balises HTML et de les remplacer après avoir inséré les drapeaux nextpage, car la fonction ci-dessus comptera également les espaces dans les balises HTML, et pourrait même placer un saut de page à l'intérieur.

5
John P Bloch

Merci d'avoir économisé mon temps. Lors de la migration d'un site non wordpress dans wordpress, j'essayais de remplacer PAGEBREAK dans wordpress. Je l'ai fait avec la syntaxe suivante.

function make_pagebreak_nextpaglink( $query  ) {
   foreach( $query->posts as $index => $post ) {
      $content = str_replace('__PAGEBREAK__', '<!--nextpage-->',   $post->post_content);
      $query->posts[ $index ]->post_content = $content;
   }
}
add_action('loop_start', 'make_pagebreak_nextpaglink');
0
Omprakash Bagrao