如果发布状态为挂起,则显示修订

时间:2011-09-12 作者:Elliott

如果页面处于“待定”状态,我将尝试显示最新的后期修订,默认情况下,如果页面处于待定状态,则显示404。但我希望它显示最新版本,直到页面更新。

下面的代码似乎只显示标题,我使用了一个钩子wp_insert_post_data 如果用户角色不是admin,则将帖子状态更改为“挂起”的函数。

该帖子在数据库中设置为挂起,但我无法获取以下代码来显示最新版本?

我也不知道如何防止它重定向到404页面?如果我登录,它将显示帖子,否则将显示404页。

    <?php while (have_posts()) : the_post(); ?>    
            <h1><?php the_title(); ?></h1>                          
        <?php 
        echo get_post_status(); //echo\'s pending
        if(get_post_status() == \'pending\') {
            $query = new WP_Query(array(\'post_type\' => \'revision\', \'post_parent\' => \'7\', \'posts_per_page\' => 1)); // 7 is the current page ID
            if ($query->have_posts()) {                 
                while ($query->have_posts()) {                      
                    $query->the_post();                     
                    the_content();
                    echo $post->ID;
                }
            }
            wp_reset_postdata();
        } else {
            the_content(); 
        }               
        ?>           
    <?php endwhile; ?>
<?php endif; ?>
有什么建议吗?如果页面处于挂起状态,是否有更简单的方法显示修订?

谢谢

Edit:

好的,我似乎使用以下代码工作:

if(get_post_status() == \'pending\') {
   $query = \'SELECT ID FROM `wp_posts` WHERE `post_parent` = \'.$post->ID.\' AND `post_type` = "revision" AND `post_status` = "pending" AND `post_title` <> "Auto Draft" AND TRIM(`post_content`) <> "" AND `post_name` NOT LIKE "%autosave%" ORDER BY `post_modified` DESC LIMIT 1\';
   $revision_id = $wpdb->get_var($query);
   $revision = wp_get_post_revision($revision_id);
   $content = $revision->post_content;              
   $content = apply_filters(\'the_content\', $content);
   $content = str_replace(\']]>\', \']]>\', $content);
   echo $content;
   wp_reset_postdata();
} else {
   the_content(); 
}
所以现在的问题是-How can I prevent a page which is set as pending to redirecting to the 404 page?

2 个回复
SO网友:Brian Fegter

我花了一段时间,但我明白了!其工作原理如下:

  1. 由于除了URI之外,您没有对帖子的引用,我们将URI分割出来,以检查具有该页面名称的页面。
  2. 如果有页面,我们将获得最新修订的子版本。
  3. 对查询进行黑客攻击,以强制我们的修订slug获取该页面的来源。
    1. 这非常有效,因为它提供了一个工作永久链接的外观。它充当伪永久链接。

      add_action( \'wp\', \'override_404\' );
      function override_404($query) {
      
          if(is_404):
      
              $uri = trim($_SERVER[\'REQUEST_URI\'], \'/\');
              $segments = explode(\'/\', $uri);
              $slug_index = count($segments);
      
              $page_slug = $segments[$slug_index - 1];
              $page = get_page_by_path($page_slug, OBJECT, \'page\');
      
              $revision_args = array(\'post_parent\' => $page->ID, \'post_type\' => \'revision\', \'post_status\' => \'inherit\', \'numberposts\' => 1);
              $revision = array_shift(get_children($revision_args));
      
              if($revision):
                  $query->query_vars[\'pagename\'] = $revision->page_name;          
                  $query->query_string = "pagename={$revision->page_name}";
                  $query->request = $revision->page_name;
                  $query->matched_rule = "({$revision->page_name})(/[0-9]+)?/?$";
                  $query->matched_query = "pagename={$revision->page_name}&page=";
                  $query->did_permalink = 1;
              endif;
      
          endif;
      
          return $query;
      }
      
      唯一需要注意的是,有时slug在发布页面之前不会保存。为了使其正常工作,slug必须位于数据库中。干杯

SO网友:Michael

我最近一直在研究这个问题,如果404覆盖不起作用,我想发布我的解决方案。

基本上WordPress将挂起的帖子状态设置为private而不是public(这就是为什么如果您没有以管理员身份登录,您将无法看到它),因此我们需要重置它:

function override_pending_post_status() {
  register_post_status( \'pending\', array(
    \'label\'       => _x( \'Pending\', \'post\' ),
    \'protected\'   => true,
    \'_builtin\'    => true, /* internal use only. */
    \'label_count\' => _n_noop( \'Pending <span class="count">(%s)</span>\', \'Pending <span class="count">(%s)</span>\' ),
    \'public\'      => true,
  ) );
}

add_action( \'init\', \'override_pending_post_status\' );

结束

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post