web-dev-qa-db-ja.com

X段落の後に自動的に<! - nextpage - >を追加

X個の段落の後に<!--nextpage-->クイックタグを自動的に追加することは可能ですか?

私のクライアントは厳密には技術に精通しているわけではないので、何度も何度も私に戻ってくることなく彼らが膨大なページを分割するのを手助けする方法を探しています。

4
Poisontonomes

コンセプト

保存中にコンテンツに何かを追加したり、あらゆる種類のMarkUpを考慮したりするのは簡単な作業ではありません。私はそれを少し試してみて、最良の可能性はPHP native \DOMDocumentクラスを使用してコンテンツを解析し、段落を識別し、それにHTMLコメントを追加することであると決心しました。これは、正規表現を使用するよりもはるかに信頼性が高く、パフォーマンスがはるかに優れています。

プラグインを調整する

まず、プラグインは依存性注入を使ってクラスを分離します。出力を変更する必要がある場合(段落の数を変更する、改行などの他のコメントを挿入するなど)、初期化されたParserクラスの引数を調整する必要があります。 Controllerの内側から。

通常のHTML(たとえば、X段落の後の広告)を挿入したい場合は、Parserに移動して次の行を削除する必要があります。

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

次の行の$comment$this->tagに置き換えます。それからあなたは通常のHTMLタグ、テキストまたは何でも投げることができます。

もっと複雑なことには、DOMDocumentやそれに似たオブジェクトメソッドを利用する必要があります。詳細についてはphp.netを参照してください。

ノート

以下のプラグインはPHP 5.3以降でのみ動作します。以前のバージョンを入手した場合、それは単にアクティブにならず、代わりにWP画面を表示します。

プラグイン

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