我对此并不熟悉,所以这是我的问题。
我有一个自定义的书籍类型,我得到了一个课程。 我可以添加书籍,我可以添加课程。每当我在管理面板上添加新课程时,我都可以为其添加书籍。多个课程可以连接到同一本书,一本书可以放在一个以上的课程中。
正如我在数据库中看到的那样:
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
这很好用(记住;我没有那么多经验)。我可以在管理面板中相互连接书籍和课程。我也看到了它(thumbnail
,title
等)
我想要的;如果在页面上选择课程,它将打开并向我显示该课程。这意味着该帖子的标题和内容。但我希望它也能显示匹配的书。
我使用现有的插件(LearnPress,old version 0.9.20
或其他东西)作为基础。
所以我想要的是:我希望表wp_postmeta中的所有post_id都具有与当前页面的 post_id 匹配的meta_value。
让我们说当前的课程页面的post_id为95.我想在 wp_postmeta 表中找回post_id的216和276。所以我可以使用这些id,所以我可以先使用ID 216来获取URL和缩略图。然后从276等检索数据(也许有一天,如果我理解了所有这些,但现在对我来说可能太难了)
这对我来说真的很复杂,我只是陷入困境。它真的,真的在烦我(它现在04:45大声笑)
如果我$echo $lesson_id
,我可以检索课程的ID;
但我不知道如何获得匹配的数据来显示书籍。
用于获取课程数据的代码部分位于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
"
)
);
而不是一些代码在屏幕上显示它。 但是,别的东西。我真的很困惑。
我会把饼干和巧克力送给可以帮助我的人。
编辑编辑编辑:
米兰kyada的答案对我来说没有用。
我发现我可以通过$ lesson_id检索课程ID。通过本课程ID,我可以在meta_value中搜索相应的书籍。这也意味着我只需要使用表 wp_postmeta 。
所以我在$ lesson_id中搜索meta_value,而不是想要相应的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个或更多书籍对应的课程。所以我想要其余的:
$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代替它,它不起作用。
我该如何解决这个问题?或者将两个表合并为一个?
答案 0 :(得分:0)
我找到了答案:
$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代替=。