Php Wordpress未来版(未显示)
我被要求修复wordpress网站上的一个问题。这个问题是因为应该使用帖子而不是页面。然而,该网站已经建立并运行,最快的选择将是使用各种各样的黑客来解决问题 该网站有一个事件部分,每个事件都是一个页面(这就是问题所在,应该是一篇文章)。为了拥有即将发生和过去的事件,使用了post日期,因此即将发生的事件的post状态为“未来” 有一个事件列表页,通过使用正确的查询\u post()可以很好地显示这些事件。尽管当您点击实际事件(这是将来的页面)时会出现问题。如果您以管理员身份登录,则页面会显示,但如果您未登录,则会显示404页面 现在,如果他们在哪里张贴,那么“未来就是现在!”插件将解决这个问题。我觉得解决这个问题的唯一办法是重写部分核心Wordpress文件 任何建议都很好,我对Wordpress有很多经验,所以即使你能给我指出正确的方向 干杯, 杰森 [更新] 感谢maiorano84的详细回复。从长远来看,我打算将他们转到帖子中,但与此同时,他们要求我们在不更改任何URL的情况下尽快修复(今天他们发送了一封包含事件列表的群发电子邮件,但没有检查任何链接) 在这种情况下,包含post_status future的解决方案不起作用,因为wordpress没有进入加载模板的阶段。wordpress核心中的某些东西阻止了它走那么远。理想情况下,如果它们是一个钩子,我可以同时使用它来覆盖这个行为,这将是非常好的,但如果真是这样,我将临时编辑核心文件 [更新2] 我现在知道这两个函数需要编辑或使用与之相关的钩子 我们的第一个Php Wordpress未来版(未显示),php,wordpress,wordpress-theming,Php,Wordpress,Wordpress Theming,我被要求修复wordpress网站上的一个问题。这个问题是因为应该使用帖子而不是页面。然而,该网站已经建立并运行,最快的选择将是使用各种各样的黑客来解决问题 该网站有一个事件部分,每个事件都是一个页面(这就是问题所在,应该是一篇文章)。为了拥有即将发生和过去的事件,使用了post日期,因此即将发生的事件的post状态为“未来” 有一个事件列表页,通过使用正确的查询\u post()可以很好地显示这些事件。尽管当您点击实际事件(这是将来的页面)时会出现问题。如果您以管理员身份登录,则页面会显示,但
是_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;
}