我被要求解决 wordpress 网站上的问题。问题是由于应该使用帖子而不是页面这一事实引起的。但是,该站点已启动并正在运行,最快的选择是使用各种 hack 来解决问题。
该网站有一个事件部分,每个事件都是一个页面(这是问题,应该是一个帖子)。为了有即将发生和过去的事件,使用发布日期,因此即将发生的事件具有“未来”的发布状态。
有一个事件列表页面,通过使用正确的 query_post() 可以很好地显示它们。尽管当您单击实际事件(这是未来页面)时会出现问题。如果您以管理员身份登录,则会显示该页面,但如果您未登录,则会显示 404 页面。
现在,如果他们在哪里发帖,那么“未来就是现在!” 插件可以解决这个问题。我有一种感觉,解决这个问题的唯一方法是重写部分核心 Wordpress 文件。
任何建议都会很棒,我对 Wordpress 有很多经验,所以即使你能指出我正确的方向。
干杯,杰森
[更新]
感谢 maiorano84 的详细回复。从长远来看,我打算将它们移至帖子,但同时他们要求我们尽快修复它而不更改任何网址(今天他们发送了一封包含事件列表的大量电子邮件,但没有检查任何链接)
在这种情况下,您包含 post_status 未来的解决方案不起作用,因为 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 **/