Добавление контента с помощью <! - nextpage -> не работает в 4.4

14

Обновление 2016-01-21

Все мои текущие тесты выполняются на новых установках 4.4.1 со следующими настройками: Plain permalinks Twentysixteen Theme No plugins activated

Если сообщение содержит только 1 страницу (то <!--nextpage-->есть не отображается в сообщении), дополнительные страницы добавляются успешно (даже если вы добавляете несколько дополнительных страниц¹).

Welcome to WordPress. This is your first post. Edit or delete it, then start writing!

Если пост содержит 2+ страницы, то дополнительные страницы 404 и канонический редирект на страницу 1 поста.

Welcome to WordPress. This is your first post. Edit or delete it, then start writing!

<!--nextpage-->

This is page 2

Во втором случае $wp_query->queried_objectпусто, как только вы нажмете дополнительные страницы. Вам нужно будет отключить каноническое перенаправление, чтобы увидеть этоremove_filter('template_redirect', 'redirect_canonical');

Оба следующих основных исправления были опробованы по отдельности и вместе, без изменений в поведении: https://core.trac.wordpress.org/ticket/35344#comment:16

https://core.trac.wordpress.org/ticket/35344#comment:34

Для простоты использования это код, с которым я сейчас тестирую:

add_action('template_redirect', 'custom_content_one');
function custom_content_one() {
    global $post;
    $content = "\n<!--nextpage-->\nThis is the extra page v1";
    $post->post_content .= $content;
}

add_filter('content_pagination', 'custom_content_two', 10, 2);
function custom_content_two($pages, $post) {
    if ( in_the_loop() && 'post' === $post->post_type ) {
        $content = "This is the extra page v2";

        $pages[] = $content;
    }
    return $pages;
}

add_action('the_post', 'custom_content_three');
function custom_content_three() {
    global $multipage, $numpages, $pages;
    $content = "This is the extra page v3";

    $multipage = 1;
    $numpages++;
    $pages[] = $content;
}

CodeЭто код, который я использовал для тестирования нескольких дополнительных страниц в одном посте

add_action('template_redirect', 'custom_content_one');
function custom_content_one() {
    global $post;
    $content = "\n<!--nextpage-->\nThis is the extra page v1-1\n<!--nextpage-->\nThis is the extra page v1-2\n<!--nextpage-->\nThis is the extra page v1-3";
    $post->post_content .= $content;
}

Оригинальный вопрос

До 4.4 у меня была возможность добавить дополнительную страницу к сообщению с несколькими страницами:

add_action('template_redirect', 'custom_content');
function custom_content() {
    global $post;
    $content = html_entity_decode(stripslashes(get_option('custom_content')));
    $post->post_content .= $content;
}

С get_option ('custom_content') что-то вроде:

<!--nextpage-->
Hello World

Начиная с обновления до 4.4 код не работал; переход на дополнительную страницу вызывает ошибку 404 и redirect_canonical отправляет их обратно на постоянную ссылку сообщения. Отключение redirect_canonical позволяет мне просматривать дополнительную страницу, и дополнительный контент есть, но он все равно вызывает ошибку 404.

Я пробовал несколько обходных путей, ни один из которых не устраняет ошибку 404, в том числе:

add_action('the_post', 'custom_content');
function custom_content() {
    global $multipage, $numpages, $pages;
    $content = html_entity_decode(stripslashes(get_option('custom_content')));

    $multipage = 1; // ensure post is considered multipage: needed for single page posts
    $numpages++; // increment number of pages
    $pages[] = $content;
}

Также попытался использовать новый фильтр content_pagination, который был добавлен в 4.4:

add_filter('content_pagination', 'custom_content', 10, 2);
function custom_content($pages, $post) {
    $content = html_entity_decode(stripslashes(get_option('custom_content')));

    $pages[] = $content;
    return $pages;
}

На данный момент у меня нет идей о том, как восстановить эту функциональность, и любая помощь будет принята с благодарностью.

Milamber
источник
Хорошо, поэтому у меня есть обновление к этому, к сожалению, оно не является положительным. Очевидно, это работает при новой установке, если дополнительная страница - страница 2. Однако, если дополнительная страница - страница 3 (или выше, то она ломается). / запястье
Миламбер
1
НАЙТИ ЖУК !!!!! ДА!!!!. Скоро
обновлю

Ответы:

8

ОБНОВЛЕНИЕ 21-01-2016 19:35 SA TIME - ОШИБКА НАЙДЕНА !!!!! ДА!!!!!!

Я наконец нашел ошибку. Как вы указали в своем последнем обновлении, сбой происходит только тогда, когда в содержимом $post_contentесть <!--nextpage-->тег. Я проверил это и подтвердил, что любая другая страница после страницы <!--nextpage-->возвращает 404, а затем страница перенаправляется обратно на первую страницу.

