Làm thế nào để cung cấp liên kết tùy chỉnh tiêu đề?


14

Tôi đã chia nội dung bài đăng của mình thành các trang đa dạng bằng cách sử dụng <! - nextpage ->mã. Tôi muốn cung cấp cho các liên kết phân trang của mình tiêu đề của riêng họ thay vì 1,2,3 thông thường. Tôi có thể làm cái này như thế nào? nguyên nhân trên tài liệu này https://codex.wordpress.org/Styling_Page-Links nó chỉ đề cập đến phương pháp để thêm hậu tố hoặc tiền tố. Tôi chỉ muốn cung cấp cho mỗi số phân trang tiêu đề tùy chỉnh riêng của họ

Câu trả lời:


17

Đây là một cách để hỗ trợ tiêu đề phân trang theo mẫu:

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

một cách mô phỏng như cốt lõi hỗ trợ <!--more(.*?)?-->.

Đây là một ví dụ:

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

với đầu ra tương tự như:

Tiêu đề chiếu

Điều này đã được thử nghiệm trên chủ đề Twenty Sixteen , nơi tôi phải điều chỉnh phần đệmchiều rộng một chút:

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

Plugin demo

Dưới đây là một bản demo plugin sử dụng content_pagination, wp_link_pages_link, pre_handle_404wp_link_pages_argscác bộ lọc để hỗ trợ extenstion này của Nextpage marker ( 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

Cài đặt : Tạo /wp-content/plugins/content-pagination-titles/content-pagination-titles.phptập tin và kích hoạt plugin. Luôn luôn là một ý tưởng tốt để sao lưu trước khi thử nghiệm bất kỳ plugin nào.

Nếu đầu Nextpage marker là mất tích, sau đó tiêu đề pagination đầu tiên là số.

Ngoài ra, nếu một tiêu đề phân trang nội dung bị thiếu, tức là <!--nextpage-->nó sẽ là số, đúng như mong đợi.

Đầu tiên tôi quên về Nextpage lỗi trong WPlớp, mà show lên nếu chúng ta thay đổi số lượng các trang thông qua các content_paginationbộ lọc. Điều này đã được báo cáo gần đây bởi @PieterGoosen tại đây trong # 35562 .

Chúng tôi cố gắng khắc phục điều đó trong plugin demo bằng một pre_handle_404cuộc gọi lại bộ lọc, dựa trên WPkiểm tra lớp ở đây , nơi chúng tôi kiểm tra <!--nextpagethay vì <!--nextpage-->.

Xét nghiệm

Dưới đây là một số thử nghiệm thêm:

Bài kiểm tra số 1

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

Đầu ra cho 1 đã chọn:

kiểm tra1

như mong đợi.

Bài kiểm tra số 2

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

Đầu ra cho 5 lựa chọn:

kiểm tra2

như mong đợi.

Bài kiểm tra số 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

Đầu ra cho 3 lựa chọn:

kiểm tra3

như mong đợi.

Bài kiểm tra số 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

Đầu ra với Trái đất được chọn:

kiểm tra4

như mong đợi.

Lựa chọn thay thế

Một cách khác là sửa đổi nó để hỗ trợ các tiêu đề phân trang được thêm vào:

<!--pt Earth-->

Nó cũng có thể hữu ích để hỗ trợ một nhận xét cho tất cả các tiêu đề phân trang ( pts ):

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

hoặc có lẽ thông qua các lĩnh vực tùy chỉnh?


Điều này có vẻ thú vị và khá năng động. ;-)
Pieter Goosen

+1 cho kỹ thuật đóng;) Trước đó tôi chỉ biết rằng chúng tôi bị giới hạn trong các apply_filterđối số: D
Sumit

1
Nó có thể hữu ích khi viết đoạn mã ngắn ở đây trên WPSE, nhưng chúng tôi cũng có thể viết một lớp để hỗ trợ điều này trong một plugin thích hợp ;-) @Sumit
birgire

@PieterGoosen Lần đầu tiên tôi quên về lỗi # 35562 , đã cố gắng điều chỉnh nó thông qua pre_handle_404bộ lọc.
bạch dương

@birgire Tôi nghĩ về vấn đề đó, nhưng không thể kiểm tra bất cứ điều gì để xác nhận hoặc coi nhẹ ảnh hưởng của vấn đề đó, tôi đã bị cuốn theo các dự án khác không cần máy tính. Có vẻ như lỗi sẽ tồn tại trong một thời gian dài. Trước đây tôi đã thử nghiệm trên các phiên bản mới và cũ và kết luận của tôi là mã gây ra lỗi có thể được gỡ bỏ khỏi lõi cho đến khi ai đó tìm ra giải pháp thích hợp ... ;-)
Pieter Goosen

5

Bạn có thể sử dụng bộ lọc wp_link_pages_link

Trước tiên, vượt qua trình giữ chỗ chuỗi tùy chỉnh của chúng tôi (Đây có thể là bất cứ điều gì bạn thích ngoại trừ chuỗi chứa %, chỉ bây giờ tôi đang sử dụng #custom_title#).

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

Sau đó thêm bộ lọc của chúng tôi vào functions.php. Trong hàm gọi lại, tạo một mảng các tiêu đề, sau đó kiểm tra số trang hiện tại và thay thế #custom_title#bằng giá trị tương ứng với số trang hiện tại.

Thí dụ:-

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;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.