it-swarm.com.de

Wie gebe ich seitenweise Links einen benutzerdefinierten Titel?

Ich habe meinen Beitragsinhalt mit dem Code <! - nextpage -> 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? Ursache auf diesem Dokument https://codex.wordpress.org/Styling_Page-Links es erwähnt nur die Methode zum Hinzufügen von Suffixen oder Präfixen. Ich möchte einfach jeder ausgelagerten Nummer einen eigenen benutzerdefinierten Titel geben

13
Ruriko

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

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

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

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:

 Pagination titles 

Dies wurde unter dem Thema Twenty Sixteen getestet, bei dem ich das Auffüllen und das Breite ein wenig anpassen musste:

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

Demo-Plugin

Hier ist ein Demo-Plugin, das die Filter content_pagination, wp_link_pages_link, pre_handle_404 und wp_link_pages_args verwendet, um diese Erweiterung des Markers nächste Seite (PHP 5.4+ zu unterstützen:

<?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: Erstelle die /wp-content/plugins/content-pagination-titles/content-pagination-titles.php Datei und aktiviere das Plugin. Es ist immer eine gute Idee, ein Backup zu erstellen, bevor Sie ein Plugin testen.

Fehlt die oberste Markierung nächste Seite, ist der erste Seitentitel numerisch.

Auch wenn ein Titel der Inhaltspagination fehlt, d. H. <!--nextpage-->, ist er erwartungsgemäß numerisch.

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

Wir versuchen, dies in unserem Demo-Plugin mit einem pre_handle_404-Filter-Callback zu überwinden, der auf der WP-Klassenprüfung hier basiert, bei der wir nach <!--nextpage statt nach <!--nextpage--> suchen.

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

Ausgabe 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

Ausgabe für 5 ausgewählt:

 test2 

wie erwartet.

Test # 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

Ausgabe für 3 ausgewählt:

 test3 

wie erwartet.

Test # 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

Ausgabe 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 Seitentitel (pts) zu unterstützen:

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

oder vielleicht über benutzerdefinierte Felder?

17
birgire

Sie können den Filter wp_link_pages_link verwenden.

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

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

Dann fügen Sie unseren Filter in functions.php hinzu. Erstellen Sie in der Rückruffunktion eine Reihe von Titeln, suchen Sie nach der aktuellen Seitennummer und ersetzen 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;
}
5
Sumit