附加内容中带有<!-nextpage->的4.4


14

更新2016-01-21

我目前所有的测试都是在新安装的4.4.1上完成的,并具有以下设置: Plain permalinks Twentysixteen Theme No plugins activated

如果该帖子只有一页(即<!--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之前,我可以使用以下内容在多页帖子后附加一个页面:

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

在这一点上,我对如何还原此功能还没有任何想法,我们将不胜感激。


好吧,所以我对此进行了更新,很遗憾,这不是一个积极的方面。如果额外页面为第2页,则显然可以在全新安装上使用。但是,如果额外页面为第3页(或更高版本,则它会中断)。/腕
Milamber

1
发现臭虫!!!!! 是的!即将更新我的答案
Pieter Goosen

Answers:


8

更新21-01-2016 19:35 SA TIME-发现错误!!!!! 是的!!!!!!

我终于找到了错误。如您在上次更新中所述,仅当内容中$post_content包含<!--nextpage-->标签时,才会发生失败。我对其进行了测试,并确认在<!--nextpage-->返回返回404,然后该页面被重定向回第一页。

这是由于WordPress 4.4 中的中介绍的方法中的以下代码行handle_404()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 );
}

该代码的作用是,每当在<!--nextpage-->中设置了标记post_content时,当访问任何页面时,它将返回404,该页面会通过content_pagination过滤器附加到内容之后。由于设置了404,因此redirect_canonical()将任何附加页面重定向回第一页

我已就此问题提交了追踪证明,您可以在此处查看

在撰写本文时,尚无任何反馈,因此请确保定期检查票证的状态

当前解决方案-A / W跟踪票证反馈

目前,在我们获得将来版本的任何反馈和可能的修复之前,只需从WP类中删除这些行,直至另行通知

现在几点了...这是调试时间!!!!!

我有时间完全测试一下。我接受了您的代码并对其进行了测试:

  • 我的v4.3本地安装

  • 我的v4.4.0本地安装

  • 我的v4.4.1本地安装

  • 仅使用Hello World帖子和Sample Page页面即可完成新的v4.4.1本地安装

我的永久链接设置为

  • 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为静态首页,但由于与我的原始答案和** EDIT中所述的错误一致,因此在第2页上失败了

因此结论是,这与内核中的错误或内核中的任何其他错误无关。从注释中可以看出,某些事情正在使分页的帖子页面上的查询对象失效,而这正是我们需要调试的事情。不幸的是,由于此问题已本地化,因此我无法提供确切的解决方案。

调试问题

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

  • 为自己准备大量含糖量高的咖啡因咖啡

  • 为您备份数据库

  • 下载并安装以下插件(我没有任何插件的隶属关系

    • 用于正常调试的调试对象。一旦安装和设置,修复所有可能由插件突出显示的错误。如果存在明显的错误,请不要继续到下一个主要要点。首先修复它们

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

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

  • 停用所有插件,并再次清除所有缓存,以备不时之需。因为此问题看起来像是重定向问题,所以我可能首先会停用所有可能与重定向有关的插件。可能是一个插件尚未与v4.4兼容。检查问题是否仍然存在,如果存在,请继续执行下一个要点,否则,请更详细地研究一下

    首先停用所有插件,也可以仅停用可能很明显引起问题的插件。激活每个插件后,请正确测试您的安装。导致问题的第一个激活的插件将是罪魁祸首。在这种情况下,请与插件作者联系并提供调试详细信息。只要确保在每次激活插件后都清除缓存,这是一个很好的措施

  • 如果达到了这一点,则上一个要点不能解决您的问题。下一步应该切换到捆绑主题,以消除您的主题问题。再次清除缓存。

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

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

    • 重新安装WordPress

这应该可以解决您的问题。如果不是,则需要考虑WordPress核心中的错误,这可能是导致该问题的原因。

我希望这有助于捕获错误

更新

我实际上应该链接到下面的追踪票,该票似乎可以更详细地解释所有内容

上述票证中有趣且非常相关的补丁

目前,我无法具体测试任何东西,但是您应该研究建议的补丁并进行测试。我可以得到的是,redirect_canonical()负责静态首页分页的同一代码也负责单页的分页。

原始答案

单页(如静态首页)用于get_query_var( 'page' )分页。在WordPress 4.4(以及v4.4.1中)中,出现了一个错误,该错误在get_query_var( 'page' )用于分页时会导致分页问题。

当前的错误报告(例如,票务编号35365)仅提及存在分页问题的静态首页,但由于该错误与get_query_var( 'page' ),我认为这也会导致也使用分页后的问题get_query_var( 'page' )

您应按照故障单中所述尝试使用补丁。如果这项工作有效,您可以应用补丁并等待v4.4.2修复此错误


1
希望这是OP的问题,听起来很可能(今天无法深入探讨;-)。
birgire

1
尝试修复,也禁用了永久链接;不用找了。
2016年

1
有时间我会尽快调查。我确实认为答案就在于错误,而这只是对其进行跟踪。希望您早日找到解决方案
Pieter Goosen

2
检查我的更新,我发现了该错误,并且还提交了错误报告
Pieter Goosen

2
确认一旦注释掉这些行,所有3种方法都将起作用:)封闭票35544对您有利
Milamber 16'Jan

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
我的错误是多余的),它们是通过将它们复制并粘贴到实际实现的类中而遗留下来的。我已将它们从操作中删除。不幸的是,content_pagination版本也无法纠正404错误。
Milamber

1
$ content行中也缺少)-请参阅更新。@Milamber
birgire 2015年

1
谢谢,固定。您在操作码中看到的任何语法错误均来自简化该帖子。
Milamber

2
好的,我已经在带有“二十十六”主题的香草WP 4.4安装上对此进行了测试,并且可以按预期工作,因此我认为您的设置中可能存在其他问题。@Milamber
birgire 2015年

1
奇怪,我在Twentyfifteen的2个不同开发环境中尝试过,结果都相同。我会再看一下,谢谢@birgire
Milamber
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.