我已使用<! - nextpage ->
代码将帖子内容分成多个页面 。我想给我的分页链接起自己的标题,而不是常规的1,2,3。我怎样才能做到这一点?造成此文档https://codex.wordpress.org/Styling_Page-Links的原因,它仅提及添加后缀或前缀的方法。我只想给每个分页的号码自己的自定义标题
我已使用<! - nextpage ->
代码将帖子内容分成多个页面 。我想给我的分页链接起自己的标题,而不是常规的1,2,3。我怎样才能做到这一点?造成此文档https://codex.wordpress.org/Styling_Page-Links的原因,它仅提及添加后缀或前缀的方法。我只想给每个分页的号码自己的自定义标题
Answers:
这是支持以下形式的分页标题的方法:
<!--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
输出类似于:
这在“ 二十一十六”主题上进行了测试,我不得不在其中调整一下填充和宽度:
.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
class check(而不是)的过滤器回调来克服该问题。<!--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
参数:d
您可以使用过滤器 wp_link_pages_link
首先传递我们的自定义字符串占位符(这可以是您喜欢的任何东西,但字符串包含%
,我现在才使用#custom_title#
)。
wp_link_pages( array( 'pagelink' => '#custom_title#' ) );
然后在中添加我们的过滤器functions.php
。在回调函数中,创建一个标题数组,然后检查当前页码,并替换为与当前页码#custom_title#
相对应的值。
例:-
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;
}