【问题标题】:MySQL statement wanted to query related custom post type posts in WordPress data baseMySQL 语句要查询 WordPress 数据库中相关的自定义帖子类型帖子
【发布时间】:2016-06-22 08:06:02
【问题描述】:

使用名为 Pods 的 WordPress 插件,我定义了两种自定义帖子类型:venueevent。除了普通的元字段,Pods 还允许在帖子类型之间定义所谓的“关系”字段。

在我的例子中,我在 events 中使用了这样一个“关系”字段,将事件与 venue 相关联。 Pods 将相关 venue 帖子的 post_id 存储为 event 帖子的元值。

现在,在 WordPress 的管理员中,我想为我的自定义帖子类型 events 扩展编辑视图。我想让 events 列表按 venue 排序。 我的问题是,MySQL 语句必须如何实现这一点?我很难理解 eventsvenues 都作为帖子存储在 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' ...) 以检索相关场所的标题和其他字段。那么,如何在一个查询中做到这一点?

文吉普。

请注意:这个问题不是关于如何扩展 WordPress 管理员或如何使用 WP 挂钩在帖子列表中显示自定义列或如何制作这些列表可按自定义列排序。我只需要正确的 SQL 语句。这就是为什么我没有将我的问题发布到 wordpress.stackexchange.com。

【问题讨论】:

  • @Strawberry:看,活动和场所都是 WordPress 术语中的帖子。它们是自定义帖子类型的帖子。事件有一个标记为“event_venue”的自定义元字段,其中包含自定义帖子类型“venue”的任何帖子的 post_id。我已经编辑了伪 SQL 语句来清除。

标签: mysql sql wordpress


【解决方案1】:

考虑以下内容,它既回答了问题又解释了如何提问...

请注意,在使用这样的 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 |
+----+------------------------+-----------+-----------------+---------------+------------+

【讨论】:

  • 非常感谢您的回答@Strawberry。据我了解,您建议的数据模型与我使用的数据模型略有不同。虽然我理解您的方法,但恐怕它并不能解决我的问题。如果我想与我的 WP 应用程序的其余部分保持简洁,我无法按照您建议的方式更改数据结构。因此,场地数据集也必须存储在 wp_posts 表中。事实上,它们在应用程序的其他部分也被引用为单个对象。
  • @Bunjip 这个例子完全符合你的数据模型。
  • 糟糕,我一定是这里出了点问题......我只是无法识别场地帖子插入到 wp_posts 表中的位置。因此,我假设数据模型会有所不同......
  • 好的,知道了。您的数据模型实际上与我在问题中描述的不同。不同之处在于 meta_key 'venue' 的 meta_value 不是 字符串,而是 post_id,它再次引用 post_type 'venue' 的 wp_post 帖子。
  • 没有。虽然您的真实模型可能不同,但我的答案对应于问题中提供的模型:“meta_key = 'event_venue'”。无论哪种方式,相应地调整/扩展查询都是微不足道的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-01
  • 1970-01-01
相关资源
最近更新 更多