我正在使用wordpress / woocommerce数据库结构,并希望进行自定义查询。
基本上我需要在没有特定变化的情况下抓取所有产品,而且我在加入ID时遇到问题。
产品和product_variation都是帖子以及关联的 postmeta 。
示例模式:
wp_posts wp_postmeta
ID post_id
post_parent meta_key
post_type meta_value
post_status
wp_posts 表的示例如下所示:
id name post_parent meta_key meta_value
2 tshirt null
3 pants null
4 2 variation_type red
5 2 variation_type blue
在这里你可以看到4个帖子; 2个产品和2个变化。变体的 post_parent 指向产品。所以我有一件红色和蓝色的T恤
我需要的是抓住所有带蓝色变体的产品,这意味着我需要将post_parent加入id。
这是我到目前为止所做的。
SELECT * FROM wp_posts wp1
INNER JOIN wp_postmeta pm1
ON (pm1.post_id = wp1.ID)
INNER JOIN wp_postmeta pm2
ON (pm2.post_id = wp1.ID)
JOIN wp_posts wp2
ON (wp2.post_parent = wp1.ID)
AND wp1.post_type = 'product_variation'
AND wp1.post_status = 'publish'
AND pm1.meta_key = 'groups-groups_read_post'
AND pm1.meta_value = 'vet_read'
AND pm2.meta_key = 'variation_type'
AND pm2.meta_value = 'blue'
我相信我做错了。任何指导都表示赞赏。
答案 0 :(得分:0)
这个过程非常复杂,因为很多事情都在幕后进行。在我的一个项目中,我必须根据某个属性获取所有post id(主要产品ID)。
SELECT
DISTINCT p.post_parent FROM `wp_posts` AS p
LEFT JOIN
`wp_postmeta` AS pm ON p.ID = pm.post_id
LEFT JOIN
`wp_postmeta` AS pm2 ON p.ID = pm2.post_id
WHERE
p.post_type = 'product_variation' AND
(
(pm.meta_key = 'attribute_pa_size' AND pm.meta_value = "XL") OR
(pm.meta_key = 'attribute_size' AND pm.meta_value = "XL")
) AND
pm2.meta_key = '_stock' AND pm2.meta_value != '0'
我有一个变种size
,我想抓住有这种变化的产品,当然不会缺货。您会注意到我必须检查meta_key
两次,因为当您在产品编辑器页面中输入属性时,woocommerce会将其存储为attribute_{$attribute_name}
并将其保存在属性部分中。但是,如果您从之前保存的可用属性下拉列表中选择它,那么您必须查找attribute_pa_{$attribute_name}
。我相信您可以根据您的要求修改此SQL
。
注意:如果您打算将此自定义查询与pre_get_posts
一起使用来设置post__in
参数,那么很遗憾它无效。 Woocommerce有一个过滤器loop_shop_post_in
可以覆盖它。只是为了让你知道。
希望这对你有所帮助。
答案 1 :(得分:0)
我把它解决了,这就是我需要的东西
f = open('record.txt', 'rb')
for line in f:
print line