使用名为 Pods 的 WordPress 插件,我定义了两种自定义帖子类型: field 和事件。除了普通的元字段之外,Pods 还允许在帖子类型之间定义所谓的“关系”字段。
就我而言,我在事件中使用这样的“关系”字段,将事件与 field 相关联。 Pod 将相关地点帖子的 post_id 存储为事件帖子的元值。
现在,在 WordPress 管理员中,我想扩展自定义帖子类型事件的编辑 View 。我想让事件列表可以按地点排序。 我的问题是,MySQL 语句必须是什么样子才能实现这一点?我很难理解这样一个事实:事件和 field 都作为帖子存储在 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'
上面的语句让我获得了事件的标题以及相关 field 的 ID。使用此 ID,我需要再次查询 wp_posts 和 wp_postmeta (... WHERE t1.post_type = 'venue' ...
) 以检索相关 field 的标题和其他字段。那么,如何在一个查询中执行此操作?
Bunjip。
请注意:这个问题不是关于如何扩展 WordPress 管理或如何使用 WP Hook 在帖子列表中显示自定义列或如何创建这些列表可按自定义列排序。我所需要的只是正确的 SQL 语句。这就是为什么我没有将问题发布到 wordpress.stackexchange.com。
最佳答案
考虑以下内容,它既回答了问题,又解释了如何提问......
请注意,在使用此类 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 |
+----+------------------------+-----------+-----------------+---------------+------------+
关于MySQL语句想要查询WordPress数据库中相关的自定义帖子类型帖子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35866344/