
記事の複製機能といいね機能があるサイト運用案件で、
「記事の複製時、複製元のいいね数を引き継いでしまうので、いいね数だけリセットできないか?」
という問い合わせを頂いたのですが、探してみると意外と該当記事が見つからず、検証して解決しましたので記事として残します。
前提
- 記事複製機能は、Yoast Duplicate postを導入
- いいね機能は、WP-PostRatings、またはFavoritesを導入
解決までの調査過程
- まずYoast Duplicate postに使えそうなフックがないか公式のFilters and actionsを確認する。この中で、dp_duplicate_postは記事複製直後に発火するそうなので、「記事複製直後にいいね関連のデータをクリアする」ように実装すれば、実現できそうと想定。
- 次に「いいね関連のデータ」はデータベースのどこに登録されるか、いいね数が1以上と0の時のデータの持ち方を確認。プラグインのいいね数登録に該当するソースとテーブルデータを確認する。wp_postmetaに格納されることがわかった。
- 「記事複製直後にいいね関連のデータをクリアする」ように実装し、動作確認。
WP-PostRatingsの実装例
いいね数が0の記事は、ratings_users、ratings_score、ratings_average自体がwp_postmetaテーブルから削除される仕様でしたので、記事複製直後にこの3つが削除されるように実装しました。
function my_custom_dp_duplicate_post( $post_id ) {
delete_post_meta($post_id, 'ratings_users');
delete_post_meta($post_id, 'ratings_score');
delete_post_meta($post_id, 'ratings_average');
}
// Yoast Duplicate postのソースadmin-functions.phpの中で実行している
// add_action( 'dp_duplicate_post', 'duplicate_post_copy_post_meta_info', 10, 2 ); の直後に実行するように優先順位を設定
add_action( 'dp_duplicate_post', 'my_custom_dp_duplicate_post' , 15, 2);
Favoritesの実装例
いいね数が0の記事は、simplefavorites_countの値が0になる仕様でしたので、記事複製直後にカウント数を0に更新するように実装しました。
function my_custom_dp_duplicate_post( $new_post_id ) {
update_post_meta( $new_post_id, 'simplefavorites_count', 0 );
}
// Yoast Duplicate postのソースadmin-functions.phpの中で実行している
// add_action( 'dp_duplicate_post', 'duplicate_post_copy_post_meta_info', 10, 2 ); の直後に実行するように優先順位を設定
add_action( 'dp_duplicate_post', 'my_custom_dp_duplicate_post' ,15 ,2);
検証時は、管理画面、サイト表示だけでなくテーブルデータも想定通り更新されているか確認しました。
いいね数以外にも応用可能だと思います。参考になれば幸いです。

