web-dev-qa-db-fra.com

Comment donner un titre personnalisé aux liens paginés?

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é

13
Ruriko

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 à:

 Pagination titles 

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;
}

Plugin de démonstration

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 &lt;!--nextpage(.*?)?--&gt; 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-->.

Des tests

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é:

 test1 

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é:

 test2 

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é:

 test3 

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é:

 test4 

comme prévu.

Des alternatives

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?

17
birgire

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;
}
5
Sumit