Je souhaite interroger les révisions de publication à l'aide de WP_Query
pour l'affichage sur une page d'administration, et je souhaite inclure des paramètres de pagination.
J'ai deux contraintes:
Je souhaite récupérer uniquement les révisions pour les messages publiés, c'est-à-dire les révisions dont le parent - l'ID du message pour lequel est donné dans le post_parent
champ - contient publish
dans son post_status
champ.
Je voudrais ignorer la révision générée automatiquement lors de la publication d'un article, c'est-à-dire la révision dont post_date
correspond à celui du parent.
Normalement, je filtrerais simplement ces révisions après avoir obtenu le tableau des publications, mais je veux afficher ces éléments dans un tableau de liste d'administration avec pagination, donc j'aimerais utiliser WP_Query
supporte cela.
En SQL, j'utiliserais un INNER JOIN comme celui-ci pour récupérer les publications parentes:
SELECT * FROM {$wpdb->posts} AS posts
INNER JOIN {$wpdb->posts} AS parent_posts
ON posts.post_parent = parent_posts.ID
WHERE posts.post_type = 'revision'
AND parent_posts.post_status = 'publish'
AND posts.post_date <> parent_posts.post_date
Est-ce possible de le faire en utilisant WP_Query
?
Tu devrais utiliser posts_join
et posts_where
filtres à modifier [~ # ~] joindre [~ # ~] et [~ # ~] où [~ # ~] clauses.
add_filter( 'posts_join' , 'se333659_posts_join', 20, 2 );
add_filter( 'posts_where' , 'se333659_posts_where', 20, 2 );
function se333659_posts_join( $join, $query )
{
global $wpdb;
if ( isset($query->query_vars['_rev_of_publ']) &&
$query->query_vars['_rev_of_publ'] == '1' )
{
$join .= " LEFT JOIN {$wpdb->posts} AS rev_p ON ({$wpdb->posts}.post_parent = rev_p.ID) ";
}
return $join;
}
function se333659_posts_where( $where, $query )
{
global $wpdb;
if ( isset($query->query_vars['_rev_of_publ']) &&
$query->query_vars['_rev_of_publ'] == '1' )
{
$where .= ' AND rev_p.post_status = \'publish\' AND '.$wpdb->posts.'.post_date <> rev_p.post_date ';
}
return $where;
}
Des modifications seront apportées à la requête après avoir passé le _rev_of_publ
paramètre (le nom peut être changé) en WP_Query
.
$args = [
'post_type' => 'revision',
'post_status' => 'any', // default value is 'publish'
'_rev_of_publ' => 1,
];
$my_query = new WP_Query( $args );
Ici vous trouverez plus d'informations sur l'utilisation de WP_Query
.