【问题标题】:Wordpress "freeze" homepage?WordPress“冻结”主页?
【发布时间】:2012-12-03 04:01:33
【问题描述】:

我正在为客户开发一个 Wordpress 网站。该网站有一个自定义主页。每个星期六,我的客户都会用新内容填充主页,因此旧内容会被删除,新内容会接管。所以主页每周只更新一次。

现在,我的客户希望能够在一周内逐渐用新内容填充页面并预览更改(不会让常规访问者看到更新的内容),并安排主页在周六为所有人更新新内容查看。

有没有什么办法,在周六主页重新填充新内容后,“冻结”页面并向普通访问者提供静态 HTML,而像我的客户这样的登录用户将能够看到页面的动态版本,并预览他们在一周内对其所做的更改。然后在接下来的星期六用新内容自动“刷新”页面,并再次“冻结”它?

暂存/版本控制环境在这里可能有点过头了,因为它只适用于一个页面(主页),而且我认为我的客户(非技术人员)不能很好地管理暂存。缓存插件可能也不起作用,因为据我了解,如果用户清除浏览器中的缓存,它将显示他们不希望看到的所有新内容......

任何帮助将不胜感激!谢谢!

【问题讨论】:

  • 很确定您可以将帖子和页面保存为草稿。
  • 但我需要主页始终处于活动状态,而不是草稿版本。
  • 你为什么不直接告诉客户有一个草稿主页?客户可以预览草稿,并在需要时复制并粘贴到真实主页。
  • @bozdoz - 更好的选择是 future 而不是 draft 。这还将安排帖子在某个日期发布,就像 OP 想要的那样。 @ninusik - 你可以在多个循环中使用带有条件语句的futurepost 来实现你想要的。
  • 感谢大家的建议,但据我了解,您对 Draft 和 Future 的建议适用于常规帖子(带有复制/粘贴内容) - 我的主页是一些自定义循环,所以这并不是一个简单的剪切/粘贴,不能简单地通过后期编辑屏幕进行编辑。

标签: wordpress


【解决方案1】:

我建议您使用Transients API。因此,在您的主页模板上,您将首先查看访问者是否已登录。如果他们已登录,您将显示主页的实际内容。如果它们不是,您将获得瞬态(get_transient()),如果它仍然处于活动状态(它不返回 false),则显示它。如果返回false,则执行ob_start(),显示主页的实际内容,然后执行$contents = ob_get_clean();,使用set_transient()echo $contents; 更新您的瞬态。

除此之外,您还可以向inittemplate_redirect 或您喜欢的任何其他挂钩添加操作(只要它在每次页面加载时触发)。在那里,您必须检查是否该显示主页的新内容。如果是,您使用delete_transient() 删除瞬态,因此您的主页将更新。

我现在没有时间给你一个代码示例,但我认为你应该能够弄清楚代码。

【讨论】:

  • 谢谢,我试试!这可能是解决我的问题的好方法。
【解决方案2】:

我会使用“未来”的帖子状态..

WordPress 能够“安排”帖子。 因此,您告诉您的客户将帖子“安排”到他想要的某一天,在他去的整个星期中。

然后,您有很多方法可以确保只有一个组可以看到它们,例如管理员 - 通过使用一些 conditions 之类的:

if (is_admin()) {

}

现在,正如我所说,这里有很多方法可以实现这一点,通过过滤查询、添加新查询、添加 multiple loops 等等等。

例如:

  if (is_admin()) { // if we are admin - or any other conditional wanted
// start a new query
$my_query = new WP_Query('post_status=future');
while ($my_query->have_posts()) : $my_query->the_post();
//do the thing
wp_reset_postdata();
// start the normal query ...
    }

另一种方法是使用 get_post_status() 通常在循环内

$status = get_post_status();

if ($status == 'future') && (is_admin()) {
//display post as you would
} 
// continue normal query / post display here ..

这样,该页面将对“普通”用户正常运行 - 直到更新日期,但会显示管理员的预定帖子(或登录,或特定用户,或您想要的任何条件)

更新一:根据 cmets 的概念证明:

警告:丑陋的非高效代码。概念演示..

while ( have_posts() ) : the_post(); 
// start here 

                    $future_q = new WP_Query( 'post_status=future' );

                    while ( $future_q->have_posts() ) : $future_q->the_post();
                    if (current_user_can( 'administrator' ) == TRUE ){
                    the_title();}
                    endwhile;
                    wp_reset_postdata();

                    echo 'Normal start here :';
                    the_title();

以上代码适用于我的设置。 的确,它是丑陋的代码,效率不高,不是最好的方法,但它是一个概念证明,可以使用futurepost status 来完全按照 OP 的要求进行操作。 您可以通过修改和过滤查询变量、更改循环或检查循环内部的循环状态,甚至使用 get_posts() 将这个概念付诸实践——所有这些都可以满足您想要的任何条件。

【讨论】:

  • is_admin() 检查我们是否正在查看仪表板(换句话说,管理员)页面。正确的检查方法是current_user_can( 'administrator' )。也不要忘记普通访问者应该仍然能够看到页面的内容。如果您将其设置为“未来”,那么他们将无法看到该页面,或者如果他们看到,他们将看到该页面的内容(因为您没有两个内容 - 对于“未来”帖子和帖子的当前状态)。
  • @NikolaIvanovNikolov - 普通访问者将能够看到该页面,因为如果您仔细阅读我的答案(不仅仅是代码) - 这个想法是使用多个查询/循环。一个给看得见的人,一个给看不到的人。第二 - 只要管理员登录,is_admin() 就可以工作(使用顶栏......) - 但如果你会阅读我的答案,这只是任何其他可能的 wp 条件语句的示例。 .
  • is_admin() - Codex Pageis_admin() - in sourceWP_ADMIN - constant definition。请说明如果您是管理员(或显示顶部栏),此函数将如何返回 true。也是的 - 我确实仔细阅读了你的答案。请进一步说明您将如何相应地显示旧内容和新内容。
  • 据我了解,您建议发布一篇状态为“未来”的帖子。问题的作者正在寻找的是一个页面的两种状态 - 默认(缓存,或freezed 他引用)状态 - 对普通访问者可见,每周六更新和实际状态 - 的实际内容页面,仅对管理员或周六之后的其他所有人可见。
  • 感谢两位的意见。 @Nikola Ivanov Nikolov,实际上 Transients 也是由另一个来源向我建议的,我认为这将是我的最佳解决方案,特别是考虑到主页和网站的循环和其他复杂性(这是必要的复杂性,而不是矫枉过正)。但是 Obmerk Kronen 的解决方案听起来很奇怪,我会更多地探索它,我会记住它以备不时之需,也许不是在这种情况下,而是为了将来。谢谢你们!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-09
  • 2021-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-11
相关资源
最近更新 更多