Это связано со следующими строками кода в handle_404()методе, который был представлен в WPклассе в WordPress 4.4

// check for paged content that exceeds the max number of pages
$next = '<!--nextpage-->';
if ( $p && false !== strpos( $p->post_content, $next ) && ! empty( $this->query_vars['page'] ) ) {
    $page = trim( $this->query_vars['page'], '/' );
    $success = (int) $page <= ( substr_count( $p->post_content, $next ) + 1 );
}

Этот код делает всякий раз, когда <!--nextpage-->тег установлен в post_content, он будет возвращать 404 при доступе к любой странице, которая добавляется после содержимого через content_paginationфильтр. Из-за установки 404 redirect_canonical()перенаправляет любую добавленную страницу обратно на первую страницу

Я отправил трек-тикет об этой проблеме, который вы можете проверить здесь

На момент написания статьи не было отзывов, поэтому регулярно проверяйте статус заявки.

ТЕКУЩЕЕ РЕШЕНИЕ - A / W TRAC БИЛЕТ ОБРАТНАЯ СВЯЗЬ

Пока, пока мы не получим какие-либо отзывы и возможные исправления в будущих выпусках, просто удалите эти строки из WPкласса до дальнейшего уведомления

КАКОЕ ВРЕМЯ ЭТО ...... ЭТО ВРЕМЯ ОТЛАДКИ !!!!!

У меня было время, чтобы полностью проверить это. Я взял ваш код и проверил его:

  • Моя v4.3 локальная установка

  • Моя v4.4.0 локальная установка

  • Моя v4.4.1 локальная установка

  • Завершите новую локальную установку v4.4.1 только с Hello Worldпостом и Sample Pageстраницей

с моими постоянными ссылками на

  • default и

  • Post Name

Вот мой тестовый код для создания 4 страниц внутри моего тестового поста.

add_filter('content_pagination', 'custom_content', 10, 2);
function custom_content($pages, $post) {
    $pages_to_add = [
        'Hello World Page 2',
        'Hello World Page 3',
        'Hello World Page 4',
    ];

    foreach ( $pages_to_add as $page_to_add ){
        $pages[]  = html_entity_decode(
            stripslashes(
                $page_to_add
            )
        );
    }

    return $pages;
}

Я тоже проверял

add_filter('content_pagination', 'custom_content', 10, 2);
function custom_content($pages, $post) {
    $pages_to_add = [
        '<!--nextpage--> Hello World Page 2',
        '<!--nextpage--> Hello World Page 3',
        '<!--nextpage--> Hello World Page 4',
    ];

    foreach ( $pages_to_add as $page_to_add ){
        $pages[]  = html_entity_decode(
            stripslashes(
                $page_to_add
            )
        );
    }

    return $pages;
}

для хорошей меры

На каждой установке и структуре постоянных ссылок работает весь ваш код ( кроме content_paginationожидаемой версии v4.3 ).

Я также установил Sample Pageв качестве статической титульной страницы, но это не помогло на странице 2 как подтверждение ошибки, как описано в моем ОРИГИНАЛЬНОМ ОТВЕТЕ и ** РЕДАКТИРОВАТЬ

Таким образом, вывод заключается в том, что это не имеет ничего общего с ошибкой в ​​ядре или любой другой ошибкой в ​​ядре. Судя по комментариям, что-то сбрасывает запрашиваемый объект на страничных страницах постов, и это то, что нам нужно отладить. К сожалению, поскольку эта проблема теперь локализована, я не могу дать точных решений.

ОТЛАДКА ВОПРОСОМ

Для устранения проблемы необходимо использовать следующий рабочий процесс.

  • Получите себе огромное количество кофеина с высоким содержанием кофеина и большим количеством сахара

  • Сделай резервную копию своей базы данных

  • Скачайте и установите следующие плагины ( я не имею никакого отношения к любому плагину )

    • Объекты отладки для нормальной отладки. После установки и настройки исправьте все очевидные ошибки, которые могут быть выделены плагином. Не переходите к следующему пункту, если у вас есть явные ошибки. Исправить их в первую очередь

    • Менеджер БД, который вы будете использовать для восстановления и очистки БД перед переходом к следующему пункту.

  • Очистить все кеши, браузеры и плагины

  • Отключите все плагины и очистите все кеши снова для хорошей меры. Поскольку эта проблема выглядит как проблема перенаправления, я, вероятно, сначала отключил бы все плагины, которые могут иметь какое-то отношение к перенаправлению. Возможно, один плагин еще не совместим с v4.4. Проверьте, не устранена ли проблема, если она существует, перейдите к следующему пункту, в противном случае, давайте рассмотрим это более подробно.

    Начните с деактивации всех плагинов, вы также можете начать с деактивации плагинов, которые могут быть очевидны для возникновения проблемы. Тщательно проверьте вашу установку после активации каждого плагина. Первым активированным плагином, который вызвал проблему, будет виновник. В этом случае обратитесь к автору плагина с подробностями отладки. Просто убедитесь, что очистили свои кеши после каждой активации плагина только для хорошей меры

  • Если вы достигли этой точки, предыдущий пункт не решил вашу проблему. Следующим шагом должно стать переключение на связанную тему, чтобы устранить вашу тему как проблему. Просто еще раз, очистите кеш.

  • Если все не удалось, у вас есть еще два варианта

    • Удалите .htaccessи позвольте WordPress создать новый

    • Переустановите WordPress

