Вот способ поддержать названия страниц в форме:
<!--nextpage(.*?)?-->
в то же время, как поддерживает ядро <!--more(.*?)?-->
.
Вот пример:
<!--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
с выводом, похожим на:
Это было протестировано на тему Twenty Sixteen , где мне пришлось немного отрегулировать отступы и ширину :
.page-links a, .page-links > span {
width: auto;
padding: 0 5px;
}
Демо-плагин
Вот демонстрационный плагин , который использует content_pagination
, wp_link_pages_link
, pre_handle_404
и wp_link_pages_args
фильтры , чтобы поддержать эту extenstion из СледующаяСтраницы маркеров ( 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
Установка : Создайте /wp-content/plugins/content-pagination-titles/content-pagination-titles.php
файл и активируйте плагин. Всегда хорошая идея сделать резервную копию перед тестированием любого плагина.
Если верхний маркер следующей страницы отсутствует, то первый заголовок нумерации страниц будет числовым.
Кроме того, если заголовок содержимого отсутствует, то есть <!--nextpage-->
он будет числовым, как и ожидалось.
Сначала я забыл об ошибке на следующей странице в WP
классе, которая появляется, если мы изменим количество страниц с помощью content_pagination
фильтра. Об этом недавно сообщил @PieterGoosen здесь, в # 35562 .
Мы пытаемся преодолеть это в нашем демонстрационном плагине с помощью pre_handle_404
обратного вызова фильтра, основанного на WP
проверке класса здесь , где мы проверяем <!--nextpage
вместо <!--nextpage-->
.
тесты
Вот еще несколько тестов:
Тест № 1
<!--nextpage-->
Let's talk about the Planets
<!--nextpage-->
Exotic Mercury
<!--nextpage-->
Beautiful Venus
<!--nextpage-->
Our Blue Earth
<!--nextpage-->
The Red Planet
Выход для 1 выбранного:
как и ожидалось.
Тест № 2
Let's talk about the Planets
<!--nextpage-->
Exotic Mercury
<!--nextpage-->
Beautiful Venus
<!--nextpage-->
Our Blue Earth
<!--nextpage-->
The Red Planet
Выход для 5 выбран:
как и ожидалось.
Тест № 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
Выход для 3 выбран:
как и ожидалось.
Тест № 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
Выход с выбранной Землей :
как и ожидалось.
альтернативы
Другим способом было бы изменить его для поддержки заголовков нумерации страниц, которые будут добавлены с помощью:
<!--pt Earth-->
Также может быть полезно поддерживать один комментарий для всех заголовков нумерации страниц ( pts ):
<!--pts Planets|Mercury|Venus|Earth|Mars -->
или возможно через настраиваемые поля?
apply_filter
аргументами: Dpre_handle_404
фильтр.Вы можете использовать фильтр
wp_link_pages_link
Сначала передайте нашу пользовательскую строку-заполнитель (это может быть что угодно, кроме строки, содержащей
%
только что, пока я использую#custom_title#
).Затем добавьте наш фильтр
functions.php
. В функции обратного вызова создайте массив заголовков, затем проверьте номер текущей страницы и замените ее#custom_title#
значением, соответствующим номеру текущей страницы.Пример:-
источник