web-dev-qa-db-ja.com

WP_Queryで投稿の親のフィールドに対して選択することは可能ですか?

管理ページに表示するためにWP_Queryを使用して投稿リビジョンをクエリしたいのですが、ページネーションパラメータを含めたいです。

私には2つの制約があります。

  1. published投稿のリビジョン、つまり、親-post_parentフィールドで指定されている投稿ID-のpost_statusフィールドにpublishが含まれているリビジョンのみを取得したいと思います。

  2. 投稿が公開されたときに自動生成されたリビジョン、つまり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を使用してこれを行うことは可能ですか?

4
Sean

_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_の使用に関する詳細情報が表示されます。

3
nmr