Việc thêm nội dung với <! - trang tiếp theo -> bị hỏng trong 4.4


14

Cập nhật 2016-01-21

Tất cả các thử nghiệm hiện tại của tôi đang được thực hiện trên các bản cài đặt mới 4.4.1 với các cài đặt sau: Plain permalinks Twentysixteen Theme No plugins activated

Nếu bài đăng chỉ có 1 trang (tức là <!--nextpage-->không xuất hiện trong bài viết) thì các trang phụ sẽ được nối thành công (ngay cả khi bạn nối thêm nhiều trang).

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

Nếu bài đăng có hơn 2 trang thì các trang phụ 404 và chuyển hướng chính tắc sang trang 1 của bài đăng.

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

<!--nextpage-->

This is page 2

Trong trường hợp thứ hai $wp_query->queried_objectlà trống khi bạn nhấn vào các trang phụ. Bạn sẽ cần phải vô hiệu hóa chuyển hướng chính tắc để thấy điều nàyremove_filter('template_redirect', 'redirect_canonical');

Cả hai bản sửa lỗi cốt lõi sau đây đã được thử, riêng rẽ và cùng nhau, không có thay đổi trong hành vi: https://core.trac.wordpress.org/ticket353344#comment:16

https://core.trac.wordpress.org/ticket353344#comment:34

Để dễ sử dụng, đây là mã tôi hiện đang thử nghiệm với:

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

Đây là mã tôi đã sử dụng để kiểm tra nhiều trang bổ sung trên một bài đăng trang

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

Câu hỏi gốc

Trước 4.4 tôi đã có thể nối thêm một trang vào một bài đăng khác nhau như sau:

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

Với get_option ('custom_content') là một cái gì đó như:

<!--nextpage-->
Hello World

Kể từ khi nâng cấp lên 4.4, mã không hoạt động; điều hướng đến trang bổ sung gây ra lỗi 404 và redirect_canonical gửi chúng trở lại permalink của bài đăng. Vô hiệu hóa redirect_canonical cho phép tôi xem trang phụ và nội dung bổ sung ở đó, nhưng nó vẫn gây ra lỗi 404.

Tôi đã thử một số cách giải quyết, không có cách nào khắc phục lỗi 404, bao gồm:

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

Cũng đã thử tận dụng bộ lọc content_pagination mới được thêm vào trong 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;
}

Tại thời điểm này tôi không biết gì về cách khôi phục chức năng này và mọi hỗ trợ sẽ được đánh giá cao.


Được rồi vì vậy tôi có một bản cập nhật cho điều này, thật không may, nó không phải là một tích cực. Rõ ràng nó hoạt động trên bản cài đặt mới nếu phần ngoại suy là trang 2. Tuy nhiên, nếu trang thêm là trang 3 (hoặc cao hơn, thì nó bị hỏng). / cổ tay
Milamber

1
TÌM KIẾM BUG !!!!! YEAH !!!! Sẽ cập nhật câu trả lời của tôi sớm
Pieter Goosen

Câu trả lời:


8

CẬP NHẬT 21-01-2016 19:35 SA TIME - BUG FOUND !!!!! YEAH !!!!!!

Cuối cùng tôi đã tìm thấy lỗi. Như bạn đã nói trong bản cập nhật mới nhất của bạn, lỗi chỉ xảy ra khi $post_contentcó một <!--nextpage-->thẻ trong nội dung. Tôi đã kiểm tra nó và đã xác nhận rằng bất kỳ trang nào khác sau trang sau khi <!--nextpage-->trả về 404 và sau đó trang sẽ được chuyển hướng trở lại trang đầu tiên.

Điều này là do các dòng mã sau đây trong handle_404()phương thức được giới thiệu trong WPlớp trong 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 );
}

Mã này làm gì, bất cứ khi nào <!--nextpage-->thẻ được đặt vào post_content, nó sẽ trả về 404 khi bất kỳ trang nào được truy cập được thêm vào sau nội dung qua content_paginationbộ lọc. Do 404 được đặt, redirect_canonical()chuyển hướng bất kỳ trang được nối nào trở lại trang đầu tiên

Tôi đã nộp một vé trac về vấn đề này mà bạn có thể xem tại đây

Tại thời điểm viết chưa có phản hồi nào, vì vậy hãy đảm bảo thường xuyên kiểm tra trạng thái của vé

GIẢI PHÁP HIỆN TẠI - PHẢN HỒI VÉ A / W

