Dołączanie treści z <! - nextpage -> zepsute w 4.4

14

Aktualizacja 21.01.2016

Wszystkie bieżące testy po mojej stronie są wykonywane na nowych instalacjach 4.4.1 z następującymi ustawieniami: Plain permalinks Twentysixteen Theme No plugins activated

Jeśli post ma tylko 1 stronę (tzn. <!--nextpage-->Nie pojawia się w poście), dodatkowe strony są dodawane pomyślnie (nawet jeśli dodasz wiele dodatkowych stron¹).

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

Jeśli post ma ponad 2 strony, dodatkowe strony 404 i kanoniczne przekierowanie na stronę 1 postu.

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

<!--nextpage-->

This is page 2

W drugim przypadku $wp_query->queried_objectjest pusty po przejściu na dodatkowe strony. Aby to zobaczyć, musisz wyłączyć kanoniczne przekierowanieremove_filter('template_redirect', 'redirect_canonical');

Wypróbowano obie następujące podstawowe poprawki, oddzielnie i łącznie, bez zmiany zachowania: https://core.trac.wordpress.org/ticket/35344#comment:16

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

Dla ułatwienia użytkowania jest to kod, który obecnie testuję:

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;
}

¹ To jest kod, którego użyłem do przetestowania wielu dodatkowych stron na postie na jednej stronie

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;
}

Oryginalne pytanie

Przed wersją 4.4 byłem w stanie dodać dodatkową stronę do posta na mutlipage z następującymi informacjami:

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

Z get_option („custom_content”) jest coś w stylu:

<!--nextpage-->
Hello World

Od aktualizacji do 4.4 kod nie działał; przejście do dodatkowej strony powoduje błąd 404 i redirect_canonical odsyła je z powrotem do bezpośredniego łącza do posta. Wyłączenie redirect_canonical pozwala mi wyświetlić dodatkową stronę i dodatkową zawartość tam jest, ale nadal powoduje błąd 404.

Próbowałem wielu obejść, z których żaden nie rozwiązuje błędu 404, w tym:

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;
}

Próbowałem także wykorzystać nowy filtr content_pagination, który został dodany w 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;
}

W tej chwili nie mam pomysłów na przywrócenie tej funkcjonalności i każda pomoc byłaby mile widziana.

Milamber
źródło
W porządku, więc mam aktualizację tego, niestety nie jest to pozytywna. Najwyraźniej działa na nowej instalacji, jeśli ekstrapage to strona 2. Jednakże, jeśli dodatkowa strona to strona 3 (lub wyższa, wówczas psuje się). / nadgarstek
Milamber
1
ZNALAZŁEM BŁĄD !!!!! TAK!!!!. Wkrótce zaktualizuje moją odpowiedź
Pieter Goosen

Odpowiedzi:

8

AKTUALIZACJA 21-01-2016 19:35 SA TIME - BŁĄD ZNALEZIONO !!!!! TAK!!!!!!

W końcu znalazłem błąd. Jak stwierdzono w ostatniej aktualizacji, awaria występuje tylko wtedy, gdy w treści $post_contentznajduje się <!--nextpage-->znacznik. Przetestowałem to i potwierdziłem, że każda inna strona po stronie po <!--nextpage-->zwróceniu 404, a następnie strona przekierowuje z powrotem na pierwszą stronę.

Wynika to z następujących linii kodu w handle_404()metodzie, która została wprowadzona w WPklasie w 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 );
}

To, co robi ten kod, polega na tym, że za każdym razem, gdy <!--nextpage-->tag jest ustawiony na post_content, zwraca 404 po wejściu na dowolną stronę, która jest dodawana po treści przez content_paginationfiltr. Ponieważ ustawiono 404, redirect_canonical()przekierowuje każdą dołączoną stronę z powrotem na pierwszą stronę

Złożyłem bilet trac dotyczący tego problemu, który możesz sprawdzić tutaj

W chwili pisania tego tekstu nie było jeszcze żadnych opinii, więc regularnie sprawdzaj status biletu

AKTUALNE ROZWIĄZANIE - INFORMACJE ZWROTNE BILETÓW TRAC

