web-dev-qa-db-fra.com

Afficher la révision si le statut de la publication est en attente

J'essaie d'afficher la dernière révision si la page est "en attente". Par défaut, la page affiche 404 si elle est en attente. Mais je veux qu'il affiche la dernière révision jusqu'à ce que la page soit mise à jour.

Le code ci-dessous ne semble rien afficher d'autre que le titre. J'ai utilisé un raccord à la fonction wp_insert_post_data qui modifie le statut de la publication en "en attente" si le rôle de l'utilisateur n'est pas admin.

La publication est en attente dans la base de données, mais je ne parviens pas à obtenir le code ci-dessous pour afficher la dernière révision.

Je ne sais pas non plus comment l'empêcher de rediriger vers une page 404? Si je suis connecté, le message sera affiché, sinon une page 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; ?>

Aucun conseil? Existe-t-il un moyen plus simple d'afficher la révision si la page est en attente?

Merci !

Modifier:

D'accord, il semble que cela fonctionne avec le code ci-dessous:

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

Alors maintenant, la question est - Comment puis-je empêcher une page qui est définie comme étant en attente de redirection vers la page 404?

2
Elliott

Cela m'a pris un certain temps mais je l'ai eu! Cela fonctionne comme suit:

  1. Puisque vous n'avez aucune référence à la publication autre que l'URI, nous segmentons l'URI pour rechercher une page avec ce nom de page.
  2. S'il y a une page, nous obtenons la dernière révision enfant
  3. Hack la requête pour forcer notre slug de révision à la source de la page

Cela fonctionne bien car cela donne l’apparence d’un permalien de travail. Il agit comme un pseudo lien permanent.

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

Le seul inconvénient est parfois que le slug n'enregistre pas jusqu'à ce que vous publiez la page. Pour que cela fonctionne correctement, le slug doit être dans la base de données. À votre santé!

2
Brian Fegter

Je travaille sur cette question récemment et j'aimerais publier ma solution si le remplacement de la 404 ne fonctionne pas.

Fondamentalement, WordPress a défini le statut de publication en attente sur privé plutôt que sur public (c'est pourquoi vous ne pouvez pas le voir, si vous n'êtes pas connecté en tant qu'administrateur). Nous devons donc le réinitialiser:

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