web-dev-qa-db-fra.com

Exclure post_type de admin comments_list

J'essaie de ne pas afficher les commentaires d'un certain type de message personnalisé dans la liste des commentaires de l'interface d'administration.

Je suis allé à "wp-admin/includes/class-wp-comments-list-table.php" et j'ai essayé de jouer avec le tableau $ args qui est passé dans la fonction "get_comments" afin d'alimenter la table des listes de commentaires.

Si j'y ajoute un paramètre post_type, je peux filtrer les commentaires afin de ne voir que les commentaires de ce type d'article. Mais ce que je veux, c’est le contraire: je voudrais voir tous les commentaires sauf ceux d’un type de message spécifique.

J'ai essayé plusieurs choses comme:

1) Créez une liste blanche en ajoutant tous les types de publication dont j'ai besoin, à l'exception de celui que je souhaite exclure. Le problème est qu'il ne montre que le premier type du tableau

$args = array(
    ...,
    'post_type' => array('aaa','bbb','ccc','ddd')
);

2) J'ai essayé de créer une liste noire en excluant le type de message dont j'ai besoin. Il ne considère tout simplement pas le filtre et affiche les commentaires de tous les types de publication.

$args = array(
    ...,
    'exclude' => array('post_type'=>'xxx')
);

//OR 

$posts_to_exclude=get_posts(array('post_type'=> 'xxx'));
foreach ($posts_to_exclude as $single)
{
    $target[] = $single->ID;   
};
$args = array(
    ...,
    'posts__not_in' => $target
);

Rien n'a fonctionné. Je ne sais pas quoi faire d'autre. Ce qui me préoccupe, c’est que la liste blanche semble bien fonctionner selon ce que je peux lire sur Internet, mais pour une raison quelconque, elle ne me montre que le premier élément du tableau post_type (et je suis sûr que j’ai des commentaires pour tous les posts car ils tous apparaissent lorsque je ne filtre pas la table de la liste des commentaires.

Merci de votre aide.

2
Bachir Messaouri

Vous devrez filtrer comments_clauses car WP_Comment_Query ne prend en charge qu'un argument limité post type == X.

/**
 * Exclude comments of the "foobar" post type.
 *
 * @param  array  $clauses
 * @param  object $wp_comment_query
 * @return array
 */
function wpse_72210_comments_exclude_post_type( $clauses, $wp_comment_query )
{
    global $wpdb;

    if ( ! $clauses['join'] )
        $clauses['join'] = "JOIN $wpdb->posts ON $wpdb->posts.ID = $wpdb->comments.comment_post_ID";

    if ( ! $wp_comment_query->query_vars['post_type' ] ) // only apply if post_type hasn't already been queried
        $clauses['where'] .= $wpdb->prepare( " AND {$wpdb->posts}.post_type != %s", 'foobar' );

    return $clauses;
}

/**
 * Delay hooking our clauses filter to ensure it's only applied when needed.
 */
function wpse_72210_comments_exclude_lazy_hook( $screen )
{
    if ( $screen->id == 'edit-comments' )
        add_filter( 'comments_clauses', 'wpse_72210_comments_exclude_post_type', 10, 2 );
}

add_action( 'current_screen', 'wpse_72210_comments_exclude_lazy_hook', 10, 2 );
5
TheDeadMedic