Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Wordpress未来版(未显示)_Php_Wordpress_Wordpress Theming - Fatal编程技术网

Php Wordpress未来版(未显示)

Php Wordpress未来版(未显示),php,wordpress,wordpress-theming,Php,Wordpress,Wordpress Theming,我被要求修复wordpress网站上的一个问题。这个问题是因为应该使用帖子而不是页面。然而,该网站已经建立并运行,最快的选择将是使用各种各样的黑客来解决问题 该网站有一个事件部分,每个事件都是一个页面(这就是问题所在,应该是一篇文章)。为了拥有即将发生和过去的事件,使用了post日期,因此即将发生的事件的post状态为“未来” 有一个事件列表页,通过使用正确的查询\u post()可以很好地显示这些事件。尽管当您点击实际事件(这是将来的页面)时会出现问题。如果您以管理员身份登录,则页面会显示,但

我被要求修复wordpress网站上的一个问题。这个问题是因为应该使用帖子而不是页面。然而,该网站已经建立并运行,最快的选择将是使用各种各样的黑客来解决问题

该网站有一个事件部分,每个事件都是一个页面(这就是问题所在,应该是一篇文章)。为了拥有即将发生和过去的事件,使用了post日期,因此即将发生的事件的post状态为“未来”

有一个事件列表页,通过使用正确的查询\u post()可以很好地显示这些事件。尽管当您点击实际事件(这是将来的页面)时会出现问题。如果您以管理员身份登录,则页面会显示,但如果您未登录,则会显示404页面

现在,如果他们在哪里张贴,那么“未来就是现在!”插件将解决这个问题。我觉得解决这个问题的唯一办法是重写部分核心Wordpress文件

任何建议都很好,我对Wordpress有很多经验,所以即使你能给我指出正确的方向

干杯, 杰森

[更新]

感谢maiorano84的详细回复。从长远来看,我打算将他们转到帖子中,但与此同时,他们要求我们在不更改任何URL的情况下尽快修复(今天他们发送了一封包含事件列表的群发电子邮件,但没有检查任何链接)

在这种情况下,包含post_status future的解决方案不起作用,因为wordpress没有进入加载模板的阶段。wordpress核心中的某些东西阻止了它走那么远。理想情况下,如果它们是一个钩子,我可以同时使用它来覆盖这个行为,这将是非常好的,但如果真是这样,我将临时编辑核心文件

[更新2]

我现在知道这两个函数需要编辑或使用与之相关的钩子

我们的第一个
是_404()
,它需要更改为不将将来的页面添加为404

第二,如果一个页面是未来的,我们需要返回true

[更新3]

我已经在核心找到了如何做到这一点。如果您转到
wp includes/query.php
第2682行。将其复制到正确工作的旧函数中。如果你有更好的办法,请告诉我。谢谢

        /** Future Pages **/
    // Check post status to determine if post should be displayed.
    if ( !empty($this->posts) && ($this->is_single || $this->is_page) ) {
        $status = get_post_status($this->posts[0]);
        $post_status_obj = get_post_status_object($status);;
        if ( !$post_status_obj->public ) {
                if  ( $post_status_obj->protected ) {
                        $this->is_preview = true;
                        print_r($status);
                        if ( 'draft' != $status ) {
                            $this->posts[0]->post_date = current_time('mysql');
                            } else {
                            $this->posts = array();
                        }
                } elseif ( $post_status_obj->private ) {
                    if ( ! current_user_can($read_cap, $this->posts[0]->ID) )
                        $this->posts = array();
                } else {
                    $this->posts = array();
                }
        }
        /** END **/

实际上,您可以将post_status参数“future”添加到页面查询中。你真的不应该为了做你想做的事而修改你的核心文件。因此,在page.php和archive.php模板(或控制事件显示的其他相关模板)上,可以执行以下操作:

<?php
$params = array('posts_per_page'=>-1, 'post_status'=>'publish,future');
$query = new WP_Query($params);
if($query->have_posts()) : while($query->have_posts()) : $query->the_post();
?>
<!-- YOUR PAGE HTML HERE -->
<?php
endwhile;endif;
wp_reset_postdata();
?>

感谢您的回复,如果您有时间,我已经用回复更新了我的问题。@dciso查看我的更新,寻找可能的替代解决方案(未测试)。如果它有帮助,考虑把核心文件原封不动地放回去。否则,在一切都重新组织之前保留您的更改是没有坏处的。不过,请记住,如果执行Wordpress更新,您将不得不再次破解核心文件,因此请小心。@dciso为了防止您碰巧尝试我的前一个示例并发现它不起作用,我已将该示例更新为一些有效的示例。试试这个,让我知道它是否有用。在这种情况下,我无法让你的解决方案工作,谢谢你的帮助。我已将此标记为答案,因为它确实提供了许多有关如何处理未来帖子/页面的信息。很抱歉,我无法提供更多帮助。祝你万事如意,如果你找到其他解决方案,请随时联系。
add_action('wp','future_redirect', 0);
function future_redirect($WP_Object)
{
    $page = is_page() ? get_page(get_the_ID()) : false;
    if($page && $page->post_status == 'future')
    {
        wp_redirect(/*YOUR REDIRECT URL*/);
        exit();
    }
    return $WP_Object;
}