web-dev-qa-db-fra.com

Est-il possible d'afficher la post-révision précédente?

Je veux pouvoir parcourir mes publications en boucle, mais pour chaque publication à ceci:

1) vérifie si un champ personnalisé est vrai ou faux.

2) Si est vrai, il suffit d'afficher les données de l'article ( the_title, the_content ... ).

3) si est faux, affiche la même structure de données ( the_title, the_content ... ) mais avec le révision précédente de ce post.

C'est possible? et comment?

1
Ben

Nous examinons d’abord la fonction wp_get_post_autosave

Il est instructif de voir comment la fonction principale wp_get_post_autosave() utilise la fonction wp_get_post_revisions().

Il boucle sur toutes les révisions de

$revisions = wp_get_post_revisions( 
    $post_id, 
    array( 
        'check_enabled' => false 
    ) 
);

et utilise ensuite:

foreach ( $revisions as $revision ) {
    if ( false !== strpos( $revision->post_name, "{$post_id}-autosave" ) ) {
        if ( $user_id && $user_id != $revision->post_author )
            continue;

        return $revision;
    }
}

renvoyer la première révision avec un slug contenant "{$post_id}-autosave" et où le $user_id correspond éventuellement à son auteur.

Alternative

Maintenant, wp_get_post_revisions() est un wrapper pour get_children(), alors je me demande pourquoi il doit récupérer toutes les révisions pour le message donné, avant d’en filtrer une seule. Pourquoi ne pas essayer d'aller le chercher directement, seulement ce qui est nécessaire? Lorsque nous essayons par exemple les suivantes (PHP 5.4+):

$revisions = wp_get_post_revisions(
    $post_id,
    [
        'ofset'           => 1,    // Start from the previous change
        'posts_per_page'  => 1,    // Only a single revision
        'name'            => "{$post_id}-autosave-v1",
        'check_enabled'   => false,
    ]
);

alors le posts_per_page n'aura aucun effet. Après avoir joué avec cela, j'ai réussi à faire fonctionner ce qui suit avec l'argument posts_per_page:

$revisions = wp_get_post_revisions(
    $post_id,
    [
        'ofset'           => 1,    // Start from the previous change
        'posts_per_page'  => 1,    // Only a single revision
        'post_name__in'   => [ "{$post_id}-autosave-v1" ],
        'check_enabled'   => false,
    ]
);

Obtenir uniquement la révision précédente

Maintenant, nous pouvons ajuster ce qui précède pour ne récupérer que la révision précédente, c'est-à-dire qu'il ne s'agit pas d'une sauvegarde automatique :

$revisions = wp_get_post_revisions(
    $post_id,
    [
        'ofset'           => 1,    // Start from the previous change
        'posts_per_page'  => 1,    // Only a single revision
        'post_name__in'   => [ "{$post_id}-revision-v1" ],
        'check_enabled'   => false,
    ]
);

Ici, nous ciblons le slug {$post_id}-revision-v1.

Notez que nous utilisons ici le v1, mais nous pourrions l’ajuster si nécessaire ultérieurement.

Exemple

Donc, pour répondre enfin à votre question, voici une suggestion:

$show = get_post_meta( get_the_ID(), 'somekey', true );

if( $show )
{
    // Template part
    get_template_part( 'template-parts/content' );
}
else
{
    // Fetch the previous revision only
    $revisions = wp_get_post_revisions(
        get_the_ID(),
        [
            'ofset'           => 1,    // Start from the previous change
            'posts_per_page'  => 1,    // Only a single revision
            'post_name__in'   => [ sprintf( "%d-revision-v1", get_the_ID() ) ],
            'check_enabled'   => false,
        ]
    );

    if( $revisions )
    {
        $post = reset( $revisions );
        setup_postdata( $post );

        // Template part
        get_template_part( 'template-parts/content' );

        wp_reset_postdata();
    }
    else
    {
         // Some fallback here
    }
}

J'espère que vous pourrez l'adapter à vos besoins!

1
birgire

Oui c'est possible. Vous pouvez accéder aux révisions de publication en utilisant la fonction wp_get_post_revisions($post_id). Il retourne le tableau de la révision de post. Le premier élément d'un tableau est identique à la version actuelle de post.

1
Piotr Kliks