管理ページに表示するためにWP_Query
を使用して投稿リビジョンをクエリしたいのですが、ページネーションパラメータを含めたいです。
私には2つの制約があります。
published投稿のリビジョン、つまり、親-post_parent
フィールドで指定されている投稿ID-のpost_status
フィールドにpublish
が含まれているリビジョンのみを取得したいと思います。
投稿が公開されたときに自動生成されたリビジョン、つまりpost_date
が親のリビジョンと一致するリビジョンは無視します。
通常、投稿の配列を取得した後でこれらのリビジョンをフィルターで除外しますが、これらの要素をページネーション付きの管理リストテーブルに表示したいので、WP_Query
のサポートを使用したいと思います。
SQLでは、次のようなINNER JOINを使用して親の投稿を取得します。
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
WP_Query
を使用してこれを行うことは可能ですか?
_posts_join
_および_posts_where
_フィルターを使用して、[〜#〜] join [〜#〜]および[〜#〜] where [〜#〜]句。
_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;
}
_
クエリの変更は、__rev_of_publ
_パラメータ(名前は変更可能)を_WP_Query
_に渡した後に行われます。
_$args = [
'post_type' => 'revision',
'post_status' => 'any', // default value is 'publish'
'_rev_of_publ' => 1,
];
$my_query = new WP_Query( $args );
_
ここ _WP_Query
_の使用に関する詳細情報が表示されます。