问题描述

更新 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-1n<!--nextpage-->nThis is the extra page v1-2n<!--nextpage-->nThis is the extra page v1-3";
    $post->post_content .= $content;
}

原始问题

在 4.4 之前,我可以添加一个额外的页面到一个 muttipage 的帖子与以下:

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

也尝试利用 4.4 中添加的新的 content_pagination 过滤器:

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

在这一点上,我没有想法如何恢复此功能,任何帮助将不胜感激。

最佳解决方案

更新 21-01-2016 19:35 SA 时间 – BUG FOUND !!!!! 是啊!!!!!!

我终于找到了这个 bug 。正如您在上次更新中所述,故障仅在 $post_content 在内容中具有<!--nextpage--> 标记时发生。我测试了它,并确认在<!--nextpage--> 返回 404 之后页面之后的任何其他页面,然后该页面重定向回到第一页。

这是由于 handle_404()中的 the following lines of code,它是在 WordPress 4.4 中的 WP 类中引入的

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

这个代码是什么,每当在 post_content 中设置<!--nextpage--> 标签时,当通过 content_pagination 过滤器在内容后面访问任何页面时,它将返回 404 。由于设置了 404,redirect_canonical()将任何附加页面重定向到第一页

我已经提交了关于这个问题的 trac 门票,您可以在这里查看

在撰写本文时,还没有任何反馈,所以请务必定期查看机票的状态

当前解决方案 – A /W TRAC TICKET FEEDBACK

现在,直到我们在将来的版本中得到任何反馈和可能的修复,只需从 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;
}

好的措施

在每个安装和永久链接结构中,您的所有代码都可以工作 (除了预期的 v4.3 上的 content_pagination) 。

我也将 Sample Page 设置为静态首页,但是在第 2 页上失败,作为我的原始答案和**编辑中描述的错误的构造

所以结论是这与核心中的错误或核心中的任何其他错误无关。从评论中,有人在分页的帖子页面上取消了查询对象,这就是我们需要调试的东西。不幸的是,由于这个问题现在已经被本地化了,我无法给出确切的解决方案。

调查问题

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

  • 给自己一大堆高咖啡,大量的糖

  • 备份你的 db

  • 下载并安装以下插件 (我没有附属于任何插件)

    • Debug Objects 正常调试。一旦安装和安装,修复插件可能突出显示的所有明显的错误。如果您有明显的错误,请不要继续下一个主要的子弹点。先修好

    • DB Manager,您将用于修复和清理您的数据库,然后再继续下一个子弹点

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

  • 停用所有插件,并重新清除所有高速缓存。因为这个问题看起来像一个重定向问题,我可能会先关闭所有可能与重定向有关的插件。可能是一个插件还不兼容 v4.4 。检查问题是否持续,如果是,继续下一个项目符号,否则,让我们更详细地看看这一点开始,通过停用所有插件,您也可以通过停用可能显而易见导致问题的插件来启动。在激活每个插件后,正确测试安装。导致这个问题的第一个插件被激活将成为罪魁祸首。在这种情况下,请使用调试详细信息与插件作者联系。只要确保在每次插件激活之后清除缓存,才能很好的衡量

  • 如果达到这一点,以前的项目符号并没有解决你的问题。下一步应该是切换到捆绑的主题,以消除您的主题为问题。再次,清除缓存。

  • 如果一切都失败了,您将再留下两个选项

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

    • 重新安装 WordPress

这应该可以解决你的问题。如果没有,您需要考虑可能导致该问题的 WordPress 核心中的错误。

我希望这有助于捕捉这个 bug

UPDATE

我应该实际上连接到这个似乎更详细地解释一切的火鸡

有趣的和相当相关的补丁从上面的 trac 门票

我现在不能具体地测试任何东西,但你应该通过建议的补丁进行测试。我可以拿到的是,redirect_canonical()中负责静态前缀分页的代码也是单页分页的责任。

原始答案

单页 (如静态首页) 使用 get_query_var( 'page' )进行分页。使用 WordPress 4.4(和 v4.4.1),当使用 get_query_var( 'page' )进行分页时,出现了一个错误,导致分页问题。

目前的错误报告,比如 trac ticket # 35365,只提到有分页问题的静态首页,但是由于该 bug 与 get_query_var( 'page' )有关,我会认为这也会导致使用 get_query_var( 'page' )的单后分页问题。

您应该尝试在 trac 门票中描述的修补程序。如果这个工作,你可以应用补丁并等待 v4.4.2 这将修复这个错误

次佳解决方案

请注意,您提供的所有这三个示例都有一个语法错误:

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

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。