質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

2718閲覧

[WordPress] MySQL経由でDBに直接タグを追加したら既存のタグが消えてしまった

spellbound

総合スコア190

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2017/06/26 01:57

編集2017/06/26 06:18

分からないこと

  1. termsテーブル
  2. terms_taxonomyテーブル
  3. term_relationshipsテーブル

この順番でデータをインサートしました。
一応、インサートした情報は問題なく保存され、タグとして表示されています。
どうして消えてしまうかが分かりません。
何か糸口だけでも教えていただけないでしょうか・・・

既存のタグデータが消えてインサートしたデータが残っています。
(記事ページのタグを見る限りです)

php

1function insertDataToTermsTable($exData, $wpdb) { 2 extract($exData); 3 $encodedExmNm = rawurlencode($exNm); 4 $wpdb->query( 5 $wpdb->prepare( 6 " 7 INSERT INTO $wpdb->terms 8 ( 9 name, 10 slug, 11 term_group 12 ) 13 VALUES 14 ( 15 %s, 16 %s, 17 %d 18 ) 19 ON DUPLICATE KEY UPDATE 20 name = VALUES(name), 21 slug = VALUES(slug), 22 term_group = VALUES(term_group) 23 ", 24 array( 25 $exNm, 26 $encodedExNm, 27 0 28 )) 29 ); 30}

php

1function insertDataToTermTaxonomyTable($exData, $wpdb) { 2 extract($exData); 3 $termId = $wpdb->get_var("SELECT term_id FROM wp_terms WHERE name = '$exNm'"); 4 $wpdb->query( 5 $wpdb->prepare( 6 " 7 INSERT INTO $wpdb->term_taxonomy 8 ( 9 term_id, 10 taxonomy, 11 count 12 ) 13 VALUES 14 ( 15 %d, 16 %s, 17 %d 18 ) 19 ON DUPLICATE KEY UPDATE 20 term_id = VALUES(term_id), 21 taxonomy = VALUES(taxonomy), 22 count = VALUES(count) 23 ", 24 array( 25 $termId, 26 post_tag, 27 1 28 )) 29 ); 30}

PHP

1function insertDataToTermRelationships($id, $exData, $wpdb) { 2 $postId = $id->post_id; 3 extract($exData); 4 $termId = $wpdb->get_var("SELECT term_id FROM wp_terms WHERE name = '$exNm'"); 5 $termTaxonomyId = $wpdb->get_var("SELECT term_taxonomy_id FROM wp_term_taxonomy WHERE term_id = '$termId'"); 6 $wpdb->query( 7 $wpdb->prepare( 8 " 9 INSERT INTO $wpdb->term_relationships 10 ( 11 object_id, 12 term_taxonomy_id, 13 term_order 14 ) 15 VALUES 16 ( 17 %d, 18 %d, 19 %d 20 ) 21 ON DUPLICATE KEY UPDATE 22 object_id = VALUES(object_id), 23 term_taxonomy_id = VALUES(term_taxonomy_id), 24 term_order = VALUES(term_order) 25 ", 26 array( 27 $postId, 28 $termTaxonomyId, 29 0 30 ))); 31 }

#テーブル定義

sql

1CREATE TABLE `wp_term_relationships` ( 2 `object_id` bigint(20) unsigned NOT NULL DEFAULT '0', 3 `term_taxonomy_id` bigint(20) unsigned NOT NULL DEFAULT '0', 4 `term_order` int(11) NOT NULL DEFAULT '0', 5 PRIMARY KEY (`object_id`,`term_taxonomy_id`), 6 KEY `term_taxonomy_id` (`term_taxonomy_id`) 7) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

sql

