การต่อท้ายเนื้อหาด้วย <! - หน้าถัดไป -> แตกใน 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 ฉันสามารถต่อท้ายหน้าเพิ่มเติมไปยังโพสต์ mutlipage ด้วยสิ่งต่อไปนี้:

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

ณ จุดนี้ฉันไม่มีแนวคิดในการกู้คืนฟังก์ชันการทำงานนี้และความช่วยเหลือใด ๆ จะได้รับการชื่นชม


เอาล่ะฉันมีการอัปเดตเกี่ยวกับเรื่องนี้โชคไม่ดีที่มันไม่ดี เห็นได้ชัดว่ามันทำงานได้กับการติดตั้งใหม่ถ้า extrapage เป็นหน้า 2 อย่างไรก็ตามหากหน้าพิเศษคือหน้า 3 (หรือสูงกว่านั้นจะแตก) / wrist
Milamber

1
พบข้อผิดพลาด !!!!! ใช่!!!!. จะอัปเดตคำตอบของฉันในไม่ช้า
Pieter Goosen

คำตอบ:


8

อัปเดต 21-01-2016 19:35 น. เวลา - BUG FOUND !!!!! ใช่!!!!!!

ในที่สุดฉันก็พบข้อผิดพลาด ตามที่คุณระบุไว้ในการอัปเดตล่าสุดความล้มเหลวจะเกิดขึ้นก็ต่อเมื่อ$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()เปลี่ยนเส้นทางหน้าต่อท้ายใด ๆ กลับไปที่หน้าแรก

ฉันได้ยื่นตั๋ว trac เกี่ยวกับปัญหานี้ซึ่งคุณสามารถดูได้ที่นี่

ในขณะที่เขียนยังไม่มีความคิดเห็นใด ๆ ดังนั้นโปรดตรวจสอบสถานะของตั๋วอย่างสม่ำเสมอ

โซลูชันปัจจุบัน - การตอบรับตั๋ว 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;
}

สำหรับการวัดที่ดี

ในแต่ละโครงสร้างการติดตั้งและ Permalink ทุกรหัสของคุณทำงาน ( ยกเว้นcontent_paginationใน v4.3 ซึ่งคาดว่า )

ฉันยังตั้งSample Pageเป็นหน้าคงที่ แต่ล้มเหลวในหน้า 2 เป็นโครงสร้างข้อบกพร่องตามที่อธิบายไว้ในคำตอบเดิมของฉันและ ** แก้ไข

ดังนั้นข้อสรุปคือสิ่งนี้ไม่เกี่ยวข้องกับจุดบกพร่องในแกนกลางหรือจุดบกพร่องอื่น ๆ ในแกน จากความคิดเห็นมีบางอย่างที่ไม่ได้ตั้งค่าวัตถุที่มีการสอบถามบนหน้าโพสต์และนี่คือสิ่งที่เราต้องแก้ไข น่าเสียดายที่ขณะนี้ปัญหานี้ได้รับการแปลเป็นภาษาท้องถิ่นแล้วฉันไม่สามารถให้วิธีแก้ไขปัญหาที่แน่นอนได้

การดีบักปัญหา

คุณต้องใช้โฟลว์งานต่อไปนี้เพื่อแก้ไขข้อบกพร่อง

  • รับคาเฟอีนสูงจำนวนมากพร้อมน้ำตาลมากมาย

  • ทำการสำรองข้อมูลของคุณ db

  • ดาวน์โหลดและติดตั้งปลั๊กอินต่อไปนี้ ( ฉันไม่มีส่วนเกี่ยวข้องกับปลั๊กอินใด ๆ )

    • Debug Objectsสำหรับการดีบักปกติ เมื่อติดตั้งและตั้งค่าแล้วให้ซ่อมแซมข้อบกพร่องที่เห็นได้ชัดทั้งหมดซึ่งอาจถูกเน้นโดยปลั๊กอิน อย่าไปยังสัญลักษณ์แสดงหัวข้อย่อยถัดไปหากคุณมีข้อบกพร่องที่เห็นได้ชัด แก้ไขก่อน

    • DB Managerที่คุณจะใช้ในการซ่อมและล้าง DB ของคุณก่อนที่คุณจะไปยังสัญลักษณ์แสดงหัวข้อถัดไป

  • ล้างแคชเบราว์เซอร์และปลั๊กอินทั้งหมด

  • ปิดใช้งานปลั๊กอินทั้งหมดและล้างแคชทั้งหมดอีกครั้งเพื่อการวัดที่ดี เนื่องจากปัญหานี้ดูเหมือนว่าจะเป็นปัญหาการเปลี่ยนเส้นทางฉันอาจจะปิดการใช้งานปลั๊กอินทั้งหมดซึ่งอาจมีส่วนเกี่ยวข้องกับการเปลี่ยนเส้นทาง อาจเป็นไปได้ว่าปลั๊กอินหนึ่งตัวยังไม่รองรับ v4.4 ตรวจสอบว่าปัญหายังคงมีอยู่ถ้ามีให้ทำต่อไปที่หัวข้อย่อยถัดไปมิฉะนั้นให้ดูที่รายละเอียดเพิ่มเติม

    เริ่มต้นด้วยการปิดใช้งานปลั๊กอินทั้งหมดคุณสามารถเริ่มต้นได้โดยเพียงแค่ปิดใช้งานปลั๊กอินที่อาจเห็นได้ชัดว่าเป็นสาเหตุของปัญหา ทดสอบการติดตั้งของคุณอย่างถูกต้องหลังจากเปิดใช้งานปลั๊กอินทุกตัว ปลั๊กอินแรกที่เปิดใช้งานที่ทำให้เกิดปัญหาจะเป็นผู้ร้าย ในกรณีดังกล่าวให้ติดต่อผู้สร้างปลั๊กอินด้วยรายละเอียดการดีบัก เพียงให้แน่ใจว่าได้ล้างแคชของคุณหลังจากการเปิดใช้งานปลั๊กอินทุกครั้งสำหรับการวัดที่ดี

  • หากคุณมาถึงจุดนี้สัญลักษณ์แสดงหัวข้อก่อนหน้าไม่สามารถแก้ปัญหาของคุณได้ ขั้นตอนต่อไปคือการเปลี่ยนไปใช้ชุดรูปแบบที่มีให้เพื่อกำจัดชุดรูปแบบของคุณเป็นปัญหา อีกครั้งล้างแคช

  • หากทุกอย่างล้มเหลวคุณจะเหลืออีกสองตัวเลือก

    • ลบ.htaccessและปล่อยให้ WordPress สร้างใหม่

    • ติดตั้ง WordPress อีกครั้ง

