Додавання вмісту з <! - 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;
}

Це код, який я використовував для тестування кількох додаткових сторінок на одній публікації сторінки

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, я можу переглянути додаткову сторінку, і вміст додаткового вмісту є, але він все ще викликає помилку 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;
}

На даний момент у мене немає ідей, як відновити цю функціональність, і будь-яка допомога буде вдячна.


Добре, тому у мене є оновлення до цього, на жаль, це не є позитивним. Мабуть, це працює при новому встановленні, якщо додатковою сторінкою є сторінка 2. Однак якщо додаткова сторінка - це сторінка 3 (або вище, то вона ламається). / зап'ястя
Міламбер

1
ЗНАЙДЕНО БУГ !!!!! ТАК !!!! Оновлю мою відповідь незабаром
Пітер Гузен

Відповіді:


8

ОНОВЛЕННЯ 21-01-2016 19:35 ЧАС СА - ЗНАЙДЕНО БУГ !!!!! ТАК !!!!!!

Нарешті я знайшов помилку. Як ви заявляли в останньому оновлення, помилка трапляється лише тоді, коли у вмісті $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()перенаправляє будь-яку додану сторінку назад до першої сторінки

Я подав пропускний квиток про це питання, який ви можете ознайомитись тут

На момент написання ще не було жодних відгуків, тому обов'язково регулярно перевіряйте статус квитка

СУЧАСНЕ РІШЕННЯ - ЗВЕДЕННЯ ЗВОРОТНЬОГО ВИДАВЛЕННЯ ТІКА

Поки, поки ми не отримаємо будь-яких відгуків та можливих виправлень у майбутніх випусках, просто видаліть ці рядки з 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_paginationv4.3, який очікується ).

Я також встановлюю Sample Pageяк статичну титульну сторінку, але це не вдалося на сторінці 2 як відповідність помилку, як описано в моєму ОРИГІНАЛЬНОМУ ВІДПОВІДІ та ** EDIT

Отже, висновок полягає в тому, що це не має нічого спільного з помилкою в ядрі або будь-якою іншою помилкою в ядрі. З коментарів щось не дає змоги встановити запитуваний об’єкт на сторінках, що заповнюються, і це те, що нам потрібно налагодити. На жаль, оскільки ця проблема локалізована, я не можу дати точних рішень.

ЗАСТОСУВАННЯ ВИПУСКУ

Вам потрібно використовувати наступний потік робіт для налагодження проблеми

  • Отримайте собі величезну кількість висококафеїнової кави з великою кількістю цукру

  • Візьміть резервну копію вашого db

  • Завантажте та встановіть такі плагіни ( я не маю приналежності до жодного плагіна )

    • Об'єкти налагодження для нормальної налагодження. Після встановлення та налаштування виправте всі очевидні помилки, які можуть бути виділені плагіном. Не продовжуйте переходити до наступного основного пункту, якщо у вас є явні помилки. Виправте їх спочатку

    • Менеджер БД, який ви будете використовувати для ремонту та очищення вашої БД, перш ніж перейти до наступної точки кулі

  • Очистити всі кеші, веб-переглядачі та плагіни

  • Деактивуйте всі плагіни та очистіть усі кеші знову для гарної міри. Оскільки ця проблема схожа на проблему перенаправлення, я, мабуть, спочатку деактивував би всі плагіни, які можуть мати щось спільне з перенаправленням. Можливо, один плагін ще не сумісний з 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. Якщо це працює, ви можете застосувати виправлення та дочекатися версії 4.4.2, в якій буде виправлена ​​ця помилка


1
Сподіваємось, це питання для ОП, звучить дуже ймовірно (сьогодні не в змозі розібратися в цьому ;-).
birgire

1
Спробував виправити, також відключений постійні посилання; без змін.
Міламбер

1
Я розгляну це, як тільки встигну. Я відчуваю, що відповідь криється в помилках, це просто знайти їх. Сподіваємось, ви скоро знайдете рішення
Пітер Гусен

2
Перевірте моє оновлення, я знайшов помилку, а також подав звіт про помилки
Пітер Гузен

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'));

1
Моя помилка, додаткові) залишилися від їх копіювання та вставлення з класу, в якому вони є, з моєю реальною реалізацією. Я видалив їх з оп. На жаль, версія content_pagination також не виправляє помилку 404.
Міланбер

1
У рядку вмісту $ також немає) - дивіться оновлення. @Milamber
birgire

1
Спасибі, виправлено. Будь-які синтаксичні помилки, які ви бачите в оп-коді, - це спрощення його для публікації.
Міланбер

2
Ок, я тестував це на ванільній установці WP 4.4 з темою Twenty Sixteen, і вона працює, як очікувалося, тому я думаю, що це може бути щось інше у вашому налаштуванні, що доставляє вам проблему. @Milamber
birgire

1
Як не дивно, я спробував це у двох різних розробникових середовищах із Twentyfifteen, і вони мали однаковий результат. Я ще раз подивлюся на це, дякую @birgire
Мілан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.