0

我被要求解决 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 **/
4

1 回答 1

1

您实际上可以在您的页面查询中添加一个“未来”的 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;
}
于 2012-05-30T20:19:22.257 回答