Объединить 5 таблиц PHP SQL - PullRequest
0 голосов
/ 18 марта 2011

У меня есть пять таблиц, которые необходимы для получения правильной информации в расширенное пользовательское меню в проекте Wordpress

Это пять таблиц и нужных мне столбцов

wp_term_taxonomy         - Need: term_id, taxonomy WHERE: taxonomy="nav_menu"
wp_terms                 - Need: term_id, name WHERE: term_id matches wp_term_taxonomy.term_id
wp_term_relationships    - Need: object_id, term_taxonomy_id WHERE: term_taxonomy_id matches wp_term_taxonomy.term_id
wp_postmeta              - Need: post_id, meta_key, meta_value WHERE: post_id matches wp_term_relationships.object_id AND meta_key="_menu_item_object_id"
wp_posts                 - Need: id, post_title, post_status, guid, post_parent, post_type WHERE: id matches wp_postmeta.meta_value

But that is not it I then need to:

wp_posts                 - Need: guid, post_parent, post_type WHERE: post_parent matches wp_posts.id AND post_type="attachment"
wp_postmeta              - Need: post_id, meta_key, meta_value WHERE: post_id matches wp_posts.id AND meta_key="description"

Надеюсь, это имеет смысл.

В основном я пытаюсь создать раскрывающееся меню со списком страниц в функции настраиваемого меню WordPress, взять избранное изображение каждой страницы и описание их настраиваемого поля, где у меня есть небольшой текст для дисплей.

Окончательное меню выглядит следующим образом:

До сих пор мне удавалось заставить меню работать, но не с очень хорошим типом кода:

<ul>
<?php 
    $getMenus = mysql_query('SELECT term_id, taxonomy FROM wp_term_taxonomy WHERE taxonomy="nav_menu"');
    while ($addMenus = mysql_fetch_assoc($getMenus)) { 
        $menus_id = $addMenus['term_id'];
?>
    <?php 
        $getTerms = mysql_query('SELECT term_id, name FROM wp_terms WHERE term_id='.$menus_id.'');
        while ($addTerms = mysql_fetch_assoc($getTerms)) { 
    ?>
        <li>
            <span class="menu-sub-headline"><?php echo $addTerms['name']; ?></span>
            <ul>
                <?php 
                    $getTermsRelationship = mysql_query('SELECT object_id, term_taxonomy_id FROM wp_term_relationships WHERE term_taxonomy_id='.$menus_id.'');
                    while ($addTermsRelationship = mysql_fetch_assoc($getTermsRelationship)) {

                    $termsRelationship = $addTermsRelationship['object_id'];

                    $getMetaRelationship = mysql_query('SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id='.$termsRelationship.' and meta_key="_menu_item_object_id"');
                    while ($addMetaRelationship = mysql_fetch_assoc($getMetaRelationship)) { 

                    $metaKeyValue = $addMetaRelationship['meta_value'];
                ?>
                <?php
                    $result = mysql_query('SELECT id, post_title, post_status, guid, post_parent FROM wp_posts WHERE id='.$metaKeyValue.'');
                    while ($row = mysql_fetch_assoc($result)) {
                ?>
                <li>
                <span><a href="<?php echo $row['guid']; ?>"><?php echo $row['post_title']; ?></a></span>
                <?php $thumb = $row['id']; ?>
                <ul class="menu-sub-sub-item-ul">
                    <li>
                        <span class="menu-product-headline"><?php echo $row['post_title']; ?></span>
                        <?php $getThumb = mysql_query('SELECT guid, post_parent, post_type FROM wp_posts WHERE post_parent='.$thumb.' AND post_type="attachment"');
                            while ($addThumb = mysql_fetch_assoc($getThumb)) {
                        ?>
                            <img src="<?php echo $addThumb['guid']; ?>"/>
                        <? } ?>
                        <?php $getMeta = mysql_query('SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id='.$thumb.' AND meta_key="description"'); 
                            while ($addMeta = mysql_fetch_assoc($getMeta)) {
                        ?>
                            <p><?php echo $addMeta['meta_value']; ?></p>
                            <a href="<?php echo $row['guid']; ?>"><img src="/wp-content/themes/mygind-co/images/design/read_more.png"/></a>
                        <?php } ?>
                    </li>
                </ul>
                <?php }}} ?>    
            </ul>
        </li>
    <? } ?>
<?php } ?>
</ul>

Надеюсь, некоторые из вас могут помочь мне достичь того же результата, но с помощью лучшего запроса и, возможно, даже объяснить мне, как правильно использовать объединения. Я совершенно новичок в SQL, что является причиной моих очень ограниченных знаний. До этого я читал инструкции по объединениям и сам пытался, но мне кажется, что это меню слишком сложное для проб и ошибок.

1 Ответ

2 голосов
/ 18 марта 2011

Как бы мне не хотелось рекомендовать прямые SQL-запросы в WordPress (вы всегда должны использовать query_posts(), если можете), это может быть единственным вариантом в вашем случае.Тем не менее, вам нужно будет выполнить два сложных запроса.

Сначала вам нужно запустить запрос, чтобы получить страницы в пользовательском меню.Используя требования, перечисленные в вашем вопросе ...

SELECT wtt.term_id AS term_id, wtt.taxonomy AS taxonomy, wt.name AS name, wtr.object_id AS object_id, wtr.term_taxonomy_id AS term_taxonomy_id, meta.post_id as post_id, meta.meta_key as meta_key, meta.meta_value AS meta_value, posts.post_title AS post_title, posts.post_status AS post_status, posts.guid AS guid, posts.post_parent AS post_parent, posts.post_type AS post_type
    FROM wp_term_taxonomy AS wtt
    INNER JOIN wp_terms AS wt ON wt.term_id = wtt.term_id
    INNER JOIN wp_terms_relationships AS wtr ON wtr.term_taxonomy_id = wtt.term_id
    INNER JOIN wp_postmeta AS meta ON meta.post_id = wtr.object_id
    INNER JOIN wp_posts AS posts ON posts.id = meta.meta_value
    WHERE wtt.taxonomy = "nav_menu" AND meta.meta_key = "_menu_item_object_id"

Это должно дать вам набор сообщений с соответствующими значениями, которые, по вашему мнению, вам нужны.Затем вам нужно выполнить цикл в цикле и выполнить дополнительный запрос, чтобы получить информацию, которую вы хотели получить во втором наборе данных.

///psuedocode
for( ... ) {

    SELECT posts.guid AS guid, posts.post_parent AS post_parent, posts.post_type AS post_type, meta.post_id AS post_id, meta.meta_key AS meta_key, meta.meta_value AS meta_value
        FROM wp_posts AS posts
        INNER JOIN wp_postmeta AS meta ON meta.post_id = posts.id
        WHERE posts.post_parent = XXX AND posts.post_type = "attachment" AND meta.meta_key = "description"

}

В этом случае XXX - этоИдентификатор конкретного сообщения, возвращенного первым запросом (как показано в цикле for(){ }.

Реальность такова, что ваши запросы могут быть упрощены намного , если вы можете быть болееясно, какие данные вам на самом деле нужны. Так как первый запрос - просто получить список сообщений в меню, вам, вероятно, не нужен этот огромный оператор SELECT. Я включил его только потому, что вы указали каждое из этих значений какнуждается "в вашем вопросе.

...