web-dev-qa-db-fra.com

Comment commander par commentaires par titre de message?

Tout ce que j'ai essayé jusqu'à présent n'a pas fonctionné. J'ai donc commencé à chercher partout depuis quelques jours maintenant, en essayant de comprendre comment commander des commentaires en fonction du titre du message dans lequel ils sont créés. (J'ai aussi essayé une meta_value, mais il semble que je ne l'ai pas fait correctement). J'ai lu le codex wp. Voici ce que j'essaie de faire en sorte de trier les commentaires par titre, mais il n'y a pas de paramètre title ou post_title pour la commande byby of comments. Toute aide serait appréciée.

<?php $args = array(
    'status' => 'approve',
    'post_status' => 'publish',
    'post_type' => 'post',
    'orderby' => 'title',
    'order' => 'DESC'
);

$comments_query = new WP_Comment_Query; ?>
1
the.matrix

La classe WP_Comment_Queryprend en charge la commande par:

'comment_agent',
'comment_approved', 
'comment_author',
'comment_author_email', 
'comment_author_IP',
'comment_author_url', 
'comment_content', 
'comment_date',
'comment_date_gmt', 
'comment_ID', 
'comment_karma',
'comment_parent', 
'comment_post_ID', 
'comment_type',
'user_id', 
'comment__in', 
'meta_value', 
'meta_value_num',

Il existe un moyen de l'ajuster via des filtres afin que nous puissions vous aider à commander en fonction du titre de l'article:

$args = [
    'status'       => 'approve',
    'post_status'  => 'publish',
    'post_type'    => 'post',
    'orderby'      => '_post_title', // <-- Our custom orderby value
    'order'        => 'DESC'
];

$comment_query = new WP_Comment_Query( $args ); 

Un simple plug-in de démonstration pour prendre en charge la commande _post_title pourrait se trouver dans PHP 7:

/**
 * Adjust orderby comments clause
 */

add_filter( 'comments_clauses', function( $clauses, \WP_Comment_Query $cq ) use ( &$wpdb )
{   
    $qv      = $cq->query_vars;
    $orderby = $qv['orderby'] ?? '';
    $order   = $qv['order'] ?? 'ASC';

    if( 
           '_post_title' === $orderby 
        && in_array( strtoupper( $order ), [ 'ASC', 'DESC' ], true ) 
    )
        $clauses[ 'orderby' ] = " {$wpdb->posts}.post_title {$order},
            {$wpdb->comments}.comment_ID {$order} "; 


    return $clauses;
}, 10, 2 );

et ensuite pour nous assurer que la table posts est jointe à la table de commentaires, nous pouvons définir le paramètre type de post sur 'post' s'il est manquant:

/**
 * Make usre we have the posts table joined by making sure the post_type isn't empty.
 */

add_action( 'pre_get_comments', function( \WP_Comment_Query $cq )
{
    $qv      = &$cq->query_vars;
    $orderby = $qv['orderby'] ?? '';

    if( '_post_title' === $orderby && empty( $qv['post_type'] ) )
        $qv['post_type'] = 'post';

} );

Notez que ce type de requête:

SELECT  wp_comments.comment_ID 
    FROM wp_comments JOIN wp_posts ON wp_posts.ID = wp_comments.comment_post_ID     
    WHERE ( comment_approved = '1' ) 
        AND  wp_posts.post_status IN ('publish') 
        AND  wp_posts.post_type IN ('post')  
    ORDER BY  wp_posts.post_title DESC, wp_comments.comment_ID DESC  

n’est pas efficace car il utilise des fichiers temporaires et .

J'espère que vous pourrez l'adapter à vos besoins.

1
birgire