Это должно решить вашу проблему. Если это не так, вам нужно рассмотреть ошибку в ядре WordPress, которая может быть причиной проблемы.

Я надеюсь, что это помогает в обнаружении ошибки

ОБНОВИТЬ

Я должен был на самом деле связаться с билетом, который, кажется, объясняет все более подробно

Интересные и весьма актуальные патчи из вышеуказанного билета trac

Я не могу конкретно протестировать что-либо как таковое в данный момент, но вы должны проработать предложенные патчи и протестировать их. Что я могу понять, так это то, что тот же код, redirect_canonical()который отвечает за разбиение на страницы статических первых страниц, также отвечает за разбиение на страницы на отдельных страницах.

ОРИГИНАЛЬНЫЙ ОТВЕТ

Отдельные страницы ( например, статические титульные страницы ) используются get_query_var( 'page' )для разбиения на страницы. В WordPress 4.4 ( и в v4.4.1 ) появилась ошибка, которая вызывает проблемы с разбиением на страницы при использовании get_query_var( 'page' )для разбиения на страницы.

В текущих отчетах об ошибках, таких как trac ticket # 35365 , упоминаются только статические первые страницы, у которых есть проблемы с разбиением на страницы, но поскольку ошибка связана с этим get_query_var( 'page' ), я думаю, что это также вызовет проблемы с одиночной пост-страницей, которая также использует get_query_var( 'page' ).

Вы должны попробовать патчи, как описано в trac tickets. Если это сработает, вы можете применить патч и ждать v4.4.2, в котором эта ошибка будет исправлена.

Питер Гусен
источник
1
Надеюсь, это проблема для OP, звучит очень вероятно (не в состоянии разобраться в этом сегодня ;-).
биргире
1
Пробовал исправить, также отключены постоянные ссылки; без изменений.
Миламбер
1
Я посмотрю на это, как только у меня будет время. Я чувствую, что ответ кроется в ошибке, это просто отследить ее. Надеюсь, вы скоро найдете решение
Питер Гусен
2
Проверьте мое обновление, я нашел ошибку и также подал отчет об ошибке
Pieter Goosen
2
Подтвердили, что все 3 метода работают после того, как эти строки закомментированы :) закрытый билет 35544 в пользу вашего
Миламбер
4

Обратите внимание, что во всех трех приведенных вами примерах есть синтаксическая ошибка:

add_filter('content_pagination', 'custom_content'), 10, 2);

add_action('the_post', 'custom_content'));

add_action('template_redirect', 'custom_content'));

где добавлено дополнительное ).

Замените эти строки на:

add_filter( 'content_pagination', 'custom_content', 10, 2);

add_action( 'the_post', 'custom_content' );

add_action( 'template_redirect', 'custom_content' );

Я бы не рекомендовал возиться с глобальными объектами в целом, поэтому я думаю, что ваш последний пример с content_paginationфильтром - это то, что нужно.

Вы также можете избежать добавления пустых страниц с помощью:

if( ! empty( $content ) )
    $pages[] = $content;

Там также отсутствует )здесь:

$content = html_entity_decode(stripslashes(get_option('custom_content'));
birgire
источник
1
Моя ошибка, лишняя) была оставлена ​​после копирования и вставки их из класса, в котором они находятся с моей реальной реализацией. Я удалил их из оп. К сожалению, версия content_pagination также не исправляет ошибку 404.
Миламбер
1
Там также отсутствует) в строке содержимого $ - см. Обновление. @Milamber
Birgire
1
Спасибо, исправлено. Любые синтаксические ошибки, которые вы видите в коде операции, связаны с его упрощением для поста.
Миламбер
2
хорошо, я проверил это на ванильной установке WP 4.4 с темой Twenty Sixteen, и там она работает как положено, так что я думаю, что это может быть что-то еще в вашей настройке, которая создает вам проблему. @Milamber
birgire
1
Странно, я пробовал это в двух разных средах разработки с Twentyfifteen, и у них обоих был одинаковый результат. Я еще раз посмотрю на это, спасибо @birgire
Миламбер