Menambahkan konten dengan <! - nextpage -> rusak di 4.4

14

Pembaruan 2016-01-21

Semua pengujian saat ini di pihak saya sedang dilakukan pada pemasangan baru 4.4.1 dengan pengaturan berikut: Plain permalinks Twentysixteen Theme No plugins activated

Jika kiriman hanya memiliki 1 halaman (yaitu <!--nextpage-->tidak muncul di kiriman) maka halaman tambahan ditambahkan dengan sukses (bahkan jika Anda menambahkan beberapa halaman tambahan¹).

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

Jika posting memiliki 2+ halaman maka halaman tambahan 404 dan redirect kanonik ke halaman 1 dari postingan.

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

<!--nextpage-->

This is page 2

Dalam kasus kedua $wp_query->queried_objectkosong setelah Anda menekan halaman tambahan. Anda harus menonaktifkan pengalihan kanonik untuk melihatnyaremove_filter('template_redirect', 'redirect_canonical');

Kedua perbaikan inti berikut telah dicoba, secara terpisah dan bersama-sama, tanpa perubahan perilaku: https://core.trac.wordpress.org/ticket/35344#comment:16

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

Untuk kemudahan penggunaan, ini adalah kode yang saat ini saya uji dengan:

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

¹Ini adalah kode yang saya gunakan untuk menguji beberapa halaman tambahan pada posting halaman tunggal

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

Pertanyaan Asli

Sebelum 4.4 saya dapat menambahkan halaman tambahan ke posting mutlipage dengan yang berikut:

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

Dengan get_option ('custom_content') menjadi sesuatu seperti:

<!--nextpage-->
Hello World

Sejak memutakhirkan ke 4.4 kode tidak berfungsi; menavigasi ke halaman tambahan memicu kesalahan 404 dan redirect_canonical mengirimkannya kembali ke permalink kiriman. Menonaktifkan redirect_canonical memungkinkan saya untuk melihat halaman tambahan dan konten tambahan ada di sana, tetapi masih memicu kesalahan 404.

Saya sudah mencoba sejumlah solusi, tidak ada yang menyelesaikan kesalahan 404, termasuk:

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

Juga mencoba memanfaatkan filter content_pagination baru yang ditambahkan pada 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;
}

Pada titik ini saya kehabisan ide tentang cara mengembalikan fungsi ini dan bantuan apa pun akan dihargai.

Milamber
sumber
Baiklah jadi saya punya pembaruan untuk ini, sayangnya itu bukan yang positif. Tampaknya itu berfungsi pada instalasi baru jika ekstrapage adalah halaman 2. Namun, jika halaman tambahan adalah halaman 3 (atau lebih tinggi, maka itu rusak). / pergelangan tangan
Milamber
1
DITEMUKAN BUG !!!!! YA!!!!. Akan segera memperbarui jawaban saya
Pieter Goosen

Jawaban:

8

UPDATE 21-01-2016 19:35 SA SAE - BUG DITEMUKAN !!!!! YA!!!!!!

Saya akhirnya menemukan bug. Seperti yang Anda nyatakan dalam pembaruan terakhir Anda, kegagalan hanya terjadi ketika $post_contentmemiliki <!--nextpage-->tag di konten. Saya mengujinya, dan memang mengkonfirmasi bahwa halaman lain setelah halaman setelah <!--nextpage-->mengembalikan 404 dan kemudian halaman mendapat pengalihan kembali ke halaman pertama.

Ini disebabkan oleh baris kode berikut dalam handle_404()metode yang diperkenalkan di WPkelas di 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 );
}

Apa yang dilakukan kode ini adalah, setiap kali <!--nextpage-->tag diset pada post_content, ia akan mengembalikan 404 ketika setiap halaman diakses yang ditambahkan setelah konten melalui content_paginationfilter. Karena pengaturan 404, redirect_canonical()pengalihan halaman yang ditambahkan kembali ke halaman pertama

Saya telah mengajukan tiket trac tentang masalah ini yang dapat Anda periksa di sini

Pada saat penulisan, belum ada umpan balik, jadi pastikan untuk secara teratur memeriksa status tiket

SOLUSI SAAT INI - KOMENTAR TIKET TRAC A / W

