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:
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_404
i wp_link_pages_args
filtry do wspierania tego extenstion z nextpage markera ( PHP 5.4+ ):
<?php
/**
* Plugin Name: Content Pagination Titles
* Description: Support for <!--nextpage(.*?)?--> 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.php
plik 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 WP
klasie, który pojawia się, jeśli zmodyfikujemy liczbę stron za pomocą content_pagination
filtra. Zostało to niedawno zgłoszone przez @PieterGoosen tutaj w # 35562 .
Staramy się to przezwyciężyć w naszej wtyczce demo z pre_handle_404
wywołaniem zwrotnym filtra, opartym na WP
sprawdzeniu klasy tutaj , gdzie sprawdzamy <!--nextpage
zamiast <!--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:
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:
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:
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ą :
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?
apply_filter
argumentów: Dpre_handle_404
filtr.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#
).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:-
źródło