web-dev-qa-db-ja.com

投稿タイトルでコメントを並べ替えるには?

私がこれまでに試したことは何もうまくいかなかった。そこで私は、コメントを投稿された記事のタイトル順に並べ替える方法を見つけようとしながら、数日間どこでも探し始めました。 (私はmeta_valueも試しましたが、正しく行っていないようです)。私はWPコーデックスを読みました。これは私が投稿タイトルでコメントをソートしようとしているものですが、コメントのorderbyのためのtitleまたはpost_titleパラメータはありません。任意の助けをいただければ幸いです。

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

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

WP_Comment_Queryクラス は、 による順序付けをサポートします。

'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',

投稿タイトルによる順序付けをサポートできるように、フィルタで調整する方法があります。

$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 ); 

_post_titleの順序をサポートする簡単なデモプラグインは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 );

投稿テーブルがコメントテーブルに結合されていることを確認するために、投稿タイプパラメータが見つからない場合は 'post'に設定できます。

/**
 * 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';

} );

この種類のクエリに注意してください。

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  

それは一時的なfilesortを使うので効率的ではありません。

あなたがそれをあなたのニーズにさらに調整できることを願っています。

1
birgire