Na razie, dopóki nie otrzymamy opinii i możliwych poprawek w przyszłych wydaniach, po prostu usuń te wiersze z WPklasy do odwołania

CO TO JEST CZAS ...... TO CZAS DEBUGOWANIA !!!!!

Miałem czas na pełne przetestowanie tego. Wziąłem twój kod i przetestowałem go na:

  • Moja lokalna instalacja v4.3

  • Moja lokalna instalacja v4.4.0

  • Moja lokalna instalacja v4.4.1

  • Wypełnij nową instalację lokalną v4.4.1 tylko Hello Worldpostem i Sample Pagestroną

z moimi permalinkami ustawionymi na

  • default i

  • Post Name

Oto mój kod testowy, aby utworzyć 4 strony z moim postem testowym.

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;
}

Też testowałem

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;
}

na dokładkę

Na każdej instalacji i każdej strukturze permalink działa cały kod ( oprócz oczekiwanej wersji content_paginationv4.3 ).

Ustawiłem również Sample Pagejako statyczną stronę główną, ale to nie powiodło się na stronie 2 jako zgodność z błędem, jak opisano w mojej ORYGINALNEJ ODPOWIEDZI i ** EDYCJA

Wniosek jest taki, że nie ma to nic wspólnego z błędem w rdzeniu ani żadnym innym błędem w rdzeniu. Z komentarzy wynika, że ​​coś niepokoi badany obiekt na stronach postu stronicowanych i to jest coś, co musimy debugować. Niestety, ponieważ problem ten jest teraz zlokalizowany, nie mogę podać dokładnych rozwiązań.

DEBUGOWANIE PROBLEMU

Aby debugować problem, musisz skorzystać z następującego przepływu prac

  • Zdobądź ogromną ilość kawy o wysokiej zawartości kofeiny z dużą ilością cukru

  • Zrób kopię zapasową db

  • Pobierz i zainstaluj następujące wtyczki ( nie mam powiązania z żadną wtyczką )

    • Obiekty debugowania do normalnego debugowania. Po zainstalowaniu i konfiguracji napraw wszystkie oczywiste błędy, które mogą zostać wyróżnione przez wtyczkę. Nie przechodź do następnego głównego punktu, jeśli masz oczywiste błędy. Napraw je najpierw

    • DB Manager, którego użyjesz do naprawy i czyszczenia DB przed przejściem do następnego punktu wypunktowania

  • Wyczyść wszystkie pamięci podręczne, przeglądarki i wtyczki

  • Dezaktywuj wszystkie wtyczki i ponownie wyczyść wszystkie pamięci podręczne, aby zachować dokładność. Ponieważ ten problem wygląda jak problem z przekierowaniem, prawdopodobnie najpierw dezaktywuję wszystkie wtyczki, które mogą mieć coś wspólnego z przekierowaniem. Być może jedna wtyczka nie jest jeszcze kompatybilna z wersją 4.4. Sprawdź, czy problem nadal występuje, jeśli tak, przejdź do następnego punktu wypunktowania, w przeciwnym razie spójrzmy na to bardziej szczegółowo

    Zacznij od dezaktywacji wszystkich wtyczek, możesz też zacząć od dezaktywacji wtyczek, które mogą być oczywiste z powodu problemu. Prawidłowo przetestuj swoją instalację po aktywacji każdej wtyczki. Pierwszą aktywowaną wtyczką, która spowodowała problem, będzie winowajca. W takim przypadku skontaktuj się z autorem wtyczki ze szczegółami debugowania. Tylko pamiętaj, aby wyczyścić pamięć podręczną po każdej aktywacji wtyczki, dla dobrego pomiaru

  • Jeśli osiągnąłeś ten punkt, poprzedni punktor nie rozwiązał twojego problemu. Następnym krokiem powinno być przejście do motywu pakietowego, aby wyeliminować motyw jako problem. Jeszcze raz wyczyść pamięć podręczną.

  • Jeśli wszystko się nie powiedzie, masz jeszcze dwie opcje

    • Usuń .htaccessi pozwól WordPressowi utworzyć nowy

    • Ponownie zainstaluj WordPress

