web-dev-qa-db-ja.com

プログラムで製品属性をWP / Woo commerceに追加する

大量の製品、カテゴリ、および属性をwordpressデータベースに挿入しています。

私の方法は、選択したソースデータテーブルをオフラインデータベース(wordpress形式ではない)からwordpressデータベースにコピーし、次のローカルMySQLストアドプロシージャを実行することです。

  1. 以前に挿入したデータを削除します
  2. ソースデータをフォーマットして配布し、新しい...
  3. 製品記録
  4. カテゴリーレコード
  5. 属性レコード

私の製品とカテゴリは、期待どおりにアップロードおよび表示されているように見えますが、自分の属性を希望どおりに動作させるという仕事の悪魔がいます。

システムに属性がない状態で、次のデータを処理するストアドプロシージャを実行します(ここに表示する目的で要約しました)。

製品
 TIDモデル
 ------ -------------------------- -------- 
 2パンMP MED SLICE WHITE 800g 
 3パンMP THICK SLICED WHITE 800g 
 4パンMPブラウンスライス800g 
 5パンニンブルホワイト400g 
 245 TREX 500g 
 ATTRIBUTES 
 TID Attr_Name Order 
 ------ ----------- -------- 
 1フェアトレード0 
 2 GLUTE FREE 0 
 3マルチパック0 
属性値:(SL_ID =ソースデータ製品のTID)
 TID SL_ID Attr_ID Attr_Value 
 ------ ------ -------- ----------- 
 5 2 1 NO 
 6 2 2 NO 
 7 2 3 NO 
 2 3 1 YES 
 3 3 2はい
 4 3 3はい
 11 4 3 MAYBE 
 10 4 2 MAYBE 
 9 4 1 MAYBE 
 12 5 1はい
 13 5 2いいえ
 14 5 3 MAYBE 
 16 245 1はい
 17 245 2いいえ

次の各行は、関連するwpテーブル内の関連するデータ行と思われるものを生成する関数(詳細はf_create_attributes)に渡されます。

属性値
 INattr_id INattr_name INslug INattr_value 
 --------- ----------- -------- ------------ 
 1フェアトレード1-はいはい
 1フェアトレード1-いいえいいえ
 1フェアトレード1-多分MAYBE 
 2グルテンフリー2はいはい
 2グルテンフリー2いいえいいえ
 2グルテンフリー2多分MAYBE 
 3マルチパック3はいはい
 3マルチパック3-いいえ
 3マルチパック3-多分MAYBE 

関数:f_create_attributes

 DELIMITER $$ 
 
 `someth22_martins` $$ 
 
 DROP FUNCTION IF EXISTS` f_create_attributes` $$ 
 
 CREATE DEFINER = `someth22_admin` @`% `関数` f_create_attributes`(INattr_id BIGINT(20)、
 INattr_name VARCHAR(200)、
 INslug VARCHAR(200)、
 INattr_value VARCHAR(200))RETURNS BIGINT(20)
 DETERMINISTIC 
 BEGIN 
 DECLARE OUT_ID BIGINT(20)DEFAULT 0; 
/* 
 ATRIBUTES 
 ----------------- 
いくつかのローカル変数を設定
 */
 SET @attr_id = INattr_id; 
 SET @attr_name = INattr_name; 
 SET @attr_value = INattr_value; 
 SET @ slug = INslug; 
 SET @metakey_attribute = "x_attribute_id_map"; 
 SET @term_id = 0; 
 SET @attr_name_slug = LOWER(REPLACE(@attr_name、 ""、 "-")); 
/* 
ここから属性が始まりますlife 
 `wp_woocommerce_attribute_taxonomies` 
 */
 INSERT INTO `wp_woocommerce_attribute_taxonomies`(` attribute_name`、 `attribute_label`、` attribute_type`、 `attribute_orderby`、` attribute_public`)
 SELECT A. * FROM 
(SELECT @attr_name_slug AS attribute_name、 @attr_name、 "text"、 "menu_order"、0)A LEFT JOIN `wp_woocommerce_attribute_taxonomies` B ON A.attribute_name = B.attribute_name 
 WHERE ISNULL(B.`attribute_id`); 
 
/* 
 TERMS 
 --------------------- 
属性値
リンク済みTERM TAXONOMY 
 */
 INSERT INTO wp_terms( `name`、` slug`、 `term_group`)の関連属性への
 VALUES(@attr_value、@slug、0) ; 
