问题描述
更新 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。