【WordPress】記事ごとにコメントや返信に連番をつける方法(既存のコメントにも追加)

wordpressコメントに連番追加 Wordpress
wordpressコメントに連番追加

既存のコメント・返信用の連番データ付与する

コメントのメタ情報として記事ごとの連番データを追加します。

連番データ作成用のテンポラリーテーブルを作成

/* テンポラリテーブル作成
*/
CREATE TABLE `temp_test_commentmeta` (
  `comment_id` bigint(20) UNSIGNED NOT NULL DEFAULT '0',
  `meta_key_name` varchar(255) DEFAULT NULL,
  `rownum` longtext,
  `group_id` longtext
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

コメントテーブルからテンポラリーテーブルに連番を挿入

/* テンポラリテーブルに挿入
*/
INSERT INTO `temp_test_commentmeta` (comment_id, meta_key_name, rownum, group_id) 
SELECT
  wp_comments.comment_ID AS comment_id,
  'comment_number_for_postid' AS meta_key_name,
  @rownum := IF(@prev_group_id = comment_post_ID, @rownum + 1, 1) AS rownum,
  @prev_group_id := comment_post_ID as group_id
FROM
  wp_comments,
  (select @rownum := 0) hoge,
  (select @prev_group_id := '') fuga
ORDER BY
  comment_post_ID,
  comment_ID ASC

メタテーブルにデータを反映

/* 本番 */
INSERT INTO `wp_commentmeta` (meta_id, comment_id, meta_key, meta_value) 
SELECT NULL, comment_id, 'comment_number_for_postid', rownum
FROM temp_test_commentmeta

以上で既存のコメントのメタ情報に連番を追加することができました。

新規コメント投稿時に連番をメタ情報として追加する

既存のメタ情報の最大値から1プラスしたものをmeta情報として追加します。

// コメント連番付与
function custom_comment_post_comment_number( $comment_id ){
	global $wpdb;

	// post_id 取得
	$post_id = $wpdb->get_var("SELECT comment_post_ID FROM wp_comments WHERE comment_ID = ".$comment_id." LIMIT 1;");
	// コメント最大値取得
	$max_count = $wpdb->get_var("SELECT meta_value FROM wp_commentmeta LEFT JOIN wp_comments ON wp_commentmeta.comment_id = wp_comments.comment_ID WHERE wp_comments.comment_post_ID = ".$post_id ." AND wp_commentmeta.meta_key = 'comment_number_for_postid' ORDER BY (wp_commentmeta.meta_value + 0) DESC LIMIT 1;");

	if ( !is_numeric($max_count) ){
		$max_count=0;
	}

	$max_count++;

	add_comment_meta( $comment_id, 'comment_number_for_postid', $max_count );
}
add_action('comment_post', 'custom_comment_post_comment_number');

ポイントは meta_value はlongtext型のためORDER BY句で数字としてソートするために、 ORDER BY (wp_commentmeta.meta_value + 0) としています。※MySQLの場合。

そして、取得した値の有効性チェックは is_numeric で判定するとうまく動作します。

コメント

タイトルとURLをコピーしました