在自定义帖子类型WordPress

时间:2016-08-27 03:04:21

标签: php mysql wordpress

我对此并不熟悉,所以这是我的问题。

我有一个自定义的书籍类型,我得到了一个课程。 我可以添加书籍,我可以添加课程。每当我在管理面板上添加新课程时,我都可以为其添加书籍。多个课程可以连接到同一本书,一本书可以放在一个以上的课程中。

正如我在数据库中看到的那样:

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

这很好用(记住;我没有那么多经验)。我可以在管理面板中相互连接书籍和课程。我也看到了它(thumbnailtitle等)

我想要的;如果在页面上选择课程,它将打开并向我显示该课程。这意味着该帖子的标题和内容。但我希望它也能显示匹配的书。

我使用现有的插件(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代替它,它不起作用。

我该如何解决这个问题?或者将两个表合并为一个?

1 个答案:

答案 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代替=。