Jak nadać niestandardowy tytuł linkom stronicowanym?

14

Za pomocą <! - nextpage ->kodu podzieliłem treść postu na wiele stron . Chcę nadać moim stronicowanym linkom własny tytuł zamiast zwykłego 1,2,3. W jaki sposób mogę to zrobić? ponieważ w tym dokumencie https://codex.wordpress.org/Styling_Page-Links wspomina tylko o metodzie dodawania sufiksu lub prefiksu. Chcę tylko nadać każdemu stronicowanemu numerowi własny tytuł

Ruriko
źródło

Odpowiedzi:

17

Oto sposób obsługi tytułów paginacji formularza:

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

w prosty sposób, jak obsługuje rdzeń <!--more(.*?)?-->.

Oto przykład:

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

o wydajności podobnej do:

Tytuły paginacji

Zostało to przetestowane na motywie Twenty Sixteen , w którym musiałem nieco dopasować wypełnienie i szerokość :

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

Wtyczka demonstracyjna

Oto demo plugin, który wykorzystuje content_pagination, wp_link_pages_link, pre_handle_404i wp_link_pages_argsfiltry do wspierania tego extenstion z nextpage markera ( 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

Instalacja : Utwórz /wp-content/plugins/content-pagination-titles/content-pagination-titles.phpplik i aktywuj wtyczkę. Zawsze dobrym pomysłem jest wykonanie kopii zapasowej przed przetestowaniem dowolnej wtyczki.

Jeśli brakuje górnego znacznika następnej strony, pierwszy tytuł paginacji jest numeryczny.

Również jeśli brakuje tytułu paginacji treści, tzn <!--nextpage-->. Będzie on numeryczny, zgodnie z oczekiwaniami.

Najpierw zapomniałem o błędzie następnej strony w WPklasie, który pojawia się, jeśli zmodyfikujemy liczbę stron za pomocą content_paginationfiltra. Zostało to niedawno zgłoszone przez @PieterGoosen tutaj w # 35562 .

Staramy się to przezwyciężyć w naszej wtyczce demo z pre_handle_404wywołaniem zwrotnym filtra, opartym na WPsprawdzeniu klasy tutaj , gdzie sprawdzamy <!--nextpagezamiast <!--nextpage-->.

Testy

Oto kilka dalszych testów:

Test nr 1

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

Wyjście dla 1 wybranych:

test1

zgodnie z oczekiwaniami.

Test nr 2

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

Wyjście dla 5 wybranych:

test2

zgodnie z oczekiwaniami.

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

Wyjście dla 3 wybranych:

test3

zgodnie z oczekiwaniami.

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

Wyjście z wybraną Ziemią :

test4

zgodnie z oczekiwaniami.

Alternatywy

Innym sposobem może być zmodyfikowanie go w celu obsługi tytułów stronicowania, które zostaną dodane do:

<!--pt Earth-->

Przydatne może być także wsparcie jednego komentarza dla wszystkich tytułów stronicowania ( pts ):

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

a może poprzez niestandardowe pola?

birgire
źródło
To wygląda interesująco i dość dynamicznie. ;-)
Pieter Goosen
+1 za technikę zamknięcia;) Wcześniej wiedziałem tylko, że ograniczamy się do apply_filterargumentów: D
Sumit
1
Może to być przydatne podczas pisania krótkich fragmentów kodu tutaj na WPSE, ale moglibyśmy również napisać klasę, aby obsługiwać to we właściwej wtyczce ;-) @Sumit
birgire
@PieterGoosen Najpierw zapomniałem o błędzie # 35562 , próbowałem go wyregulować przez pre_handle_404filtr.
birgire,
@ Birgire Myślałem o tym problemie, ale nie mogłem nic przetestować, aby potwierdzić lub zignorować wpływ tego problemu, jestem tak pochłonięty innymi projektami, które nie wymagają komputera. Wygląda na to, że błąd pozostanie przez długi czas. Wcześniej testowałem na nowych i starych wersjach, a moje wnioski są takie, że kod powodujący błąd można usunąć z rdzenia, dopóki ktoś nie znajdzie odpowiedniego rozwiązania ... ;-)
Pieter Goosen
5

Możesz użyć filtra wp_link_pages_link

Najpierw przekaż nasz niestandardowy symbol zastępczy ciągów (może to być dowolny element oprócz ciągów zawierających %, na razie używam #custom_title#).

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

Następnie dodaj nasz filtr functions.php. W funkcji wywołania zwrotnego utwórz tablicę tytułów, a następnie sprawdź bieżący numer strony i zastąp #custom_title#go wartością odpowiadającą bieżącemu numerowi strony.

Przykład:-

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
źródło