回答編集履歴

1

無駄な削除を回避するコードを追記

2016/01/20 08:54

投稿

crhg
crhg

スコア1175

test CHANGED
@@ -7,3 +7,71 @@
7
7
 
8
8
 
9
9
  カテゴリーの種類がたくさんあるけどそのpostについているカテゴリーの数がそれほど多くないときは、もともとついてないカテゴリーを外すwp_remove_object_termsがたくさん発行されて中でDBアクセスを毎回行うのでとても無駄な気が... この場合はあらかじめwp_get_object_termsでそのpostについているカテゴリを取得して配列にでもしまっておき、そこに入ってたときだけwp_remove_object_termsを呼ぶようにするといいかと。
10
+
11
+
12
+
13
+ 追記:
14
+
15
+ wp_remove_object_terms削ると効果があるようなので、本文についているカテゴリのみ削除して無駄な削除は行わなくするコードを書いてみましたがwordpressの実行環境がないので動作確認はしてません。だいたいこんな感じだと思うので参考にしてください。
16
+
17
+
18
+
19
+ ```PHP
20
+
21
+ /* 本文が持つカテゴリーを全て取得し、チェック用の配列に記録する。 */
22
+
23
+ $terms = wp_get_object_terms($post_id, 'category');
24
+
25
+ $category_hash = array();
26
+
27
+ foreach ($terms as $term) {
28
+
29
+ $category_hash[$term->name] = true;
30
+
31
+ }
32
+
33
+
34
+
35
+ /* ループ開始 全てのカテゴリーを1つ1つ調べる */
36
+
37
+ $cat_all = get_terms( "category", "fields=all&get=all" );
38
+
39
+ foreach($cat_all as $value):
40
+
41
+
42
+
43
+ /* もし本文にカテゴリーと同じ文字列があれば(デフォのカテゴリーを外してから)カテゴリーを付ける */
44
+
45
+ if ( stripos( $content, $value->name ) !== false ) {
46
+
47
+ wp_remove_object_terms( $post_id, 1, 'category' );
48
+
49
+ wp_add_object_terms( $post_id, $value->name, 'category' );
50
+
51
+ }
52
+
53
+
54
+
55
+ /* もし本文にカテゴリーと同じ文字列が無い時はカテゴリーを外す */
56
+
57
+ else {
58
+
59
+ /* チェック用の配列に記録されていたときのみカテゴリーを外す処理を実行する */
60
+
61
+ if (isset($category_hash[$value->name])) {
62
+
63
+ wp_remove_object_terms( $post_id, $value->name, 'category' );
64
+
65
+ }
66
+
67
+ }
68
+
69
+
70
+
71
+ endforeach;
72
+
73
+ /* ループ終了 全てのカテゴリーを1つ1つ調べる */
74
+
75
+
76
+
77
+ ```