在4.4中使用中断的<!--NextPage-->追加内容

时间:2015-12-11 作者:Milamber

更新2016-01-21

我端的所有当前测试都是在新安装的4.4.1上进行的,设置如下:Plain permalinksTwentysixteen ThemeNo plugins activated

If the post only has 1 page (即<!--nextpage--> 没有出现在帖子中)然后extra pages are appended successfully (即使附加了多个额外页面)。

Welcome to WordPress. This is your first post. Edit or delete it, then start writing!
If the post has 2+ pages 然后是额外的页面404 and canonical redirect 转到帖子的第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\\u选项(“自定义内容”)类似于:

<!--nextpage-->
Hello World
自升级到4.4后,该代码一直不起作用;导航到其他页面会触发404错误,并且redirect_canonical 将它们发送回帖子的永久链接。禁用redirect\\u 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 个回复
最合适的回答,由SO网友:Pieter Goosen 整理而成

更新21-01-2016 19:35 SA时间-发现错误!!!!!是啊

我终于找到了bug。正如您在上次更新中所述,只有当$post_content 有一个<!--nextpage--> 内容中的标记。我测试了它,并确认了<!--nextpage--> 返回404,然后页面重定向回第一页。

这是由于the following lines of codehandle_404() 中介绍的方法WP class 在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记录单,你可以在这里查看

在撰写本文时,还没有任何反馈,因此请确保定期检查罚单的状态

当前解决方案-目前,在我们在将来的版本中获得任何反馈和可能的修复之前,只需从WP 上课时间另行通知

现在几点了。。。。。。调试时间到了

我有时间对此进行全面测试。我获取了您的代码并在以下平台上进行了测试:

我的v4。3本地安装

我的v4。4.0本地安装

我的v4。4.1本地安装

完成新v4。4.1仅使用Hello World post和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;
}
为了更好的衡量

在每个install和permalink结构上,所有代码都可以工作(content_pagination 在v4上。3这是预期的)。

我还设置Sample Page 作为一个静态首页,但在第2页上失败了,因为它符合我的ORIGINAL ANSWER and **EDIT

所以得出的结论是,这与core中的bug或core中的任何其他bug无关。从注释来看,有什么东西正在使分页帖子页面上的查询对象不稳定,这就是我们需要调试的东西。不幸的是,由于这个问题现在已本地化,我无法给出确切的解决方案。

调试问题您需要使用以下工作流来调试问题

给自己喝大量含大量糖的高咖啡因咖啡

备份数据库

下载并安装以下插件(我与任何插件都没有关联)

  • Debug Objects 用于正常调试。一旦安装并安装,修复插件可能突出显示的所有明显错误。如果您有明显的错误,请不要继续讨论下一个要点。首先修复它们

  • DB Manager 在继续下一个要点之前,您将使用它来修复和清理数据库

    清除所有缓存、浏览器和插件

    取消激活所有插件并再次清除所有缓存,以便更好地测量。因为这个问题看起来像是重定向问题,我可能会首先停用所有可能与重定向有关的插件。可能有一个插件尚未与v4兼容。检查问题是否持续存在,如果持续存在,请继续下一个要点,否则,让我们更详细地了解一下

    从停用所有插件开始,您也可以从停用可能导致问题的插件开始。在激活每个插件后,正确测试您的安装。导致问题的第一个插件将是罪魁祸首。在这种情况下,请联系插件作者以了解调试详细信息。只需确保在每次插件激活后清除缓存,以便更好地衡量

    如果您达到了这一点,那么前面的要点并不能解决您的问题。下一步应该是切换到捆绑主题,以消除作为问题的主题。再说一次,清除缓存。

    如果一切都失败了,你还有两个选择

    删除.htaccess 让WordPress创建一个新的

    重新安装WordPress

    这应该可以解决您的问题。如果没有,您需要考虑WordPress core中的一个bug,它可能会导致该问题。

    我希望这有助于捕捉错误

    更新

    我实际上应该链接到下面的trac票证,它似乎更详细地解释了一切

    上述trac票据中有趣且非常相关的补丁程序

    目前我无法具体测试任何这样的东西,但您应该完成建议的补丁并进行测试。我能发现的是redirect_canonical() 它负责静态首页的分页,也负责单页的分页。

    原始答案

    单页(类似静态首页)使用get_query_var( \'page\' ) 分页。WordPress 4.4(和v4.4.1)出现了一个bug,在使用get_query_var( \'page\' ) 用于分页。

    当前的bug报告,如trac ticket # 35365, 仅提及分页有问题的静态首页,但由于错误与get_query_var( \'page\' ), 我认为这也会导致单页分页的问题,它也使用get_query_var( \'page\' ).

    您应该尝试trac票证中描述的修补程序。如果这起作用,您可以应用补丁并等待v4。4.2将修复此错误

SO网友:birgire

请注意,您提供的这三个示例都存在语法错误:

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

相关推荐

是否可以取消对特定帖子类型的POSTS_PER_PAGE限制?

我想知道我是否可以取消特定帖子类型的posts\\u per\\u页面限制。在存档中。php页面我显示不同的帖子类型,对于特定的“出版物”帖子类型,我想显示所有帖子。我如何在不影响传统“post”类型的情况下实现这一点?