Hiện tại, cho đến khi chúng tôi nhận được bất kỳ phản hồi và sửa lỗi có thể có trong các bản phát hành trong tương lai, chỉ cần xóa các dòng đó khỏi WPlớp cho đến khi có thông báo mới

THỜI GIAN LÀ GÌ ...... THỜI GIAN TUYỆT VỜI !!!!!

Tôi đã có thời gian để kiểm tra đầy đủ điều này. Tôi lấy mã của bạn và kiểm tra nó trên:

  • Cài đặt cục bộ v4.3 của tôi

  • Cài đặt cục bộ v4.4.0 của tôi

  • Cài đặt cục bộ v4.4.1 của tôi

  • Hoàn thành cài đặt cục bộ v4.4.1 mới chỉ với Hello Worldbài đăng và Sample Pagetrang

với permalinks của tôi được đặt thành

  • default

  • Post Name

Đây là mã kiểm tra của tôi để tạo 4 trang với bên trong bài kiểm tra của tôi.

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

Tôi cũng đã thử nghiệm

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

cho biện pháp tốt

Trên mỗi cấu trúc cài đặt và permalink, tất cả các mã của bạn đều hoạt động ( ngoại trừ phiên bản content_paginationv4.3 được mong đợi ).

Tôi cũng đã đặt Sample Pagelàm một trang đầu tĩnh, nhưng điều đó đã thất bại ở trang 2 dưới dạng thông báo lỗi như được mô tả trong TRẢ LỜI GỐC và ** EDIT của tôi

Vì vậy, kết luận là điều này không liên quan gì đến lỗi trong lõi hoặc bất kỳ lỗi nào khác trong lõi. Từ các bình luận, một cái gì đó đang bỏ đặt đối tượng được truy vấn trên các trang bài viết được phân trang và đó là điều chúng ta cần gỡ lỗi. Thật không may vì vấn đề này hiện đã được bản địa hóa, tôi không thể đưa ra giải pháp chính xác.

GỬI VẤN ĐỀ

Bạn cần sử dụng luồng công việc sau để gỡ lỗi sự cố

  • Nhận cho mình một lượng lớn cà phê caffeine với nhiều đường

  • Hãy sao lưu db của bạn

  • Tải xuống và cài đặt các plugin sau ( Tôi không có liên kết với bất kỳ plugin nào )

    • Đối tượng gỡ lỗi để gỡ lỗi bình thường. Sau khi cài đặt và thiết lập, sửa chữa tất cả các lỗi rõ ràng có thể được làm nổi bật bởi plugin. Không tiếp tục đến điểm đạn chính tiếp theo nếu bạn có lỗi rõ ràng. Sửa chúng trước

    • Trình quản lý DB mà bạn sẽ sử dụng để sửa chữa và dọn sạch DB của mình trước khi bạn tiếp tục đến điểm tiếp theo

  • Xóa tất cả bộ nhớ cache, trình duyệt và plugin

  • Vô hiệu hóa tất cả các plugin và xóa tất cả bộ nhớ cache một lần nữa để có biện pháp tốt. Vì sự cố này trông giống như sự cố chuyển hướng, nên trước tiên tôi có thể hủy kích hoạt tất cả các plugin có thể liên quan đến chuyển hướng. Có thể một plugin chưa tương thích với v4.4. Kiểm tra xem sự cố có còn không, nếu có, tiếp tục đến điểm tiếp theo, nếu không, hãy xem xét vấn đề này chi tiết hơn

    Bắt đầu bằng cách hủy kích hoạt tất cả các plugin, bạn cũng có thể bắt đầu bằng cách tắt kích hoạt các plugin có thể rõ ràng để gây ra sự cố. Kiểm tra đúng cài đặt của bạn sau khi kích hoạt từng plugin. Plugin đầu tiên được kích hoạt gây ra sự cố sẽ là thủ phạm. Trong trường hợp đó, liên hệ với tác giả plugin với các chi tiết gỡ lỗi. Chỉ cần đảm bảo xóa bộ nhớ cache của bạn sau mỗi lần kích hoạt plugin chỉ để có biện pháp tốt

  • Nếu bạn đạt đến điểm này, điểm đạn trước đó không giải quyết được vấn đề của bạn. Bước tiếp theo nên chuyển sang một chủ đề đi kèm để loại bỏ chủ đề của bạn là vấn đề. Chỉ cần một lần nữa, xóa bộ nhớ cache.

  • Nếu mọi thứ đều thất bại, bạn còn lại hai lựa chọn khác

    • Xóa .htaccessvà để WordPress tạo một cái mới

    • Cài đặt lại WordPress

