Wie gebe ich seitenweise Links einen benutzerdefinierten Titel?

14

Ich habe meinen Beitragsinhalt mithilfe des <! - nextpage ->Codes in mehrere Seiten aufgeteilt . Ich möchte meinen paginierten Links anstelle der regulären 1,2,3 einen eigenen Titel geben. Wie kann ich das machen? In diesem Dokument wird https://codex.wordpress.org/Styling_Page-Links nur die Methode zum Hinzufügen von Suffixen oder Präfixen erwähnt. Ich möchte einfach jeder ausgelagerten Nummer einen eigenen benutzerdefinierten Titel geben

Ruriko
quelle

Antworten:

17

Hier ist eine Möglichkeit, Paginierungstitel des Formulars zu unterstützen:

<!--nextpage(.*?)?--> 

in ähnlicher Weise wie der Kern unterstützt <!--more(.*?)?-->.

Hier ist ein Beispiel:

<!--nextpage Planets -->
Let's talk about the Planets
<!--nextpage Mercury -->
Exotic Mercury
<!--nextpage Venus-->
Beautiful Venus
<!--nextpage Earth -->
Our Blue Earth
<!--nextpage Mars -->
The Red Planet

mit der Ausgabe ähnlich wie:

Paginierungstitel

Dies wurde am Twenty Sixteen- Thema getestet , bei dem ich die Polsterung und die Breite ein wenig anpassen musste :

.page-links a, .page-links > span {
    width:   auto;
    padding: 0 5px;
}

Demo-Plugin

Hier ist eine Demo - Plugin , das die verwendet content_pagination, wp_link_pages_link, pre_handle_404und wp_link_pages_argsFilter dieses extenstion des unterstützen next Markers ( PHP 5.4+ ):

<?php
/**
 * Plugin Name: Content Pagination Titles
 * Description: Support for &lt;!--nextpage(.*?)?--&gt; in the post content
 * Version:     1.0.1
 * Plugin URI:  http://wordpress.stackexchange.com/a/227022/26350
 */

namespace WPSE\Question202709;

add_action( 'init', function()
{
    $main = new Main;
    $main->init();
} );

class Main
{
    private $pagination_titles;

    public function init()
    {
        add_filter( 'pre_handle_404',       [ $this, 'pre_handle_404' ],        10, 2       );
        add_filter( 'content_pagination',   [ $this, 'content_pagination' ],    -1, 2       );
        add_filter( 'wp_link_pages_link',   [ $this, 'wp_link_pages_link' ],    10, 2       );
        add_filter( 'wp_link_pages_args',   [ $this, 'wp_link_pages_args' ],    PHP_INT_MAX );
    }

    public function content_pagination( $pages, $post )
    {
        // Empty content pagination titles for each run
        $this->pagination_titles = [];

        // Nothing to do if the post content doesn't contain pagination titles
        if( false === stripos( $post->post_content, '<!--nextpage' ) )
            return $pages;

        // Collect pagination titles
        preg_match_all( '/<!--nextpage(.*?)?-->/i', $post->post_content, $matches );
        if( isset( $matches[1] ) )
            $this->pagination_titles = $matches[1];     

        // Override $pages according to our new extended nextpage support
        $pages = preg_split( '/<!--nextpage(.*?)?-->/i', $post->post_content );

        // nextpage marker at the top
        if( isset( $pages[0] ) && '' == trim( $pages[0] ) )
        {
            // remove the empty page
            array_shift( $pages );
        }       
        // nextpage marker not at the top
        else
        {
            // add the first numeric pagination title 
            array_unshift( $this->pagination_titles, '1' );
        }           
        return $pages;
    }

    public function wp_link_pages_link( $link, $i )
    {
        if( ! empty( $this->pagination_titles ) )
        {
            $from  = '{{TITLE}}';
            $to    = ! empty( $this->pagination_titles[$i-1] ) ? $this->pagination_titles[$i-1] : $i;
            $link  = str_replace( $from, $to, $link );
        }

        return $link;
    }

    public function wp_link_pages_args( $params )
    {       
        if( ! empty( $this->pagination_titles ) )
        {
            $params['next_or_number'] = 'number';
            $params['pagelink'] = str_replace( '%', '{{TITLE}}', $params['pagelink'] );
        }
        return $params;
    }

    /**
     * Based on the nextpage check in WP::handle_404()
     */
    public function pre_handle_404( $bool, \WP_Query $q )
    {
        global $wp;

        if( $q->posts && is_singular() )
        {
            if ( $q->post instanceof \WP_Post ) 
                $p = clone $q->post;

            // check for paged content that exceeds the max number of pages
            $next = '<!--nextpage';
            if (   $p 
                 && false !== stripos( $p->post_content, $next ) 
                 && ! empty( $wp->query_vars['page'] ) 
            ) {
                $page = trim( $wp->query_vars['page'], '/' );
                $success = (int) $page <= ( substr_count( $p->post_content, $next ) + 1 );

                if ( $success )
                {
                    status_header( 200 );
                    $bool = true;
                }
            }
        }
        return $bool;
    }

} // end class

Installation : Erstellen Sie die /wp-content/plugins/content-pagination-titles/content-pagination-titles.phpDatei und aktivieren Sie das Plugin. Es ist immer eine gute Idee, ein Backup zu erstellen, bevor Sie ein Plugin testen.

Fehlt der obere Nextpage- Marker, ist der erste Paginierungstitel numerisch.