1CREATE TABLE `wp_term_taxonomy` ( 2 `term_taxonomy_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 3 `term_id` bigint(20) unsigned NOT NULL DEFAULT '0', 4 `taxonomy` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', 5 `description` longtext COLLATE utf8mb4_unicode_ci NOT NULL, 6 `parent` bigint(20) unsigned NOT NULL DEFAULT '0', 7 `count` bigint(20) NOT NULL DEFAULT '0', 8 PRIMARY KEY (`term_taxonomy_id`), 9 UNIQUE KEY `term_id_taxonomy` (`term_id`,`taxonomy`), 10 KEY `taxonomy` (`taxonomy`) 11) ENGINE=InnoDB AUTO_INCREMENT=12634 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

sql

1CREATE TABLE `wp_terms` ( 2 `term_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 3 `name` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', 4 `slug` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', 5 `term_group` bigint(10) NOT NULL DEFAULT '0', 6 PRIMARY KEY (`term_id`), 7 UNIQUE KEY `name` (`name`), 8 UNIQUE KEY `name_2` (`name`), 9 UNIQUE KEY `name_3` (`name`), 10 UNIQUE KEY `slug` (`slug`) 11) ENGINE=InnoDB AUTO_INCREMENT=13497 DEFAULT CHARSET=utf8mb4;

上記のようなテーブル設定です。
これでもダメでしょうか...。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

INSERT INTO ON DUPLICATE KEY UPDATE構文は
uniqe(もしくはprimary)の付け方次第かと思います
質問されるのであればテーブル構造とサンプルデータを提示される方がよいでしょう

またget_var()の仕様がよくわからないのですが
$exNmが参照したり宣言されているように見えませんが、そういうものなのでしょうか?

sample

テーブルwp_termsについて、nameとslugがそれぞれユニークだとして、なんのために
同じunique設定のname2,name3を付けているのでしょうか?

以下サンプル

SQL

1CREATE TABLE `wp_terms` ( 2 `term_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 3 `name` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', 4 `slug` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', 5 `term_group` bigint(10) NOT NULL DEFAULT '0', 6 PRIMARY KEY (`term_id`), 7 UNIQUE KEY `name` (`name`), 8 UNIQUE KEY `name_2` (`name`), 9 UNIQUE KEY `name_3` (`name`), 10 UNIQUE KEY `slug` (`slug`) 11) ENGINE=InnoDB AUTO_INCREMENT=13497 DEFAULT CHARSET=utf8mb4; 12 13 14INSERT INTO wp_terms(name,slug,term_group) 15VALUES('a1','b1',100),('a2','b2',200),('a3','b3',300),('a4','b4',400),('a5','b5',500); 16

nameとslugの二重の制約がある場合以下
nameとslugの組み合わせがあっていればterm_groupが修正されます

SQL

1INSERT INTO wp_terms(name,slug,term_group) 2VALUES('a1','b1',600) 3ON DUPLICATE KEY UPDATE 4name = VALUES(name), 5slug = VALUES(slug), 6term_group = VALUES(term_group) 7

nameもしくはslugのどちらかが一致する場合は、もう片方を書き換えた上で
temp_groupが修正されます

SQL

1INSERT INTO wp_terms(name,slug,term_group) 2VALUES('a2','b6x',700),('a7x','b3',800) 3ON DUPLICATE KEY UPDATE 4name = VALUES(name), 5slug = VALUES(slug), 6term_group = VALUES(term_group) 7

nameとslugの組み合わせが競合する場合エラーになります

SQL

1INSERT INTO wp_terms(name,slug,term_group) 2VALUES('a4','b5',900) 3ON DUPLICATE KEY UPDATE 4name = VALUES(name), 5slug = VALUES(slug), 6term_group = VALUES(term_group)

投稿2017/06/26 04:01

編集2017/06/26 09:27
yambejp

総合スコア114775

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

spellbound

2017/06/26 08:59

一応、各カラムを見たんですが、ユニークキーにしていました。 get_var()関数はデータベースから変数を一つリターンするものです。 $exNmはextract($exData);の中に入っています。
yambejp

2017/06/26 09:28

参考としてwp_termsのデータ投入例を追記しておきました。 上記条件に引っかかれば更新が無効になるでしょう。
spellbound

2017/06/26 10:01 編集

> UNIQUE KEY `name_2` (`name`), > UNIQUE KEY `name_3` (`name`), これを消したら動きました。
spellbound

2017/06/26 10:04

ありがとうございます。 おそらくバグを直そうとした時、何度も設定したのではないかと思います。 $exNmに関してです。 $exData = getExData($json, $exId); それはもう一段階、関数を定義して呼び出しています。 var_dumpしたところ、しっかりと目的の名前は表示されたのでそのエラーではなさそうです。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問