web-dev-qa-db-fra.com

Est-il possible de sélectionner par rapport aux champs d'un parent de poste avec WP_Query?

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:

  1. 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.

  2. 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?

4
Sean

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

Comment utiliser:

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.

3
nmr