Sayfalı bağlantılara özel başlık nasıl verilir?


14

Yazı içeriğimi <! - nextpage ->kodu kullanarak birden fazla sayfaya böldüm . Sayfalandırılmış linklerime normal 1,2,3 yerine kendi unvanlarını vermek istiyorum. Bunu nasıl yapabilirim? Bu dokümanda neden https://codex.wordpress.org/Styling_Page-Links yalnızca son ek veya önek ekleme yönteminden bahseder. Sadece her sayfa numarasına kendi özel unvanını vermek istiyorum

Yanıtlar:


17

Formun sayfalandırma başlıklarını desteklemenin bir yolu:

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

çekirdeğin desteklediği gibi basit bir şekilde <!--more(.*?)?-->.

İşte bir örnek:

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

çıktı benzer:

Sayfalandırma başlıkları

Bu, dolgu ve genişliği biraz ayarlamak zorunda kaldım Yirmi Onaltı temasında test edildi :

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

Demo eklentisi

İşte demo eklenti kullanan var content_pagination, wp_link_pages_link, pre_handle_404ve wp_link_pages_argsbu extenstion desteklemek için filtreleri nextpage işaretleyici ( 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

Kurulum : /wp-content/plugins/content-pagination-titles/content-pagination-titles.phpDosyayı oluşturun ve eklentiyi etkinleştirin. Herhangi bir eklentiyi test etmeden önce yedekleme yapmak her zaman iyi bir fikirdir.

Üst Eğer nextpage işaret eksik, daha sonra ilk hizalama başlık sayısal olduğunu.

Ayrıca bir içerik sayfalama başlığı eksikse, yani <!--nextpage-->beklendiği gibi sayısal olur.

Ben ilk unuttuk nextpage içinde hata WPgösterir yukarı biz yoluyla sayfa sayısını değiştirirseniz bu, sınıf content_paginationfiltresi. Bu yakın zamanda @PieterGoosen tarafından # 35562'de bildirildi .

Biz bizim demo eklentisi o aşmak için deneyin pre_handle_404dayalı filtre geri arama WPsınıf kontrolü burada biz kontrol, <!--nextpageyerine <!--nextpage-->.

Testler

İşte bazı ek testler:

Test # 1

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

Seçilen 1 için çıkış :

test1

beklenildiği gibi.

Test # 2

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

Seçilen 5 için çıkış :

dnm2

beklenildiği gibi.

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

Seçilen 3 için çıkış :

test3

beklenildiği gibi.

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

İle Çıktı Dünya'da seçilmiş:

test4

beklenildiği gibi.

Alternatifler

Başka bir yol, eklenecek sayfalandırma başlıklarını destekleyecek şekilde değiştirmektir:

<!--pt Earth-->

Tüm sayfalandırma başlıkları ( puanlar ) için tek bir yorumu desteklemek de kullanışlı olabilir :

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

veya özel alanlar üzerinden mi?


Bu ilginç ve oldukça dinamik görünüyor. ;-)
Pieter Goosen

Kapatma tekniği için +1;) Bundan önce sadece apply_filterargümanlarla sınırlı olduğumuzu biliyordum : D
Sumit

1
Burada WPSE'de kısa kod parçacıkları yazarken kullanışlı olabilir, ancak bunu uygun bir eklentide desteklemek için bir sınıf da yazabiliriz ;-) @Sumit
birgire

@PieterGoosen İlk olarak # 35562 hatasını unuttum , pre_handle_404filtre aracılığıyla ayarlamaya çalıştım .
birgire

@birgire Bu konuyu düşündüm, ancak konunun etkisini onaylamak veya göz ardı etmek için hiçbir şey test edemedim, bir pc gerektirmeyen diğer projelere çok yakalandım. Böcek uzun süre kalacak gibi görünüyor. Daha önce yeni ve eski sürümlerde test yaptım ve sonuçlarım, hataya neden olan kodun birisi uygun bir çözüm bulana kadar çekirdekten çıkarılabileceği ... ;-)
Pieter Goosen

5

Filtre kullanabilirsiniz wp_link_pages_link

Önce bizim özel dize yer tutucumuzu geçmek (Bu %sadece şimdilik kullanıyorum, dize içeren dışında istediğiniz herhangi bir şey olabilir #custom_title#).

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

Ardından filtremizi ekleyin functions.php. Geri arama işlevinde bir başlık dizisi yapın, ardından geçerli sayfa numarasını kontrol edin ve geçerli sayfa numarasına #custom_title#karşılık gelen değerle değiştirin .

Misal:-

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;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.