วิธีนี้จะช่วยแก้ปัญหาของคุณได้ หากไม่เป็นเช่นนั้นคุณต้องพิจารณาข้อบกพร่องในเวิร์ดเพรสคอร์ซึ่งอาจเป็นสาเหตุของปัญหา

ฉันหวังว่านี่จะช่วยในการตรวจจับข้อผิดพลาด

UPDATE

ฉันควรจะเชื่อมโยงกับตั๋ว trac ที่ตามมาซึ่งดูเหมือนจะอธิบายทุกอย่างในรายละเอียดมากขึ้น

แพทช์ที่น่าสนใจและค่อนข้างมีความเกี่ยวข้องจากตั๋ว 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 หากงานนี้คุณสามารถใช้โปรแกรมแก้ไขและรอ v4.4.2 ซึ่งจะแก้ไขข้อผิดพลาดนี้


1
หวังว่านี่เป็นปัญหาสำหรับ OP ฟังดูมีโอกาสมาก (ไม่สามารถขุดลงในวันนี้ ;-)
Birgire

1
พยายามแก้ไข, ปิดการใช้งานลิงก์ถาวร; ไม่มีการเปลี่ยนแปลง.
Milamber

1
ฉันจะตรวจสอบเรื่องนี้ทันทีที่ฉันมีเวลา ฉันรู้สึกว่าคำตอบอยู่ในข้อผิดพลาดมันเป็นเพียงการติดตามมัน หวังว่าคุณจะพบทางออกในเร็ว ๆ นี้
Pieter Goosen

2
ตรวจสอบการอัปเดตของฉันฉันได้พบข้อผิดพลาดและได้ยื่นรายงานข้อผิดพลาด
Pieter Goosen

2
ยืนยันว่าทั้ง 3 วิธีใช้งานได้เมื่อบรรทัดเหล่านั้นถูก
คอมเม้น

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
ความผิดพลาดของฉัน, สิ่งพิเศษ) ที่เหลือจากการคัดลอกและวางพวกเขาออกจากชั้นเรียนที่พวกเขาอยู่ในการใช้งานจริงของฉัน ฉันลบมันออกจาก op ขออภัยรุ่น content_pagination ไม่ได้แก้ไขข้อผิดพลาด 404 อย่างใดอย่างหนึ่ง
Milamber

1
นอกจากนี้ยังมีสิ่งที่ขาดหายไป) ในบรรทัดเนื้อหา $ - ดูการอัปเดต @Milamber
birgire

1
ขอบคุณคง ข้อผิดพลาดทางไวยากรณ์ใด ๆ ที่คุณเห็นในรหัส op คือการทำให้มันง่ายขึ้นสำหรับโพสต์
Milamber

2
ตกลงฉันได้ทดสอบสิ่งนี้ในการติดตั้ง vanilla WP 4.4 ด้วยธีม Twenty sixteen และทำงานได้ตามที่คาดหวังดังนั้นฉันคิดว่าอาจเป็นอย่างอื่นในการตั้งค่าของคุณที่ทำให้คุณมีปัญหา @Milamber
birgire

1
แปลกฉันลองมันในสภาพแวดล้อม dev ที่แตกต่างกัน 2 แบบกับ Twentyfifteen และพวกเขาทั้งคู่มีผลลัพธ์เหมือนกัน ฉันจะดูอีกครั้งขอบคุณ @ birgire
Milamber
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.