我被要求在wordpress网站上解决问题。问题是由于应该使用帖子而不是页面。然而,该网站已启动并运行,最快的选择是使用各种黑客来解决问题。
该网站有一个事件部分,每个事件都是一个页面(这是问题,应该真的是一个帖子)。为了使用即将发生的事件和过去的事件,使用了发布日期,因此即将发生的事件的帖子状态为“future”。
通过使用正确的query_post(),可以显示事件的列表页面。虽然当您点击实际事件(这是未来页面)时会出现问题。如果您以管理员身份登录,则页面会显示,但如果您未登录,则会显示404页面。
现在,如果他们在哪个帖子那么“未来就是现在!”插件可以解决这个问题。我有一种感觉,解决问题的唯一方法是重写部分核心Wordpress文件。
任何建议都会很棒,我对Wordpress有很多经验,所以即使你能指出我正确的方向。
干杯, 杰森
[更新]
感谢maiorano84的详细回复。从长远来看,我打算将它们移到帖子中,但与此同时他们已经要求我们尽快修复它而不更改任何网址(今天他们发送了一封包含事件列表的大量电子邮件而没有检查任何链接)
包含post_status future的解决方案在这种情况下不起作用,因为wordpress没有进入加载模板的阶段。 wordpress核心中的某些东西阻止了它走得那么远。理想情况下,如果它们是一个钩子,我可以用它来覆盖这种行为,同时这将是非常好的,但如果涉及到它我会暂时编辑核心文件。
[更新2]
我现在知道需要编辑的两个函数或者使用与它们相关的钩子。
首先我们is_404()
需要更改为不将未来的页面添加为404
第二,如果页面是未来,我们需要is_page()
返回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 **/
答案 0 :(得分:1)
您实际上可以在页面查询中添加'future'的post_status参数。你真的不应该修改你的核心文件,以便做你想要的。因此,在您的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();
?>
这是过于简单化,但在相应的文件中使用正确的查询将允许您显示您喜欢的页面。
此处提供更多信息:http://codex.wordpress.org/Class_Reference/WP_Query
另一件值得考虑的事情,我意识到这不是你问题的一部分,但可以很好地解决你的问题:
为什么不在客户端的服务器上创建子域,您可以在不中断用户体验的情况下修复所有内容?您可以轻松地将现有数据库导入开发环境,并在不影响实时版本的情况下进行所需的所有更改。
深思熟虑。我的建议是把这个扼杀在萌芽状态,并尽快将页面转换成帖子,否则网站会很快变成一个巨大的混乱,但这就是你的呼唤。
希望这有帮助。
<强>更新强>
我仍然建议不要改变核心文件,但是如果它是最后的手段,直到所有内容都得到修复,那么就可以了。这是我认为可能有帮助的“WP友好”解决方案:
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;
}