Как получить список терминов с его CPT? - PullRequest
0 голосов
/ 18 февраля 2019

У меня на сайте есть карта с точками, на которой я локализую количество офисов в каждой стране на карте.

Как это работает, в основном у меня CPT как office, и я создаю посты как городнапример, Нью-Йорк, Лондон и т. д.

Например, если у меня есть офис в Нью-Йорке, США, я создам пост в Нью-Йорке, а пользовательской категорией будет название страны в качестве США.Кроме того, в office CPT у меня есть настраиваемые поля для координации точек на карте как Home_x и Home_Y.

Таким образом, результат с приведенным ниже кодом выглядит так:

  • США / Нью-Йорк
  • США / Чикаго
  • Великобритания / Лондон
  • Великобритания / Бристоль
  • Испания / Барселона
  • Испания / Гранада

Мой код для цикла:

    <div class="map-wrapper">
        <div class="map">

            <?php

            $terms = get_terms(array(
                'taxonomy' => 'office-country',
                'hide_empty' => false,
            ));
            ?>
            <?php foreach ($terms as $term) : ?>
                <?php
                $re = explode('-', $term->name);
                $args = array (
                    'post_type' => 'office', //
                    'posts_per_page' => -1,
                    'order' => 'ASC',
                    'tax_query'     => array(
                        array(
                            'taxonomy'  => 'office-country',
                            'field'     => 'id',
                            'terms'     => $term->term_id,
                        ),
                    ),
                );
                $query = new WP_Query( $args );
                if( $query->have_posts() ){
                    while( $query->have_posts() ){
                        $query->the_post();
                        $title =  get_the_title();
                        $info = get_post_meta(get_the_ID(), '_post_info', true);
                        $link = get_term_meta($term->term_id, 'link', true);
                        ?>
                        <a href="<?php echo $link ?>"
                           class="point <?php if ($term->slug === $_GET['country']) echo 'active' ?>"
                           style="left: <?php echo  $info['home_x']; ?>px; top: <?php echo $info['home_y']; ?>px;"
                           data-target=".country-popup-<?php echo $term->term_id ?>">
                            <div class="inner"></div>
                            <div class="text">
                                <span class="name"><?php echo $re[0] ?> </span>
                                    <span class="number"><?php echo " / ".$title; ?>
                                </span>
                            </div>
                        </a>

                        <?php
                    }
                }
            endforeach; ?>

        </div>
    </div>

и мое настраиваемое поле для CPT:

  <tr>
        <th>
            <label><?php _e('Home X'); ?></label>
        </th>
        <td>
            <input type="text" name="_post_info[home_x]" value="<?php echo $info['home_x'] ?>">
        </td>
    </tr>

    <tr>
        <th>
            <label><?php _e('Home Y'); ?></label>
        </th>
        <td>
            <input type="text" name="_post_info[home_y]" value="<?php echo $info['home_y'] ?>">
        </td>
    </tr>

Приведенный выше код отлично подходит для этой цели.

Но я хочу изменить пользовательскую таксономию как офисную и разместить как название страны.Вместо создания нескольких постов для города гораздо проще создать пост страны и добавить города в качестве пользовательской таксономии.Поэтому я пытаюсь изменить приведенный ниже код по-новому.

Я изменил код цикла, как показано ниже, и создал настраиваемое поле для пользовательской таксономии, я также указываю его ниже.

Новый цикл;

<div class="map-wrapper">
                <div class="map">

                    <?php

                    $terms = get_terms(array(
                        'taxonomy' => 'office-city',
                        'hide_empty' => false,
                    ));
                    ?>
                    <?php foreach ($terms as $term) : ?>
                        <?php
                        $re = explode('-', $term->name);
                        $args = array (
                            'post_type' => 'office-country', //
                            'posts_per_page' => -1,
                            'order' => 'ASC',
                            'tax_query'     => array(
                                array(
                                    'taxonomy'  => 'office-city',
                                    'field'     => 'id',
                                    'terms'     => $term->term_id,
                                ),
                            ),
                        );

                        $query = new WP_Query( $args );
                        if( $query->have_posts() ){
                            while( $query->have_posts() ){
                                $query->the_post();
                                $title =  get_the_title();
                                // $info = get_post_meta(get_the_ID(), '_post_info', true);
                                $link = get_term_meta($term->term_id, 'link', true);
                                $MapY = get_term_meta($term->term_id, 'home_y', true);
                                $MapX = get_term_meta($term->term_id, 'home_x', true);
                                ?>
                                <a href="<?php echo $link ?>"
                                   class="point <?php if ($term->slug === $_GET['country']) echo 'active' ?>"
                                   style="left: <?php echo  $MapY ?>px; top: <?php echo $MapX ?>px;"
                                   data-target=".country-popup-<?php echo $term->term_id ?>">
                                    <div class="inner"></div>
                                    <div class="text">
                                        <span class="name"><?php echo $title; ?> </span>
                                            <span class="number"><?php echo " / ".$re[0] ?>
                                        </span>
                                    </div>
                                </a>

                                <?php
                            }
                        }
                    endforeach; ?>

                </div>
            </div>

Пользовательское поле для таксономии;

add_action( 'office-country_edit_form_fields', 'office_country_taxonomy_custom_fields', 10, 2 );
function office_country_taxonomy_custom_fields($tag) {
    ?>

    <tr>
        <th>
            <label><?php _e('Home X'); ?></label>
        </th>
        <td>
            <input type="text" name="_term_meta[home_x]" value="<?php echo get_term_meta($tag->term_id, 'home_x', true)  ?>">
        </td>
    </tr>

    <tr>
        <th>
            <label><?php _e('Home Y'); ?></label>
        </th>
        <td>
            <input type="text" name="_term_meta[home_y]" value="<?php echo get_term_meta($tag->term_id, 'home_y', true) ?>">
        </td>
    </tr>


    <?php
}

Но когда я применил этот код, он частично работает, и я понятия не имею, чтобы изменить запрос.

Результат;

  • США / Нью-Йорк
  • Великобритания / Лондон
  • Испания / Барселона

Таким образом, он показывает только сообщения по таксономии, но я хочу показать все города в каждой стране, как показано ниже:

  • США / Нью-Йорк
  • США / Чикаго
  • Великобритания / Лондон
  • Великобритания / Бристоль
  • Испания / Барселона
  • Испания / Гранада

Извините, это длинный вопрос.Я надеюсь, что вы, ребята, можете помочь в этом, и я надеюсь, что вы, ребята, поняли мой ломаный английский.

1 Ответ

0 голосов
/ 19 февраля 2019

Ваш цикл работает правильно, так как я получил результат, который вы хотели.

<?php

$terms = get_terms(array(
    'taxonomy' => 'office-city',
    'hide_empty' => false,
));

foreach ($terms as $term) : 
    $args = array (
        'post_type' => 'office-country', //
        'posts_per_page' => -1,
        'order' => 'ASC',
        'orderby' => 'title',
        'tax_query'     => array(
            array(
                'taxonomy'  => 'office-city',
                'field'     => 'id',
                'terms'     => $term->term_id,
            ),
        ),
    );

    $query = new WP_Query( $args );
    if( $query->have_posts() ){
        while( $query->have_posts() ){
            $query->the_post();
            $title =  get_the_title();
            echo '<p>'. $title . '/' . $term->name . '</p>';
        }
    }
endforeach; ?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...