/* 
用語IDを収集します
 */
 SELECT LAST_INSERT_ID()INTO @term_id; 
/* 
作成TermMeta row 
 */
 INSERT INTO `wp_termmeta`(` term_id`、 `meta_key`、` meta_value`)
 VALUES(@term_id、@metakey_attribute、@attr_value); 
/* 
 term_taxonomyレコードの作成
 */
 `wp_term_taxonomy`に挿入(` ter m_id`、 `taxonomy`)
 VALUES(@term_id、
 LOWER(
 CONCAT(" pa _ "、@ attr_name_slug 
))
) ; 
 SET @term_taxonomy_id = 0; 
 SELECT LAST_INSERT_ID()INTO @term_taxonomy_id; 
 
/* 
 WOOCOMMERCE termmetaレコードを作成
 */
 `wp_woocommerce_termmeta`(` woocommerce_term_id`、 `meta_key`、` meta_value`に挿入)
 VALUES(@term_id、CONCAT( "order_pa _"、@ attr_name_slug)、0); 
 
 
/* 
 term_taxonomymeta行の作成
 */
 INSERT INTO `wp_taxonomymeta`(` taxonomy_id`、 `meta_key`、` meta_value`)
 VALUES(@term_taxonomy_id、@metakey_attribute、@attr_id); 
/* 
 TERM_TAXONOMY_ID 
 */
 SELECT @term_taxonomy_id INTO OUT_ID; 
 RETURN OUT_ID; 
 END $$ 
 
 DELIMITER; 

上記の関数で新しい属性を処理した後、次のSQLを使用してWPの新しい属性レコードを表示できます...

 SELECT 
 A。*、B。*、C。* 
#P.`ID` AS `wp_id`、P.`post_title`、Taxonomy AS` Attribute`、 `name` AS` AttrValue` 
 FROM wp_terms A INNER JOIN `wp_term_taxonomy` B ON A.`term_id` = B.`term_id` 
 INNER JOIN` wp_term_relationships` C ON B.`term_taxonomy_id` = C.`term_taxonomy_id` 
 INNER JOIN wp_posts P ON C.`object_id` = P.`ID` 
 WHERE B.`taxonomy` REGEXP "^ pa _"; 

...そして、私はこの結果を得ます

 term_id name slug term_group term_taxonomy_id term_id taxonomy description parent count object_id term_taxonomy_id term_order 
 ------- ------ ------- ------- --- ---------------- ------- -------------- ---------- ------- ------ --------- ---------------- ------------ 
 558 NO 1-no 0 396 558 pa_fair-trade 0 0 6916 396 0 
 561 NO 2-no 0 399561 pa_gluten-free 0 0 6916 399 0 
 564 NO 3 -no 0 402564 pa_multi-pack 0 0 6916 402 0 
 557はい1-yes 0 395 557 pa_fair-trade 0 0 6917 395 0 
 560はい2-yes 0 398560 pa_gluten-free 0 0 6917 398 0 
 563はい3-yes 0 401563 pa_multi-pack 0 0 6917 401 0 
 559 MAYBE 1-maybe 0 397 559 pa_fair-trade 0 0 6918 397 0 
 562 MAYBE 2-maybe 0 400 562 pa_gluten-free 0 0 6918 400 0 
 565 MAYBE 3-maybe 0403565 pa_multi-pack 0 0 6918 403 0 
 557はい1-はい0 395 557 pa_fair-trade 0 0 6919 395 0 
 561いいえ2-いいえ0 399 561 pa_gluten-free 0 0 6919 399 0 
 565 MAYBE 3-maybe 0 403 565 pa_multi-pack 0 0 6919 403 0 
 557はい1-yes 0 395 557 pa_fair-trade 0 0 6920 395 0 
 561 NO 2-no 0 399 561 pa_gluten-free 0 0 6920 399 0 

