私がこれまでに試したことは何もうまくいかなかった。そこで私は、コメントを投稿された記事のタイトル順に並べ替える方法を見つけようとしながら、数日間どこでも探し始めました。 (私は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; ?>
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を使うので効率的ではありません。
あなたがそれをあなたのニーズにさらに調整できることを願っています。