Auch wenn ein Titel für die Inhaltspaginierung fehlt, dh <!--nextpage-->, er wird erwartungsgemäß numerisch sein.

Ich habe zuerst den nextpage- Fehler in der WPKlasse vergessen, der angezeigt wird, wenn wir die Anzahl der Seiten über den content_paginationFilter ändern . Dies wurde kürzlich von @PieterGoosen hier in # 35562 gemeldet .

Wir versuchen , dass in unserer Demo - Plugin mit einem zu überwinden pre_handle_404Filter Rückruf, basierend auf der WPKlasse Check hier , wo wir überprüfen <!--nextpagestatt <!--nextpage-->.

Tests

Hier sind einige weitere Tests:

Test # 1

<!--nextpage-->
Let's talk about the Planets
<!--nextpage-->
Exotic Mercury
<!--nextpage-->
Beautiful Venus
<!--nextpage-->
Our Blue Earth
<!--nextpage-->
The Red Planet

Ausgang für 1 ausgewählt:

test1

wie erwartet.

Test # 2

Let's talk about the Planets
<!--nextpage-->
Exotic Mercury
<!--nextpage-->
Beautiful Venus
<!--nextpage-->
Our Blue Earth
<!--nextpage-->
The Red Planet

Ausgang für 5 ausgewählt:

test2

wie erwartet.

Test Nr. 3

<!--nextpage-->
Let's talk about the Planets
<!--nextpage Mercury-->
Exotic Mercury
<!--nextpage-->
Beautiful Venus
<!--nextpage Earth -->
Our Blue Earth
<!--nextpage Mars -->
The Red Planet

Ausgang für 3 ausgewählt:

test3

wie erwartet.

Test Nr. 4

Let's talk about the Planets
<!--nextpage Mercury-->
Exotic Mercury
<!--nextpage Venus-->
Beautiful Venus
<!--nextpage Earth -->
Our Blue Earth
<!--nextpage Mars -->
The Red Planet

Ausgang mit Erde ausgewählt:

test4

wie erwartet.

Alternativen

Eine andere Möglichkeit wäre, es so zu ändern, dass Paginierungstitel unterstützt werden, die hinzugefügt werden mit:

<!--pt Earth-->

Es kann auch nützlich sein, einen einzelnen Kommentar für alle Paginierungstitel ( Pkt ) zu unterstützen:

<!--pts Planets|Mercury|Venus|Earth|Mars -->

oder vielleicht über benutzerdefinierte Felder?

birgire
quelle
Das sieht interessant und recht dynamisch aus. ;-)
Pieter Goosen
+1 für Verschlusstechnik, vor) , dass ich wusste nur , dass wir begrenzt sind apply_filterArgumente: D
Sumit
1
Es kann nützlich sein, wenn Sie kurze Code-Schnipsel hier auf WPSE schreiben, aber wir könnten auch einfach eine Klasse schreiben, um dies in einem geeigneten Plugin zu unterstützen ;-) @Sumit
birgire
@PieterGoosen Ich habe zuerst den Fehler # 35562 vergessen und versucht, ihn über den pre_handle_404Filter anzupassen .
Birgire
@birgire Ich habe an dieses Problem gedacht, konnte aber nichts testen, um den Einfluss dieses Problems zu bestätigen oder zu ignorieren. Ich bin so mit anderen Projekten beschäftigt, die keinen PC erfordern. Es scheint, als würde der Fehler noch lange bestehen bleiben. Früher habe ich neue und alte Versionen getestet und bin zu dem Schluss gekommen, dass der Code, der den Fehler verursacht, aus dem Kern entfernt werden kann, bis jemand eine richtige Lösung findet ... ;-)
Pieter Goosen,
5

Sie können Filter verwenden wp_link_pages_link

Übergeben Sie zuerst unseren benutzerdefinierten Platzhalter für Zeichenfolgen (Dies kann alles sein, was Sie möchten, außer Zeichenfolgen, die enthalten %, die ich gerade verwende #custom_title#).

wp_link_pages( array( 'pagelink' => '#custom_title#' ) );

Dann fügen Sie unseren Filter hinzu functions.php. Erstellen Sie in der Rückruffunktion eine Reihe von Titeln, suchen Sie dann nach der aktuellen Seitennummer und ersetzen Sie sie #custom_title#durch den Wert, der der aktuellen Seitennummer entspricht.

Beispiel:-

add_filter('wp_link_pages_link', 'wp_link_pages_link_custom_title', 10, 2);
/**
 * Replace placeholder with custom titles
 * @param string $link Page link HTML
 * @param int $i Current page number
 * @return string $link Page link HTML
 */
function wp_link_pages_link_custom_title($link, $i) {

    //Define array of custom titles
    $custom_titles = array(
        __('Custom title A', 'text-domain'),
        __('Custom title B', 'text-domain'),
        __('Custom title C', 'text-domain'),
    );

    //Default title when title is not set in array
    $default_title = __('Page', 'text-domain') . ' ' . $i; 

    $i--; //Decrease the value by 1 because our array start with 0

    if (isset($custom_titles[$i])) { //Check if title exist in array if yes then replace it
        $link = str_replace('#custom_title#', $custom_titles[$i], $link);
    } else { //Replace with default title
        $link = str_replace('#custom_title#', $default_title, $link);
    }

    return $link;
}
Sumit
quelle