Как придать постраничным ссылкам собственный заголовок?

14

Я разделил содержимое моего поста на несколько страниц с помощью <! - nextpage ->кода. Я хочу дать своим постраничным ссылкам собственный заголовок вместо обычных 1,2,3. Как я могу это сделать? вызвать в этом документе https://codex.wordpress.org/Styling_Page-Links он упоминает только метод добавления суффикса или префикса. Я просто хочу присвоить каждому постраничному номеру свой собственный заголовок

Ruriko
источник

Ответы:

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_404и wp_link_pages_argsфильтры , чтобы поддержать эту extenstion из СледующаяСтраницы маркеров ( 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-->он будет числовым, как и ожидалось.

Сначала я забыл об ошибке на следующей странице в 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 -->

или возможно через настраиваемые поля?

birgire
источник
Это выглядит интересно и довольно динамично. ;-)
Питер Гусен
+1 за технику замыкания;) До этого я только знал, что мы ограничены apply_filterаргументами: D
Sumit
1
Это может быть удобно при написании коротких фрагментов кода здесь, на WPSE, но мы также можем просто написать класс для поддержки этого в соответствующем плагине ;-) @Sumit
birgire
@PieterGoosen Сначала я забыл об ошибке # 35562 , попытался настроить ее через pre_handle_404фильтр.
Биргире
@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;
}
Sumit
источник