페이지 링크 사용자 정의 제목을 제공하는 방법?


14

<! - nextpage ->코드를 사용하여 게시물 내용을 여러 페이지로 분할했습니다 . 페이지 매김 링크에 일반 1,2,3 대신 자체 제목을 지정하고 싶습니다. 어떻게해야합니까? 이 문서의 원인 https://codex.wordpress.org/Styling_Page-Links 에는 접미사 또는 접두사를 추가하는 방법 만 언급되어 있습니다. 각 페이지 번호에 고유 한 제목을 지정하고 싶습니다.

답변:


17

양식의 페이지 매김 제목을 지원하는 방법은 다음과 같습니다.

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

코어가 지원하는 것과 비슷한 방식으로 <!--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

다음과 비슷한 출력으로 :

페이지 매김 제목

이것은 Twenty Sixteen 테마 에서 테스트되었으며 패딩너비 를 약간 조정해야했습니다 .

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

데모 플러그인

여기에 데모 플러그인 사용하는의 content_pagination, wp_link_pages_link, pre_handle_404wp_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--> 예상대로) 숫자가됩니다.

내가 먼저 잊어 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 나는 그 문제를 생각했지만 그 문제의 영향을 확인하거나 무시하기 위해 아무것도 테스트 할 수 없었습니다. 나는 PC가 필요없는 다른 프로젝트에 너무 빠져 들었습니다. 버그가 오랫동안 남아있는 것 같습니다. 이전에 새 버전과 이전 버전을 테스트했으며, 내 결론은 누군가가 적절한 솔루션을 찾을 때까지 버그를 일으키는 코드를 코어에서 제거 할 수 있다는 것입니다 ... ;-)
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.