web-dev-qa-db-fra.com

Ajouter automatiquement <! - nextpage -> après X nombre de paragraphes

Est-il possible d'ajouter automatiquement le <!--nextpage--> quicktag après X nombre de paragraphes?

Mon client n’est pas vraiment au fait des technologies, alors j’essaie de trouver un moyen de les aider à diviser leurs énormes pages sans qu’ils ne soient obligés de revenir me voir à maintes reprises pour savoir comment le faire.

4
Poisontonomes

Le concept

Ajouter quelque chose au contenu pendant l'enregistrement et prendre en compte toutes sortes de MarkUp possibles n'est pas une tâche facile. J'ai joué un peu avec elle et j'ai décidé que la meilleure chance serait d'utiliser PHP native \DOMDocument class pour analyser le contenu, identifier le paragraphe et y ajouter le commentaire HTML. C'est beaucoup plus fiable que d'utiliser des expressions régulières et une performance bien meilleure.

Ajuster le plugin

Tout d’abord, le plugin utilise Dependency Injection pour découpler les classes. Si vous devez modifier le résultat (changez le nombre de paragraphes, insérez un autre commentaire, comme un saut de ligne ou quelque chose provenant d'un shortcode, etc.), vous devrez intervenir et ajuster les arguments de la classe Parser initialisée. de l'intérieur de la Controller.

Si vous souhaitez insérer du code HTML normal (par exemple, une annonce après le paragraphe X), vous devez accéder à la variable Parser et supprimer la ligne suivante:

$comment = $this->dom->appendChild( new \DOMComment( $this->tag ) );

puis remplacez le $comment dans la ligne suivante par $this->tag. Ensuite, vous pouvez ajouter des balises HTML normales, du texte ou autre chose.

Pour des tâches plus complexes, vous devrez utiliser la méthode DOMDocument et des méthodes objets similaires. S'il vous plaît se référer à php.net pour plus d'informations.

Remarques

Le plugin suivant ne fonctionne qu'avec PHP 5.3+. Si vous avez une version antérieure, elle ne s'activera tout simplement pas et vous montrera un écran WP.

Le plugin

<?php
namespace WPSE\NextpageParagraph107787;

defined( 'ABSPATH' ) OR exit;
/**
 * Plugin Name: (#107787) Nextpage after X paragraphs
 * Plugin URl:  http://wordpress.stackexchange.com/questions/107787
 * Description: <strong>Needs PHP 5.3+!</strong> Adds a <code><!--nextpage--></code> tag after X paragraphs.
 * Author:      Franz Josef Kaiser
 * Author URl:  http://unserkaiser.com
 * License:     MIT
 */

\add_action( 'init', array( __NAMESPACE__.'\Controller', 'init' ) );
class Controller
{
    protected static $instance = null;

    public static function init()
    {
        null === self::$instance AND self::$instance = new self;
        return self::$instance;
    }

    protected function __construct()
    {
        $parser = new Parser();
        $parser->setTag( 'nextpage' );
        $parser->setTagAmount( 5 );

        \add_action( 'load-post.php', array( $parser, 'onSave' ) );
        \add_action( 'load-post-new.php', array( $parser, 'onSave' ) );
    }
}

class Parser
{
    private $dom    = null;
    private $tag    = null;
    private $amount = null;

    public function __construct( $tag = null, $paragraph_number = null )
    {
        null === $this->dom
            AND $this->dom = new \DOMDocument();
    }

    public function setTag( $tag )
    {
        $this->tag = $tag;
    }

    public function setTagAmount( $amount )
    {
        $this->amount = $amount;
    }

    public function onSave( $post_id )
    {
        if ( empty( $_POST['content'] ) )
            return;

        $this->dom->loadHTML( \wpautop( $_POST['content'] ) );
        $paragraph = $this->dom->getElementsByTagName( 'p' );

        $content = null;
        $i = 1;
        foreach ( $paragraph as $p )
        {
            $content .= $this->dom->saveHTML( $p );
            if (
                $this->amount === $i++
                AND $this->amount < $paragraph->length
                )
            {
                $comment = $this->dom->appendChild( new \DOMComment( $this->tag ) );
                $content .= $this->dom->saveHTML( $comment );
            }
        }

        // Add to the HTTP $_POST global
        $_POST['content'] = $content;
    }
}

\register_activation_hook( __FILE__, array( __NAMESPACE__.'\Setup', 'onActivation' ) );    
\register_deactivation_hook( __FILE__, array( __NAMESPACE__.'\Setup', 'onDeactivation' ) );    
\register_activation_hook( __FILE__, array( __NAMESPACE__.'\Setup', 'onUninstall' ) );
class Setup
{
    public function onActivation()
    {
        if ( ! current_user_can( 'activate_plugins' ) )
            return;
        $plugin = isset( $_REQUEST['plugin'] ) ? $_REQUEST['plugin'] : '';
        check_admin_referer( "activate-plugin_{$plugin}" );

        // do stuff
    }

    public function onDeactivation()
    {
        if ( ! current_user_can( 'activate_plugins' ) )
            return;
        $plugin = isset( $_REQUEST['plugin'] ) ? $_REQUEST['plugin'] : '';
        check_admin_referer( "deactivate-plugin_{$plugin}" );

        // do stuff
    }

    public function onUninstall()
    {
        if ( ! current_user_can( 'activate_plugins' ) )
            return;
        check_admin_referer( 'bulk-plugins' );

        if ( __FILE__ != WP_UNINSTALL_PLUGIN )
            return;

        // do stuff
    }
}
2
kaiser