我不太熟悉这个,所以这是我的问题。
我有一个自定义的书籍 posttype,我得到了其中一课。 我可以添加书籍,我可以添加类(class)。每当我在管理面板上添加新类(class)时,我都可以向其中添加书籍。多个类(class)可以连接到同一本书,一本书可以放在多个类(class)中。
正如我在我的数据库中看到的那样:
wp_post:
ID post_title post_content post_type
95 titletest bladieblabla lpr_lesson
97 titletest2 a lot of content lpr_lesson
216 hellotest lpr_book
276 hellotest2 lpr_book
wp_postmeta:
meta_id post_id meta_key meta_value
897 216 _lpr_book_url https://en.wikibooks.org/1
911 276 _lpr_book_url https://en.wikibooks.org/2
985 276 _lpr_lesson 97
[..] [..] [..] [..]
1001 216 _lpr_lesson 95
1002 276 _lpr_lesson 95
而且效果很好(记住;我对此经验不多)。我可以在管理面板中将书籍和类(class)相互关联。我也看到了(thumbnail
、title
等)
我想要什么;如果在页面上选择一节课,它会打开并显示该课。这意味着该帖子的标题和内容。但我希望它也显示匹配的书。
我使用现有的插件(LearnPress、旧版本 0.9.20
或其他东西)作为基础。
所以我想要的是:我想要表 wp_postmeta 中的所有 post_id,其 meta_value 与当前页面的 post_id 匹配。
假设当前类(class)页面的 post_id 为 95。比我想在 wp_postmeta 表中取回 post_id 的 216 和 276。所以我可以使用这些 ID,这样我就可以先使用 ID 216 来获取 URL 和缩略图。然后从 276 等中检索数据(如果我理解了这一切,也许有一天标题,但现在对我来说可能太难了)
这对我来说真的很复杂,我只是被困住了。这真的真的很烦我(现在是 04:45 哈哈)
如果我执行 $echo $lesson_id
,我可以检索类(class)的 ID;
但是我不知道如何获取匹配数据来显示书籍。
获取类(class)数据的代码部分在这里http://pastebin.com/PERv6g5L
当然,我想要一个解决方案来完成这项工作,但如果可能的话,我还想要一个(小的)解释如何以及为什么这样我学会理解它是如何工作的。
我知道我(可能?)应该使用类似的东西:
$books = $wpdb->get_results(
"
SELECT pm.meta_value
FROM $wpdb->posts AS p
INNER JOIN $wpdb->postmeta AS pm ON p.ID = pm.post_id
WHERE mp.meta_key = _lpr_lesson
OR mp.meta_key = _lpr_book_url
"
)
);
还有一些代码可以在屏幕上显示它。 但是,还有别的。我真的很困惑。
我会把 cookies 和巧克力送给能帮助我的人。
编辑编辑编辑:
milan kyada 的答案不适合我。
我发现我可以通过 $lesson_id 检索类(class) ID。有了这个类(class) ID,我可以在 meta_value 中搜索相应的书籍。这也意味着我只需要使用表 wp_postmeta。
所以我在 meta_value 中搜索 $lesson_id,然后我想要相应的 post_id(书籍的:例如 216)。然后我尝试使用那些 post_id(s) 通过使用 meta_key _lpr_book_url 或 _thumbnail_id 过滤该 post_id 来获取 meta_value。所以我得到 2 个结果:URL 和缩略图 ID。
所以我尝试了什么:
$books = $wpdb->get_results(
"
SELECT meta_value
FROM $wpdb->postmeta
WHERE (meta_key = '_lpr_book_url' OR meta_key = '_thumbnail_id')
AND post_id = (
SELECT post_id
FROM $wpdb->postmeta
WHERE meta_value = $lesson_id
GROUP BY meta_value
)
"
);
返回:
Array ( [0] => stdClass Object ( [meta_value] => https://www.brinkman-uitgeverij.nl/lesmateriaal/backend-programmeren ) [1] => stdClass Object ( [meta_value] => 272 ) )
这行不通。它只返回它找到的第一本书,而不返回其他的。如果我使用 GROUP BY post_id,我根本得不到任何结果。
如果我使用这个:
$books_id = $wpdb->get_results(
"
SELECT pm.post_id
FROM $wpdb->postmeta AS pm
WHERE pm.meta_value = $lesson_id
"
);
print_r($books_id);
返回:
Array ( [0] => stdClass Object ( [post_id] => 216 ) [1] => stdClass Object ( [post_id] => 276 ) )
我得到 1 个或多个对应类(class)的图书 ID。所以我想要剩下的:
$books = $wpdb->get_results (
"
SELECT meta_value
FROM $wpdb->postmeta
WHERE post_id = 216
AND (meta_key = '_lpr_book_url' OR meta_key = '_thumbnail_id')
"
);
返回:
Array ( [0] => stdClass Object ( [meta_value] => https://en.wikibooks.org/1 ) [1] => stdClass Object ( [meta_value] => 272 ) )
但是如你所见。我使用硬编码 216。如果我改用 $book_id,它不起作用。
我该如何解决这个问题?或者将两个表合并为一个?
最佳答案
我找到了答案:
$books = $wpdb->get_results(
"
SELECT meta_value
FROM $wpdb->postmeta
WHERE (meta_key = '_lpr_book_url' OR meta_key = '_thumbnail_id')
AND post_id IN (
SELECT post_id
FROM $wpdb->postmeta
WHERE meta_value = $lesson_id
)
ORDER BY post_id, meta_key
"
);
我应该使用 IN 而不是 =。
关于php - 在自定义帖子类型 WordPress 中插入来自自定义帖子类型的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39177060/