Điều này sẽ giải quyết vấn đề của bạn. Nếu không, bạn cần xem xét một lỗi trong lõi WordPress có thể gây ra sự cố.

Tôi hy vọng điều này sẽ giúp bắt lỗi

CẬP NHẬT

Tôi nên thực sự liên kết với vé trac theo dõi mà dường như giải thích mọi thứ chi tiết hơn

Các bản vá thú vị và khá phù hợp từ vé trac ở trên

Tôi không thể kiểm tra cụ thể bất cứ điều gì như vậy tại thời điểm này, nhưng bạn nên làm việc thông qua các bản vá được đề xuất và kiểm tra chúng. Những gì tôi có thể nhận là cùng một mã redirect_canonical()chịu trách nhiệm phân trang của các trang đầu tĩnh cũng chịu trách nhiệm phân trang trên các trang đơn.

CÂU TRẢ LỜI

Các trang đơn ( như trang trước tĩnh ) sử dụng get_query_var( 'page' )để phân trang. Với WordPress 4.4 ( và trong v4.4.1 ), đã xuất hiện một lỗi gây ra sự cố với phân trang khi sử dụng get_query_var( 'page' )để phân trang.

Các báo cáo lỗi hiện tại, như vé trac # 35365 , chỉ đề cập đến các trang đầu tĩnh có vấn đề với phân trang, nhưng vì lỗi liên quan đến get_query_var( 'page' ), tôi nghĩ rằng điều này cũng sẽ gây ra vấn đề với phân trang bài duy nhất cũng sử dụng get_query_var( 'page' ).

Bạn nên thử các bản vá như mô tả trong vé trac. Nếu điều này hoạt động, bạn có thể áp dụng bản vá và chờ phiên bản 4.4 sẽ sửa lỗi này


1
Hy vọng rằng đây là vấn đề của OP, nghe có vẻ rất có thể (không thể đào sâu vào vấn đề này ngày hôm nay ;-).
bạch dương

1
Đã thử sửa chữa, cũng vô hiệu hóa permalinks; không thay đổi.
Milamber

1
Tôi sẽ xem xét điều này ngay khi tôi có thời gian. Tôi cảm thấy rằng câu trả lời nằm trong lỗi, nó chỉ là để theo dõi nó. Hy vọng bạn sớm tìm ra giải pháp
Pieter Goosen

2
Kiểm tra cập nhật của tôi, tôi đã tìm thấy lỗi và cũng đã nộp báo cáo lỗi
Pieter Goosen

2
Xác nhận rằng cả 3 phương thức đều hoạt động khi các dòng đó được nhận xét :) đã đóng 35544 có lợi cho bạn
Milamber

4

Lưu ý rằng có lỗi cú pháp cho cả ba ví dụ bạn đã cung cấp:

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

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

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

trong đó một bổ sung )được thêm vào.

Thay thế các dòng này thành:

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

add_action( 'the_post', 'custom_content' );

add_action( 'template_redirect', 'custom_content' );

Tôi không khuyên bạn nên loay hoay với các đối tượng toàn cầu nói chung, vì vậy tôi nghĩ ví dụ cuối cùng của bạn với content_paginationbộ lọc là cách để đi đến đây.

Bạn cũng có thể muốn tránh nối thêm các trang trống với:

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

Cũng có một mất tích )ở đây:

$content = html_entity_decode(stripslashes(get_option('custom_content'));

1
Lỗi của tôi, phần phụ) đã bị bỏ lại từ việc sao chép và dán chúng ra khỏi lớp mà chúng đang thực hiện với tôi. Tôi đã xóa chúng khỏi op. Thật không may, phiên bản content_pagination cũng không sửa lỗi 404.
Milamber

1
Cũng có một thiếu) trong dòng nội dung $ - xem bản cập nhật. @Milamber
birgire

1
Cảm ơn, đã sửa. Bất kỳ lỗi cú pháp nào bạn thấy trong mã op là từ việc đơn giản hóa nó cho bài viết.
Milamber

2
ok, tôi đã thử nghiệm điều này trên bản cài đặt vanilla WP 4.4 với chủ đề Twenty Sixteen và nó hoạt động như mong đợi ở đó, vì vậy tôi nghĩ rằng nó có thể là một cái gì đó khác trong thiết lập của bạn gây ra sự cố cho bạn. @Milamber
birgire

1
Thật kỳ lạ, tôi đã thử nó trong 2 môi trường dev khác nhau với Twentyf15 và cả hai đều có kết quả như nhau. Tôi sẽ xem xét lại ở đó, nhờ @birgire
Milamber
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.