web-dev-qa-db-ja.com

投稿ステータスが保留中の場合は改訂を表示

ページが「保留中」の場合は最新の投稿リビジョンを表示しようとしています。保留中の場合はデフォルトで404が表示されます。しかし、私はそれがページが更新されるまで最新のリビジョンを表示することを望みます。

以下のコードはタイトル以外何も表示していないようです。私はユーザーの役割がadminでない場合、投稿のステータスを "pending"に変更するwp_insert_post_data関数へのフックを使用しました。

投稿はデータベース内で保留中に設定されていますが、最新のリビジョンを表示するための以下のコードを取得できません。

私はまたそれが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; ?>

何かアドバイス?ページが保留中の場合にリビジョンを表示する簡単な方法はありますか?

ありがとうございます。

編集:

さて、私はそれが以下のコードを使って働いているように思えます:

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(); 
}

だから今の質問は - どのように私は404ページにリダイレクトするために保留中に設定されているページを防ぐことができますか?

2
Elliott

時間がかかりましたが、入手できました。これは次のように機能します。

  1. URI以外の投稿への参照はないため、そのpage_nameを持つページをチェックするためにURIを分割します。
  2. ページがあれば、最新の改訂子をもらう
  3. 改訂版スラグにページのソースを表示させるようにクエリをハックします。

パーマリンクが機能しているように見えるので、これは膨らみます。それは疑似パーマリンクとして機能します。

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;
}

唯一の注意点は、スラッグがページを公開するまで保存されないことです。これが正しく機能するためには、スラッグはデータベースになければなりません。乾杯!

2
Brian Fegter

私は最近この問題に取り組んでいます、そして404上書きがうまくいかないなら、私の解決策を投稿したいと思います。

基本的にWordPressは保留中の投稿ステータスを公開ではなく非公開に設定しているため(管理者としてログインしていないと表示できない理由です)、リセットする必要があります。

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' );
0
Michael