使预定帖子可用的代码中断了 Wordpress 中的预览
Code for making scheduled posts available breaks preview in Wordpress
问题
有一段代码可以通过 URL 为外部用户提供预定的 posts。代码本身工作得很好——但它似乎与编辑器的预览功能混淆了。
是什么原因导致此问题,如何解决?
代码
下面的代码是我用来制作 schedulesd 帖子的代码:
//this is inside the functions.php
function show_future_posts($posts)
{
global $wp_query, $wpdb;
if (is_single() && $wp_query->post_count == 0) {
$posts = $wpdb->get_results($wp_query->request);
for ($i = 0; $i < sizeof($posts); $i++) {
if ($posts[$i]->post_status == 'trash') {
unset($posts[$i]);
$posts = array_values($posts);
}
}
}
return $posts;
}
add_filter('the_posts', 'show_future_posts');
重现步骤
- 新建post
- 计划post
- 编辑一些东西
- 点击预览
一些观察:
- 只要 post 被标记为草稿,预览就可以正常工作。
- updating/saving (ctrl + s) 后预览正确
- 我认为这与 this 等已知问题无关。删除有问题的代码时,自动保存功能工作正常
- 已发布的 post 表现出与计划的行为相同的行为
- 编辑器 (gutenberg/default) 在这种情况下似乎无关紧要
非常感谢任何帮助。谢谢!
我找到了解决方案:
问题是 $posts
在条件内被新的 posts 数组覆盖。新的 posts 数组不包含最近的预览更改。所以我检查了一下 post 是否处于 prview 模式,然后覆盖新 posts 数组中的 post 内容。
下面的代码是我想出的。它尚未优化但有效。欢迎在评论中分享您的优化。我会确保将它们包含在此解决方案中。
function show_future_posts($posts)
{
global $wp_query, $wpdb;
if (is_single() && $wp_query->post_count == 0) {
$initial_posts = $posts; //save initial posts, in case we need to overwrite the new $posts content
$posts = $wpdb->get_results($wp_query->request);
/*
* $initial_posts_exists_and_has_content is true when previewing scheduled posts.
* We then can overwrite the post-content with the initial content
* When viewing already published posts it is also true, but doesn`t contain the latest changes.
* The content will still be overwritten, but this wont have any effect, since $initial_posts and $posts are
* equal in this case.
*/
$initial_posts_exists_and_has_content = !empty($initial_posts) && !is_null($initial_posts[0]->post_content);
if($initial_posts_exists_and_has_content){
$posts[0]->post_content = $initial_posts[0]->post_content;
}
for ($i = 0; $i < sizeof($posts); $i++) {
if ($posts[$i]->post_status == 'trash') {
unset($posts[$i]);
$posts = array_values($posts);
}
}
}
return $posts;
}
问题
有一段代码可以通过 URL 为外部用户提供预定的 posts。代码本身工作得很好——但它似乎与编辑器的预览功能混淆了。 是什么原因导致此问题,如何解决?
代码
下面的代码是我用来制作 schedulesd 帖子的代码:
//this is inside the functions.php
function show_future_posts($posts)
{
global $wp_query, $wpdb;
if (is_single() && $wp_query->post_count == 0) {
$posts = $wpdb->get_results($wp_query->request);
for ($i = 0; $i < sizeof($posts); $i++) {
if ($posts[$i]->post_status == 'trash') {
unset($posts[$i]);
$posts = array_values($posts);
}
}
}
return $posts;
}
add_filter('the_posts', 'show_future_posts');
重现步骤
- 新建post
- 计划post
- 编辑一些东西
- 点击预览
一些观察:
- 只要 post 被标记为草稿,预览就可以正常工作。
- updating/saving (ctrl + s) 后预览正确
- 我认为这与 this 等已知问题无关。删除有问题的代码时,自动保存功能工作正常
- 已发布的 post 表现出与计划的行为相同的行为
- 编辑器 (gutenberg/default) 在这种情况下似乎无关紧要
非常感谢任何帮助。谢谢!
我找到了解决方案:
问题是 $posts
在条件内被新的 posts 数组覆盖。新的 posts 数组不包含最近的预览更改。所以我检查了一下 post 是否处于 prview 模式,然后覆盖新 posts 数组中的 post 内容。
下面的代码是我想出的。它尚未优化但有效。欢迎在评论中分享您的优化。我会确保将它们包含在此解决方案中。
function show_future_posts($posts)
{
global $wp_query, $wpdb;
if (is_single() && $wp_query->post_count == 0) {
$initial_posts = $posts; //save initial posts, in case we need to overwrite the new $posts content
$posts = $wpdb->get_results($wp_query->request);
/*
* $initial_posts_exists_and_has_content is true when previewing scheduled posts.
* We then can overwrite the post-content with the initial content
* When viewing already published posts it is also true, but doesn`t contain the latest changes.
* The content will still be overwritten, but this wont have any effect, since $initial_posts and $posts are
* equal in this case.
*/
$initial_posts_exists_and_has_content = !empty($initial_posts) && !is_null($initial_posts[0]->post_content);
if($initial_posts_exists_and_has_content){
$posts[0]->post_content = $initial_posts[0]->post_content;
}
for ($i = 0; $i < sizeof($posts); $i++) {
if ($posts[$i]->post_status == 'trash') {
unset($posts[$i]);
$posts = array_values($posts);
}
}
}
return $posts;
}