MySQL语句想要查询WordPress数据库中相关的自定义帖子类型帖子

标签 mysql sql wordpress

使用名为 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/

相关文章:

mysql - WordPress - 如何获得浏览次数最多的帖子?

javascript - 函数 wp_enqueue_script 允许重复

PHP 从 MySQL 获取下一个结果

PHP 和 MySQL 总是为列插入 0

mysql - 自动刷新$scope

sql - 如何优化这个查询?

java - 更新表时"Parameter index out of range (3 > number of parameters, which is 2)."

MySQL查询组合1个条件及其否定条件

php - 不同MySQL数据库中多个表之间的阿拉伯语数据传输返回????????作为新的值(value)观

javascript - jQuery "load more posts"如果上次发布则隐藏按钮