使用名为Pods的WordPress插件,我定义了两种自定义帖子类型:场地和事件。除了简单的元字段,Pods允许在帖子类型之间定义所谓的“关系”字段。
就我而言,我在 events 中使用了这样一个“关系”字段,将事件与场所联系起来。 Pod将相关场地帖子的post_id存储为事件帖子的meta_value。
现在,在WordPress的管理员中,我想扩展自定义帖子类型事件的编辑视图。我想通过场地对事件列表进行排序。 我的问题是,MySQL语句必须如何实现这一点?我无法解决这样一个事实:事件和场地都存储在wp_post表中的帖子中。
相关架构如下:
wp_posts
(id
,post_title
,post_type
)
wp_postmeta
(meta_id
,post_id
,meta_key
,meta_value
)
我正在寻找像
这样的东西SELECT t1.post_title AS event_title
, t2.meta_value AS venue
FROM wp_posts AS t1
JOIN wp_postmeta AS t2
ON t2.post_id = t1.id
WHERE t1.post_type = 'event'
AND t2.meta_key = 'event_venue'
上面的陈述让我了解事件的标题以及相关场地的ID。有了这个id,我需要再次查询wp_posts和wp_postmeta(... WHERE t1.post_type = 'venue' ...
)来检索相关场地的标题和其他字段。那么,如何在一个查询中执行此操作?
Bunjip。
请注意:此问题不有关如何扩展WordPress管理员或如何使用WP挂钩在帖子列表中显示自定义列以及如何制作这些列表可以按自定义列排序。我只需要正确的SQL语句。这就是为什么我没有将我的问题发布到wordpress.stackexchange.com。
答案 0 :(得分:0)
考虑以下问题,它们都回答问题并解释如何提出问题......
请注意,使用此类EAV时,如果可能的话,构建数据仍然有用,这样您就可以使用数据类型。因此,日期,字符串和整数都进入单独的表。
DROP TABLE IF EXISTS wp_posts;
CREATE TABLE wp_posts
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,post_title VARCHAR(30) NOT NULL
,post_type VARCHAR(30) NOT NULL
);
INSERT INTO wp_posts VALUES
(1,'Adele at the O2','event'),
(2,'Springsteen at Wembley','event'),
(3,'Twickenham Car Boot Sale','market');
DROP TABLE IF EXISTS wp_postmeta;
CREATE TABLE wp_postmeta
(post_id INT NOT NULL
,meta_key VARCHAR(30) NOT NULL
,meta_value VARCHAR(30) NOT NULL
,PRIMARY KEY(post_id,meta_key)
);
INSERT INTO wp_postmeta VALUES
(1,'venue','The O2 Arena'),
(1,'date','2016-03-08'),
(2,'venue','Wembley Stadium'),
(2,'support_act','Dan Patlansky'),
(2,'date','2016-03-09'),
(3,'venue','Twickenham Car Park'),
(3,'date','2016-03-08');
SELECT p.*
, venue.meta_value venue
, support_act.meta_value support_act
, date.meta_value date
FROM wp_posts p
LEFT
JOIN wp_postmeta venue
ON venue.post_id = p.id
AND venue.meta_key = 'venue'
LEFT
JOIN wp_postmeta support_act
ON support_act.post_id = p.id
AND support_act.meta_key = 'support_act'
LEFT
JOIN wp_postmeta date
ON date.post_id = p.id
AND date.meta_key = 'date'
WHERE p.post_type = 'event';
+----+------------------------+-----------+-----------------+---------------+------------+
| id | post_title | post_type | venue | support_act | date |
+----+------------------------+-----------+-----------------+---------------+------------+
| 1 | Adele at the O2 | event | The O2 Arena | NULL | 2016-03-08 |
| 2 | Springsteen at Wembley | event | Wembley Stadium | Dan Patlansky | 2016-03-09 |
+----+------------------------+-----------+-----------------+---------------+------------+