Untuk saat ini, sampai kami mendapatkan umpan balik dan kemungkinan perbaikan di rilis mendatang, cukup hapus baris-baris itu dari WPkelas hingga pemberitahuan lebih lanjut

WAKTU APA ITU ...... WAKTU MENGERJAKAN !!!!!

Saya punya waktu untuk sepenuhnya menguji ini. Saya mengambil kode Anda dan mengujinya pada:

  • Instalasi lokal v4.3 saya

  • Instal lokal v4.4.0 saya

  • Instalasi lokal v4.4.1 saya

  • Selesaikan pemasangan lokal baru v4.4.1 dengan hanya Hello Worldpos dan Sample Pagehalaman

dengan permalinks saya disetel ke

  • default dan

  • Post Name

Berikut ini adalah kode pengujian saya untuk membuat 4 halaman dengan di dalam pos pengujian saya.

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

Saya juga diuji

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

untuk ukuran baik

Pada setiap instalasi dan permalink struktur, semua kode Anda berfungsi ( kecuali content_paginationpada v4.3 yang diharapkan ).

Saya juga menetapkan Sample Pagesebagai halaman depan statis, tetapi gagal pada halaman 2 sebagai penyesuaian dengan bug seperti yang dijelaskan dalam JAWABAN ASLI dan ** EDIT

Jadi kesimpulannya adalah bahwa ini tidak ada hubungannya dengan bug di core atau bug lain di core. Dari komentar, ada sesuatu yang tidak disetel pada objek yang diminta pada halaman posting paged, dan itu adalah sesuatu yang perlu kita debug. Sayangnya karena masalah ini sekarang dilokalkan, saya tidak dapat memberikan solusi yang tepat.

MENGGAMBARKAN MASALAH

Anda perlu menggunakan alur karya berikut untuk men-debug masalah

  • Dapatkan sendiri kopi kafein tinggi dalam jumlah besar dengan banyak gula

  • Ambil cadangan Anda db

  • Unduh dan pasang plugin berikut ( Saya tidak memiliki afiliasi dengan plugin apa pun )

    • Objek debug untuk debugging normal. Setelah terinstal dan diseting, perbaiki semua bug jelas yang mungkin disorot oleh plugin. Jangan terus ke poin utama berikutnya jika Anda memiliki bug yang jelas. Perbaiki dulu

    • DB Manager yang akan Anda gunakan untuk memperbaiki dan membersihkan DB Anda sebelum Anda melanjutkan ke poin-poin berikutnya

  • Hapus semua cache, browser, dan plugin

  • Nonaktifkan semua plugin dan kosongkan semua cache lagi untuk ukuran yang baik. Karena masalah ini terlihat seperti masalah pengalihan, saya mungkin akan menonaktifkan semua plugin yang mungkin ada hubungannya dengan pengalihan. Mungkin satu plugin belum kompatibel dengan v4.4. Periksa apakah masalah tetap ada, jika benar, lanjutkan ke poin selanjutnya, mari kita lihat lebih detail

    Mulailah dengan menonaktifkan semua plugin, Anda juga dapat memulai dengan hanya menonaktifkan plugin yang mungkin jelas menyebabkan masalah. Uji dengan benar instal Anda setelah aktivasi masing-masing dan setiap plugin. Plugin pertama yang diaktifkan yang menyebabkan masalah adalah pelakunya. Jika demikian, hubungi pembuat plugin dengan detail debugging. Pastikan untuk menghapus cache Anda setelah setiap aktivasi plugin hanya untuk ukuran yang baik

  • Jika Anda mencapai titik ini, titik peluru sebelumnya tidak menyelesaikan masalah Anda. Langkah selanjutnya adalah beralih ke tema yang dibundel untuk menghilangkan tema Anda sebagai masalah. Sekali lagi, bersihkan cache.

  • Jika semuanya gagal, Anda memiliki dua opsi lagi

    • Hapus .htaccessdan biarkan WordPress membuat yang baru

    • Instal ulang WordPress

Ini harus menyelesaikan masalah Anda. Jika tidak, Anda harus mempertimbangkan bug di inti WordPress yang mungkin menyebabkan masalah.

