Adicionar automaticamente! - nextpage-- após o número X de parágrafos

4

É possível adicionar automaticamente o <!--nextpage--> quicktag após o número X de parágrafos?

Meu cliente não é exatamente especialista em tecnologia, então estou tentando encontrar uma maneira de ajudá-los a quebrar suas páginas enormes sem que eles tenham que voltar para mim uma e outra vez perguntando como fazer isso.

    
por Poisontonomes 25.07.2013 / 14:46

1 resposta

2

O conceito

Adicionar algo ao conteúdo durante o salvamento e considerar todos os tipos possíveis de MarkUp não é uma tarefa fácil. Eu brinquei um pouco com ele e decidi que a melhor chance seria usar PHP nativo \DOMDocument class para analisar o conteúdo, identificar o parágrafo e adicionar o comentário HTML a ele. Isso é muito mais confiável do que usar Expressões regulares e ter um desempenho muito melhor.

Ajustando o plugin

Primeiro, o plugin usa Injeção de Dependência para dissociar as classes. Se você precisar alterar a saída (alterar o número de parágrafos, inserir algum outro comentário como uma quebra de linha ou algo de um código de acesso, etc.), será necessário entrar e ajustar os argumentos para a classe Parser que é inicializado de dentro do Controller .

Se você quiser inserir algum HTML normal (por exemplo, um anúncio após o parágrafo X), será necessário entrar no Parser e remover a seguinte linha:

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

e, em seguida, substitua o $comment na próxima linha por $this->tag . Então você pode jogar tags HTML normais, texto ou qualquer outra coisa.

Para coisas mais complicadas, você precisará utilizar os métodos DOMDocument e objetos similares. Por favor, consulte o php.net para mais informações.

Notas

O plugin a seguir só funciona com o PHP 5.3+. Se você tiver uma versão anterior, ela simplesmente não será ativada e, em vez disso, mostrará uma tela WP.

O 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
    }
}
    
por kaiser 25.07.2013 / 16:44