Bagaimana cara memberi judul khusus tautan halaman?

14

Saya telah membagi konten posting saya menjadi beberapa halaman menggunakan <! - nextpage ->kode. Saya ingin memberi tautan paginasi saya judul mereka sendiri, bukannya 1,2,3 biasa. Bagaimana saya bisa melakukan ini? sebab pada dokumen ini https://codex.wordpress.org/Styling_Page-Links itu hanya menyebutkan metode untuk menambahkan akhiran atau awalan. Saya hanya ingin memberi masing-masing nomor halaman judul kustom mereka sendiri

Ruriko
sumber

Jawaban:

17

Berikut cara untuk mendukung judul pagination dalam formulir:

<!--nextpage(.*?)?--> 

dengan cara simlar sebagai inti mendukung <!--more(.*?)?-->.

Ini sebuah contoh:

<!--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

dengan output yang mirip dengan:

Judul pagination

Ini diuji pada tema Twenty Sixteen , di mana saya harus menyesuaikan bantalan dan lebar sedikit:

.page-links a, .page-links > span {
    width:   auto;
    padding: 0 5px;
}

Plugin demo

Berikut adalah demo plugin yang menggunakan content_pagination, wp_link_pages_link, pre_handle_404dan wp_link_pages_argsfilter untuk mendukung extenstion ini dari nextpage penanda ( 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

Instalasi : Buat/wp-content/plugins/content-pagination-titles/content-pagination-titles.php file dan aktifkan plugin. Selalu ide yang baik untuk membuat cadangan sebelum menguji plugin apa pun.

Jika penanda halaman berikutnya atas hilang, maka judul pagination pertama adalah numerik.

Juga jika judul pagination konten hilang, yaitu <!--nextpage-->, maka itu akan numerik, seperti yang diharapkan.

Saya pertama kali lupa tentang bug halaman berikutnya di WPkelas, yang muncul jika kita mengubah jumlah halaman melalui content_paginationfilter. Ini baru-baru ini dilaporkan oleh @PieterGoosen di sini di # 35562 .

Kami mencoba mengatasinya di plugin demo kami dengan pre_handle_404panggilan balik filter, berdasarkan WPpemeriksaan kelas di sini , di mana kami memeriksa <!--nextpagealih - alih <!--nextpage-->.

Tes

Berikut ini beberapa tes lebih lanjut:

Tes # 1

<!--nextpage-->
Let's talk about the Planets
<!--nextpage-->
Exotic Mercury
<!--nextpage-->
Beautiful Venus
<!--nextpage-->
Our Blue Earth
<!--nextpage-->
The Red Planet

Output untuk 1 dipilih:

test1

seperti yang diharapkan.

Tes # 2

Let's talk about the Planets
<!--nextpage-->
Exotic Mercury
<!--nextpage-->
Beautiful Venus
<!--nextpage-->
Our Blue Earth
<!--nextpage-->
The Red Planet

Output untuk 5 dipilih:

test2

seperti yang diharapkan.

Tes # 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

Output untuk 3 dipilih:

test3

seperti yang diharapkan.

Tes # 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

Output dengan Earth dipilih:

test4

seperti yang diharapkan.

Alternatif

Cara lain adalah memodifikasinya untuk mendukung judul halaman yang akan ditambahkan dengan:

<!--pt Earth-->

Mungkin juga berguna untuk mendukung satu komentar untuk semua judul halaman ( poin ):

<!--pts Planets|Mercury|Venus|Earth|Mars -->

atau mungkin melalui bidang khusus?

birgire
sumber
Ini terlihat menarik dan cukup dinamis. ;-)
Pieter Goosen
+1 untuk teknik penutupan;) Sebelumnya saya hanya tahu bahwa kita terbatas pada apply_filterargumen: D
Sumit
1
Mungkin berguna ketika menulis cuplikan kode pendek di sini di WPSE, tetapi kita juga bisa menulis kelas untuk mendukung ini dalam plugin yang tepat ;-) @Sumit
birgire
@PieterGoosen Saya pertama kali lupa tentang bug # 35562 , mencoba menyesuaikannya melalui pre_handle_404filter.
birgire
@ Borgire Saya memikirkan masalah itu, tetapi tidak dapat menguji apa pun untuk mengonfirmasi atau mengabaikan pengaruh masalah itu, saya sangat terjebak dengan proyek lain yang tidak memerlukan pc. Sepertinya bug akan tetap untuk waktu yang lama. Saya sebelumnya melakukan pengujian pada versi baru dan lama, dan kesimpulan saya adalah bahwa kode yang menyebabkan bug dapat dihapus dari inti sampai seseorang menemukan solusi yang tepat ... ;-)
Pieter Goosen
5

Anda bisa menggunakan filter wp_link_pages_link

Pertama, lewati placeholder string khusus kami (Ini bisa apa saja yang Anda suka kecuali string yang berisi %, hanya untuk saat ini saya menggunakan #custom_title#).

wp_link_pages( array( 'pagelink' => '#custom_title#' ) );

Kemudian tambahkan filter kami functions.php. Dalam fungsi panggilan balik buatlah array judul kemudian periksa nomor halaman saat ini dan ganti #custom_title#dengan nilai yang sesuai dengan nomor halaman saat ini.

Contoh:-

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