使预定帖子可用的代码中断了 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');

重现步骤

  1. 新建post
  2. 计划post
  3. 编辑一些东西
  4. 点击预览

一些观察:

非常感谢任何帮助。谢谢!

我找到了解决方案:
问题是 $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;
}