これは、関連するwp_postmeta._product_attributes行用に生成したSerialized Arrayの例です

 a:3:
 {
 s:13: "pa_glute-free"; a:6:
 {s:4: "name"; s: 13: "pa_glute-free"; 
 s:5: "value"; s:0: ""; 
 s:8: "position"; s:1: "0"; 
 s:10: "is_visible"; i:1; 
 s:12: "is_variation"; i:0; 
 s:11: "is_taxonomy"; i:1; } 
 
 s:13: "pa_multi-pack"; a:6:
 {s:4: "name"; s:13: "pa_multi-pack"; 
 s:5: "value"; s:0: ""; 
 s:8: "position"; s:1: "0"; 
 s:10: " is_visible "; i:1; 
 s:12:" is_variation "; i:0; 
 s:11:" is_taxonomy "; i:1;} 
 
 s:13: "pa_fair-trade"; a:6:
 {s:4: "name"; s:13: "pa_fair-trade"; 
 s:5: "値 "; s:0:" "; 
 s:8:" position "; s:1:" 0 "; 
 s:10:" is_visible "; i:1; 
 s:12: "is_variation"; i:0; 
 s:11: "is_taxonomy"; i:1;} 
} 

WP管理領域:製品->属性

 Name Slug Type用語による順序
属性は現在存在しません。

しかし、管理領域から新しい属性を追加すると、挿入した属性が、手動で追加した属性とともに突然表示されます。

しかし...彼らは用語を表示しません。

ただし、現在手動​​で作成した属性を削除した場合、画面が更新されると、挿入された属性にリンクされたTERMSが奇跡的に表示されます。

さらに、Webサイトでは、手動でADD/DELETEを実行するまで、属性が製品に対して表示されません。

おそらくここで説明されているようにadd_new_attributeを呼び出すことができます。 github.com/woothemes/woocommerce ..

だから、私は誰かがadd_new_attributeコールが何をするか知っているかどうか尋ねていると思います...

または、属性DELETEリンクの下の呼び出しが行うこと...

 a class = "delete" href = "edit.php?post_type = product&page = product_attributes&delete = 84&_wpnonce = e270352083">削除

...注入されたデータを使用して動作させる。

任意の助けに感謝します。

1
Ben Stevens

私は自分の質問に答えていると思います。上で詳述した関数の一部としてデータをwp_woocommerce_attribute_taxonomiesにロードした後、属性の配列とそのメタデータを記録し、それをwp_optionsにポストする必要があります。wp_optionsには、ワードプレスで使用される一連の一時データが含まれます。パフォーマンスを向上させる方法.

次のクエリはうまくいくようです。

/* 
属性
 --------------- 
 wp_optionsにエントリを投稿してください
 option_name = "_transient_wc_attribute_taxonomies" 
このレコードは、ADMIN AREA  - > Products  - > Attributesインターフェース
を設定するために使用され、web  - > productsリストページの画面に属性値をポストするために使用されるようです。 
 */
 SET SESSION group_concat_max_len = 10000; 
 SET @RowNo = -1; 
 
 INSERT INTO `wp_options`(` option_name`、 [option_value`、 `autoload`)
 SELECT * FROM 
(
 SELECT [.____。" "_ transient_wc_attribute_taxonomies" AS "New_Option_Name`、
 CONCAT(" a : "、COUNT(*)、":{"、
 GROUP_CONCAT(option_value SEPARATOR" ")、
"} ")AS New_Option_Value、" yes "AS` New_Autoload` 
 [
]([
] CONCAT([
 "i:"、(@ RowNo:= @RowNo + 1)、 "; O:8:"、 ") ""、 "stdclass"、 "" "、":6: "
、" {S:12: "、" "" "、" attribute_id "、" "" "、"; " "、LENGTH(attribute_id)、": "、" ""、attribute_id、 "" ""、 ";" 
、 "S:14:"、 "" ""、 "attrib ute_name "、" "" "、"; s: "、LENGTH(attribute_name)、": "、" "" "、attribute_name、" ""、 ";" 
、 "S:15:" 、 "" "、" attribute_label "、" "" "、"; s: "、LENGTH(attribute_label)、": "、" "" "、attribute_label、" ""、 ";" 
 、 "S:14:"、 "" ""、 "attribute_type"、 "" ""、 "; s:"、LENGTH(attribute_type)、 ":"、 "" "、attribute_type、" "" "、" ; "
、" S:17: "、" "" "、" attribute_orderby "、" "" "、"; s: "、LENGTH(attribute_orderby)、": "、" ""、attribute_orderby 、 "" "、"; "
、" S:16: "、" "" "、" attribute_public "、" "" "、"; s: "、LENGTH(attribute_public)、": " 、 "" "、attribute_public、" "" "、";} "
)AS option_value 
から` wp_woocommerce_attribute_taxonomies` 
)Calculated_values 
)Formatted_Values 
重複キー更新に関するオプションoption_value = Formatted_Values.New_Option_Value; 
2
Ben Stevens