Come assegnare un titolo personalizzato ai link paginati?


14

Ho diviso il contenuto dei miei post in più pagine usando il <! - nextpage ->codice. Voglio dare ai miei link impaginati il ​​loro titolo invece dei normali 1,2,3. Come posso fare questo? causa su questo documento https://codex.wordpress.org/Styling_Page-Links menziona solo il metodo per aggiungere suffisso o prefisso. Voglio solo assegnare a ciascun numero di paging il proprio titolo personalizzato

Risposte:


17

Ecco un modo per supportare i titoli di impaginazione del modulo:

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

in modo semplice come supporta il core <!--more(.*?)?-->.

Ecco un esempio:

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

con un output simile a:

Titoli di impaginazione

Questo è stato testato sul tema Twenty Sixteen , dove ho dovuto regolare un po ' l' imbottitura e la larghezza :

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

Plugin demo

Ecco una demo plugin che utilizza i content_pagination, wp_link_pages_link, pre_handle_404e wp_link_pages_argsfiltri per sostenere questo extenstion del nextpage marcatore ( 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

Installazione : crea il /wp-content/plugins/content-pagination-titles/content-pagination-titles.phpfile e attiva il plugin. Sempre una buona idea fare il backup prima di testare qualsiasi plugin.

Se la parte superiore nextpage marker è mancante, quindi il primo titolo impaginazione è numerico.

Inoltre, se manca un titolo di impaginazione del contenuto, ovvero <!--nextpage-->, sarà numerico, proprio come previsto.

Ho dimenticato il nextpage bug nel WPcodice categoria, che si presenta se si modificano il numero di pagine tramite il content_paginationfiltro. Questo è stato recentemente riportato da @PieterGoosen qui in # 35562 .

Cerchiamo di superarlo nel nostro plugin demo con un pre_handle_404callback di filtro, basato sul WPcontrollo di classe qui , dove controlliamo <!--nextpageinvece di <!--nextpage-->.

test

Ecco alcuni altri test:

Test n. 1

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

Uscita per 1 selezionato:

test1

come previsto.

Test n. 2

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

Uscita per 5 selezionati:

test2

come previsto.

Test n. 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

Uscita per 3 selezionati:

test3

come previsto.

Test n. 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

Uscita con Terra selezionata:

test4

come previsto.

alternative

Un altro modo sarebbe modificarlo per supportare i titoli di impaginazione da aggiungere con:

<!--pt Earth-->

Potrebbe anche essere utile supportare un singolo commento per tutti i titoli di paginazione ( punti ):

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

o forse tramite campi personalizzati?


Sembra interessante e abbastanza dinamico. ;-)
Pieter Goosen

+1 per la tecnica di chiusura;) Prima di allora sapevo solo che ci siamo limitati agli apply_filterargomenti: D
Sumit,

1
Può essere utile quando si scrivono frammenti di codice funzione qui su WPSE, ma potremmo anche scrivere una lezione per supportarlo in un plugin appropriato ;-) @Sumit
birgire

@PieterGoosen Ho dimenticato per la prima volta il bug # 35562 , ho provato a regolarlo tramite il pre_handle_404filtro.
birgire,

@birgire Ho pensato a quel problema, ma non sono riuscito a testare nulla per confermare o ignorare l'influenza di quel problema, sono così preso da altri progetti che non richiedono un pc. Sembra che il bug rimarrà per molto tempo. In precedenza ho fatto test su versioni vecchie e nuove e le mie conclusioni sono che il codice che causa l'errore può essere rimosso dal core fino a quando qualcuno non trova una soluzione adeguata ... ;-)
Pieter Goosen,

5

Puoi usare il filtro wp_link_pages_link

Per prima cosa passa il nostro segnaposto di stringa personalizzato (questo può essere qualsiasi cosa ti piaccia tranne la stringa contenente %, solo per ora che sto usando #custom_title#).

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

Quindi aggiungi il nostro filtro functions.php. Nella funzione di richiamata creare una matrice di titoli, quindi verificare il numero di pagina corrente e sostituirlo #custom_title#con il valore corrispondente al numero di pagina corrente.

Esempio:-

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;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.