Đây là một cách để hỗ trợ tiêu đề phân trang theo mẫu:
<!--nextpage(.*?)?-->
một cách mô phỏng như cốt lõi hỗ trợ <!--more(.*?)?-->
.
Đây là một ví dụ:
<!--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
với đầu ra tương tự như:
Điều này đã được thử nghiệm trên chủ đề Twenty Sixteen , nơi tôi phải điều chỉnh phần đệm và chiều rộng một chút:
.page-links a, .page-links > span {
width: auto;
padding: 0 5px;
}
Plugin demo
Dưới đây là một bản demo plugin sử dụng content_pagination
, wp_link_pages_link
, pre_handle_404
và wp_link_pages_args
các bộ lọc để hỗ trợ extenstion này của Nextpage marker ( 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
Cài đặt : Tạo /wp-content/plugins/content-pagination-titles/content-pagination-titles.php
tập tin và kích hoạt plugin. Luôn luôn là một ý tưởng tốt để sao lưu trước khi thử nghiệm bất kỳ plugin nào.
Nếu đầu Nextpage marker là mất tích, sau đó tiêu đề pagination đầu tiên là số.
Ngoài ra, nếu một tiêu đề phân trang nội dung bị thiếu, tức là <!--nextpage-->
nó sẽ là số, đúng như mong đợi.
Đầu tiên tôi quên về Nextpage lỗi trong WP
lớp, mà show lên nếu chúng ta thay đổi số lượng các trang thông qua các content_pagination
bộ lọc. Điều này đã được báo cáo gần đây bởi @PieterGoosen tại đây trong # 35562 .
Chúng tôi cố gắng khắc phục điều đó trong plugin demo bằng một pre_handle_404
cuộc gọi lại bộ lọc, dựa trên WP
kiểm tra lớp ở đây , nơi chúng tôi kiểm tra <!--nextpage
thay vì <!--nextpage-->
.
Xét nghiệm
Dưới đây là một số thử nghiệm thêm:
Bài kiểm tra số 1
<!--nextpage-->
Let's talk about the Planets
<!--nextpage-->
Exotic Mercury
<!--nextpage-->
Beautiful Venus
<!--nextpage-->
Our Blue Earth
<!--nextpage-->
The Red Planet
Đầu ra cho 1 đã chọn:
như mong đợi.
Bài kiểm tra số 2
Let's talk about the Planets
<!--nextpage-->
Exotic Mercury
<!--nextpage-->
Beautiful Venus
<!--nextpage-->
Our Blue Earth
<!--nextpage-->
The Red Planet
Đầu ra cho 5 lựa chọn:
như mong đợi.
Bài kiểm tra số 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
Đầu ra cho 3 lựa chọn:
như mong đợi.
Bài kiểm tra số 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
Đầu ra với Trái đất được chọn:
như mong đợi.
Lựa chọn thay thế
Một cách khác là sửa đổi nó để hỗ trợ các tiêu đề phân trang được thêm vào:
<!--pt Earth-->
Nó cũng có thể hữu ích để hỗ trợ một nhận xét cho tất cả các tiêu đề phân trang ( pts ):
<!--pts Planets|Mercury|Venus|Earth|Mars -->
hoặc có lẽ thông qua các lĩnh vực tùy chỉnh?