จะให้ชื่อที่กำหนดเองของลิงก์บนเพจได้อย่างไร


14

ฉันแบ่งเนื้อหาโพสต์ของฉันออกเป็นหลายหน้าโดยใช้ <! - nextpage ->รหัส ฉันต้องการให้เพจของฉันเชื่อมโยงชื่อของพวกเขาแทนที่จะเป็น 1,2,3 ปกติ ฉันจะทำสิ่งนี้ได้อย่างไร ทำให้เกิดในเอกสารนี้https://codex.wordpress.org/Styling_Page-Linksเพียงกล่าวถึงวิธีการที่จะเพิ่มคำต่อท้ายหรือคำนำหน้า ฉันแค่ต้องการให้ชื่อเพจที่กำหนดเองของแต่ละหมายเลข

คำตอบ:


17

นี่คือวิธีในการสนับสนุนการแบ่งหน้าชื่อของแบบฟอร์ม:

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

ในทางที่เป็น simlar <!--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ฟิลเตอร์เพื่อสนับสนุนการต่อจากนี้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

การติดตั้ง : สร้าง/wp-content/plugins/content-pagination-titles/content-pagination-titles.phpไฟล์และเปิดใช้งานปลั๊กอิน ควรสำรองข้อมูลไว้เสมอก่อนทดสอบปลั๊กอินใด ๆ

ถ้าด้านบนnextpageเครื่องหมายจะหายไปแล้วชื่อเลขหน้าแรกคือตัวเลข

นอกจากนี้หากชื่อเรื่องการแบ่งหน้าเนื้อหาขาดหายไปเช่น<!--nextpage-->นั้นจะเป็นตัวเลขตามที่คาดไว้

ฉันลืมเกี่ยวกับข้อผิดพลาดหน้าถัดไปในWPชั้นเรียนซึ่งจะปรากฏขึ้นหากเราแก้ไขจำนวนหน้าผ่านcontent_paginationตัวกรอง นี่คือการรายงานเมื่อเร็ว ๆ นี้โดย @PieterGoosen ที่นี่ใน# 35562

เราพยายามที่จะเอาชนะในปลั๊กอินสาธิตของเราด้วยpre_handle_404การเรียกกลับกรองขึ้นอยู่กับWPการตรวจสอบชั้นที่นี่ที่เราตรวจสอบแทน<!--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 ที่เลือก:

test1

อย่างที่คาดไว้.

ทดสอบ # 2

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

เอาต์พุตสำหรับ5 ที่เลือก:

test2

อย่างที่คาดไว้.

ทดสอบ # 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 ที่เลือก:

test3

อย่างที่คาดไว้.

ทดสอบ # 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

เอาท์พุทกับโลกที่เลือก:

test4

อย่างที่คาดไว้.

ทางเลือก

อีกวิธีหนึ่งก็คือการปรับเปลี่ยนเพื่อรองรับชื่อเรื่องที่จะเพิ่มด้วย:

<!--pt Earth-->

มันอาจจะมีประโยชน์ในการสนับสนุนความคิดเห็นเดียวสำหรับทุกหัวข้อ ( pts ):

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

หรืออาจจะผ่านเขตข้อมูลที่กำหนดเอง?


มันดูน่าสนใจและมีพลังมาก ;-)
Pieter Goosen

+1 สำหรับเทคนิคการปิด;) ก่อนหน้านั้นฉันเพิ่งรู้ว่าเราถูก จำกัด การapply_filterขัดแย้ง: D
Sumit

1
มันจะมีประโยชน์เมื่อเขียนโค้ดสั้น ๆ ที่นี่ใน WPSE แต่เราสามารถเขียนคลาสเพื่อสนับสนุนสิ่งนี้ในปลั๊กอินที่เหมาะสม ;-) @Sumit
birgire

@PieterGoosen ฉันลืมเรื่องข้อผิดพลาด# 35562เป็นอันดับแรกพยายามปรับผ่านpre_handle_404ตัวกรอง
Birgire

@ Birgire ฉันคิดว่าปัญหานั้น แต่ไม่สามารถทดสอบอะไรก็ได้ที่จะยืนยันหรือไม่สนใจอิทธิพลของปัญหานั้นฉันกำลังตามติดโครงการอื่น ๆ ที่ไม่ต้องใช้พีซี ดูเหมือนว่าข้อผิดพลาดจะยังคงอยู่เป็นเวลานาน ก่อนหน้านี้ฉันทำการทดสอบทั้งรุ่นเก่าและใหม่และข้อสรุปของฉันคือรหัสที่ทำให้เกิดข้อผิดพลาดสามารถลบออกจากแกนจนกว่าจะมีคนหาทางออกที่เหมาะสม ... ;-)
Pieter Goosen

5

คุณสามารถใช้ตัวกรอง 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;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.