Saya harap ini membantu dalam menangkap bug

MEMPERBARUI

Seharusnya saya benar-benar terhubung dengan tiket trac yang mengikuti yang tampaknya menjelaskan semuanya lebih detail

Tambalan yang menarik dan cukup relevan dari tiket trac di atas

Saya tidak dapat menguji secara konkret hal seperti itu pada saat ini, tetapi Anda harus bekerja melalui patch yang disarankan dan mengujinya. Apa yang dapat saya ambil adalah bahwa kode yang sama redirect_canonical()yang bertanggung jawab untuk pagination halaman depan statis juga bertanggung jawab untuk pagination pada halaman tunggal.

JAWABAN ASLI

Satu halaman ( seperti halaman depan statis ) digunakan get_query_var( 'page' )untuk paginasi. Dengan WordPress 4.4 ( dan di v4.4.1 ), muncul bug yang menyebabkan masalah dengan pagination saat digunakan get_query_var( 'page' )untuk pagination.

Laporan bug saat ini, seperti tiket trac # 35365 , hanya menyebutkan halaman depan statis yang memiliki masalah dengan pagination, tetapi karena bug berhubungan dengan get_query_var( 'page' ), saya akan berpikir bahwa ini juga akan menyebabkan masalah dengan pagination posting tunggal yang juga digunakan get_query_var( 'page' ).

Anda harus mencoba tambalan seperti yang dijelaskan dalam tiket trac. Jika ini berhasil, Anda bisa menerapkan tambalan dan menunggu v4.4.2 yang akan memperbaiki bug ini

Pieter Goosen
sumber
1
Mudah-mudahan ini adalah masalah untuk OP, kedengarannya sangat mungkin (tidak dapat menggali hari ini ;-).
birgire
1
Mencoba memperbaiki, juga menonaktifkan permalink; tidak ada perubahan.
Milamber
1
Saya akan melihat ini segera setelah saya punya waktu. Saya merasa bahwa jawabannya terletak pada bug, itu hanya untuk melacaknya. Semoga Anda menemukan solusinya segera
Pieter Goosen
2
Periksa pembaruan saya, saya telah menemukan bug dan juga mengajukan laporan bug
Pieter Goosen
2
Dikonfirmasi bahwa semua 3 metode berfungsi setelah garis-garis tersebut dikomentari :) tiket tertutup 35544 yang mendukung Anda
Milamber
4

Perhatikan bahwa ada kesalahan sintaks untuk ketiga contoh yang Anda berikan:

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

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

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

di mana tambahan )ditambahkan.

Ganti baris ini ke:

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

add_action( 'the_post', 'custom_content' );

add_action( 'template_redirect', 'custom_content' );

Saya tidak akan merekomendasikan bermain-main dengan objek global secara umum, jadi saya pikir contoh terakhir Anda dengan content_paginationfilter adalah cara untuk pergi ke sini.

Anda mungkin juga ingin menghindari menambahkan halaman kosong dengan:

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

Ada juga yang hilang di )sini:

$content = html_entity_decode(stripslashes(get_option('custom_content'));
birgire
sumber
1
Kesalahan saya, ekstra) ditinggalkan dari menyalin dan menempelkan mereka di luar kelas yang mereka ikuti dengan implementasi saya yang sebenarnya. Saya telah menghapusnya dari op. Sayangnya versi content_pagination juga tidak memperbaiki kesalahan 404.
Milamber
1
Ada juga yang hilang) di baris $ content - lihat pembaruan. @Milamber
birgire
1
Terima kasih sudah diperbaiki. Kesalahan sintaks yang Anda lihat dalam kode op berasal dari penyederhanaannya untuk posting.
Milamber
2
ok, saya sudah menguji ini pada vanilla WP 4.4 menginstal dengan tema Twenty Sixteen dan berfungsi seperti yang diharapkan di sana, jadi saya pikir itu mungkin sesuatu yang lain di setup Anda yang memberi Anda masalah. @Milamber
birgire
1
Aneh, saya mencobanya di 2 lingkungan dev yang berbeda dengan Twentyfifteen dan mereka berdua memiliki hasil yang sama. Saya akan melihatnya lagi, terima kasih @birgire
Milamber