J'ai divisé le contenu de mon message en plusieurs pages à l'aide du code <! - nextpage ->
. Je veux donner à mes liens paginés leur propre titre au lieu du 1,2,3 habituel. Comment puis-je faire ceci? cause sur cette doc https://codex.wordpress.org/Styling_Page-Links il mentionne uniquement la méthode pour ajouter un suffixe ou un préfixe. Je veux juste donner à chaque numéro paginé leur propre titre personnalisé
Voici un moyen de prendre en charge les titres de pagination du formulaire:
<!--nextpage(.*?)?-->
de la même manière que le noyau prend en charge <!--more(.*?)?-->
.
Voici un exemple:
<!--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
avec une sortie similaire à:
Cela a été testé sur le thème Twenty Sixteen, où je devais ajuster un peu les padding et width:
.page-links a, .page-links > span {
width: auto;
padding: 0 5px;
}
Voici un plugin de démonstration utilisant les filtres content_pagination
, wp_link_pages_link
, pre_handle_404
et wp_link_pages_args
pour supporter cette extension du marqueur nextpage (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
Installation: Créez le fichier /wp-content/plugins/content-pagination-titles/content-pagination-titles.php
et activez le plug-in. Toujours une bonne idée de sauvegarder avant de tester un plugin.
Si le marqueur supérieur page suivante est manquant, le titre de la première pagination est numérique.
De même, si un titre de pagination de contenu est manquant, c'est-à-dire <!--nextpage-->
, il sera numérique, comme prévu.
J'ai d'abord oublié le bogue nextpage dans la classe WP
, qui apparaît si nous modifions le nombre de pages via le filtre content_pagination
. Ceci a été récemment rapporté par @PieterGoosen ici dans # 35562 .
Nous essayons de résoudre ce problème dans notre plug-in de démonstration avec un rappel de filtre pre_handle_404
, basé sur la classe WP
check here , où nous vérifions <!--nextpage
au lieu de <!--nextpage-->
.
Voici quelques tests supplémentaires:
Test n ° 1
<!--nextpage-->
Let's talk about the Planets
<!--nextpage-->
Exotic Mercury
<!--nextpage-->
Beautiful Venus
<!--nextpage-->
Our Blue Earth
<!--nextpage-->
The Red Planet
Sortie pour 1 sélectionné:
comme prévu.
Test n ° 2
Let's talk about the Planets
<!--nextpage-->
Exotic Mercury
<!--nextpage-->
Beautiful Venus
<!--nextpage-->
Our Blue Earth
<!--nextpage-->
The Red Planet
Sortie pour 5 sélectionné:
comme prévu.
Test n ° 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
Sortie pour 3 sélectionné:
comme prévu.
Test n ° 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
Sortie avec Terre sélectionné:
comme prévu.
Une autre façon serait de le modifier pour que les titres de pagination soient ajoutés avec:
<!--pt Earth-->
Il peut également être utile de prendre en charge un seul commentaire pour tous les titres de pagination (pts):
<!--pts Planets|Mercury|Venus|Earth|Mars -->
ou peut-être via des champs personnalisés?
Vous pouvez utiliser le filtre wp_link_pages_link
Passez d’abord notre espace réservé pour la chaîne personnalisée (vous pouvez utiliser ce que vous voulez sauf une chaîne contenant %
, pour le moment j’utilise #custom_title#
).
wp_link_pages( array( 'pagelink' => '#custom_title#' ) );
Ajoutez ensuite notre filtre dans functions.php
. Dans la fonction de rappel, créez un tableau de titres, puis recherchez le numéro de page actuel et remplacez #custom_title#
par la valeur correspondant au numéro de page actuel.
Exemple:-
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;
}