To powinno rozwiązać Twój problem. Jeśli nie, musisz rozważyć błąd w rdzeniu WordPress, który może być przyczyną problemu.

Mam nadzieję, że to pomoże złapać błąd

AKTUALIZACJA

Powinienem był faktycznie powiązać się z następującym po nim biletem trac, który wydaje się wyjaśniać wszystko bardziej szczegółowo

Ciekawe i dość odpowiednie łaty z powyższego biletu trac

W tej chwili nie mogę konkretnie przetestować niczego jako takiego, ale powinieneś przejrzeć sugerowane łatki i przetestować je. Mogę odebrać to, że ten sam kod, redirect_canonical()który odpowiada za stronicowanie statycznych stron głównych, jest również odpowiedzialny za stronicowanie na pojedynczych stronach.

ORYGINALNA ODPOWIEDŹ

Pojedyncze strony ( takie jak statyczne stronyget_query_var( 'page' ) początkowe ) służą do paginacji. W WordPress 4.4 ( i v4.4.1 ) pojawił się błąd, który powoduje problemy z paginacją podczas korzystania get_query_var( 'page' )z paginacji.

Obecne raporty o błędach, takie jak trac bilet # 35365 , wspominają tylko o statycznych stronach głównych , które mają problemy z paginacją, ale jeśli chodzi o błąd get_query_var( 'page' ), sądzę, że spowodowałoby to również problemy z paginacją pojedynczego postu, która również używa get_query_var( 'page' ).

Powinieneś wypróbować łaty zgodnie z opisem w biletach trac. Jeśli to zadziała, możesz zastosować łatkę i poczekać na wersję 4.4.2, która naprawi ten błąd

Pieter Goosen
źródło
1
Mam nadzieję, że to jest problem OP, wydaje się bardzo prawdopodobne (dziś nie mogę się w to zagłębić ;-).
birgire,
1
Próbowałem poprawki, również wyłączono permalinki; brak zmiany.
Milamber
1
Zajmę się tym, jak tylko będę miał czas. Wydaje mi się, że odpowiedź tkwi w błędzie, to po prostu wyśledzić. Mam nadzieję, że wkrótce znajdziesz rozwiązanie
Pieter Goosen
2
Sprawdź moją aktualizację, znalazłem błąd, a także zgłosiłem raport o błędzie
Pieter Goosen
2
Potwierdzono, że wszystkie 3 metody działają po skomentowaniu tych linii :) zamknął bilet 35544 na twoją korzyść
Milamber
4

Pamiętaj, że istnieje błąd składniowy dla wszystkich trzech podanych przez Ciebie przykładów:

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

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

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

gdzie )dodaje się dodatkowe .

Zamień te linie na:

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

add_action( 'the_post', 'custom_content' );

add_action( 'template_redirect', 'custom_content' );

Nie polecałbym ogólnie bałagania się z obiektami globalnymi, więc myślę, że twój ostatni przykład z content_paginationfiltrem jest dobrym sposobem na przejście tutaj.

Możesz także unikać dodawania pustych stron za pomocą:

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

Brakuje )tutaj również:

$content = html_entity_decode(stripslashes(get_option('custom_content'));
birgire
źródło
1
Mój błąd, dodatkowe) pozostały po skopiowaniu i wklejeniu ich poza klasę, w której się znajdują z moją faktyczną implementacją. Usunąłem je z op. Niestety wersja content_pagination nie koryguje również błędu 404.
Milamber,
1
Brakuje również) w wierszu zawartości $ - zobacz aktualizację. @Milamber
birgire,
1
Dzięki, naprawione. Wszelkie błędy składniowe, które widzisz w kodzie op, wynikają z uproszczenia go w poście.
Milamber,
2
ok, przetestowałem to na waniliowej instalacji WP 4.4 z motywem Twenty Sixteen i działa tam zgodnie z oczekiwaniami, więc myślę, że może to być coś innego w twojej konfiguracji, co daje ci problem. @Milamber
birgire,
1
Dziwne, wypróbowałem to w 2 różnych środowiskach programistycznych z Twentyfifteen i oba przyniosły ten sam rezultat. Przyjrzę się temu jeszcze raz, dzięki @birgire
Milamber