Как сделать запрос к таксономии пользовательского типа записи, чтобы создать список таксономии для страницы шаблона - PullRequest
0 голосов
/ 12 июня 2019

Я пытаюсь создать страницу archive-custom.php для отображения списка с вкладками. Каждый пользовательский тип записи - это «сообщение», привязанное к таксономии, которая группирует и объединяет их в «серии». Таксономия содержит информацию о каждой серии, в том числе «тип серии» и графику для каждой серии.

Цель состоит в том, чтобы на странице отображался список всех «серий» типа «main» с графическим названием и названием таксономии. Нажав на «серию», вы попадете на страницу «серии» со списком всех «сообщений»

Я получил запрос на возврат большей части необходимой мне информации, на данный момент он просто возвращает дубликаты, потому что мой запрос неправильный. Он возвращает «серию» для каждого «сообщения», поэтому, если есть 4 «сообщения», я получаю эту «серию» 4 раза. Я знаю, что запрос нужно изменить.

У меня также была проблема с возвратом названия таксономии. В приведенном ниже коде он возвращает 2 разных способа - один работает, но возвращает имя таксономии внутри ссылки, что не нужно. Другой просто возвращает «массив», потому что мой синтаксис неправильный, и я не смог найти пример в кодексе Wordpress.

Я не очень знаком с запросами Wordpress, но мне кажется, что у меня есть дубликат запроса, который здесь не нужен.

<?php       
   //this initial query is returning the results for each message instead of returning just each series in the type "main"  
   $args = array(
      'post_type'   => 'messages',
      'post_status' => 'publish',
      //thanks to dmarco for pointing out this should use the meta_query instead
      //not certain how to meta_query the attached taxonomy
      'tax_query'   => array(
         array(
        'taxonomy' => 'cpt_series',
        'field'    => 'series_type',
        'terms'    => 'main'
         )
      )
   );


   $series = new WP_Query( $args );
   if( $series->have_posts() ) :
?>
      <ul>
<?php
      while( $series->have_posts() ) :
         $series->the_post();

         //get the custom taxonomy fields and assign them to var
         //this query is to access the custom post type fields.
         $types = get_terms( array(
            'taxonomy' => 'cpt_series',
            'hide_empty' => true,
         ));

         foreach($types as $type) {
            $image = get_field('series_graphic', 'cpt_series_' . $type->term_id . '' );
            $seriesLink = get_term_link($type->term_id, $taxonomy = 'cpt_series');
            //This title doesn't work - syntax is wrong
            $seriesTitle = wp_get_post_terms('name');

            if ( has_term( $type->term_id, 'cpt_series')) {
               $seriesGraphic = $image['url'];
            }
         }
?>

         <li>
            <a href="<?=$seriesLink?>">
<?php 
               echo '<img src="' . $seriesGraphic . '" />';
               echo $seriesTitle;
               $seriesTitle = the_terms($post->ID, 'sermon_series', '');
?>
            </a>
         </li>
<?php
      endwhile;
      wp_reset_postdata();
?>
      </ul>
<?php
   else :
      esc_html_e( 'No series available!', 'text-domain' );
   endif;           
?>

Это очень близко к тому, чтобы делать то, что я хочу, снова просто получать "серию" для каждого «сообщения» вместо просто списка всех «серий» в типе «main». Хотелось бы знать, как правильно вернуть имя. Спасибо.

Ответы [ 3 ]

0 голосов
/ 12 июня 2019

Вы можете попробовать этот мета-запрос для вашего начального запроса.

$args = array(
     'post_type'   => 'messages',
     'post_status' => 'publish',
     'meta_query' => array(
        array(
         'key' => 'series_type',
         'value' => 'main',
         'compare' => 'IN',

            )

     ) 
 );
0 голосов
/ 13 июня 2019

Обнаружил, как это сделать, напрямую запросив таксономию.

$terms = get_terms(array(
   'taxonomy' => 'cpt_series',
   'hide_empty' => true,
   'meta_query' => array(
      array(
         'key'     => 'series_type',
         'value'   => 'main',
         'compare' => 'LIKE'
      ),
   ),
));

if ( ! empty( $terms ) ) {
   echo '<ul>';
   foreach ( $terms as $term ) {
      $image = get_field('series_graphic', 'cpt_series_' . $term->term_id . '' );
      $seriesLink = get_term_link($term->term_id, $taxonomy = 'cpt_series');
      $seriesGraphic = $image['url'];
   ?>
      <li>
         <a href="<?=$seriesLink?>">
            <img src="<?=$seriesGraphic?>" />
            <?=$term->name?>
         </a>
      </li>                     
 <?php                  
   }
   echo '</ul>';
} else {
   echo 'No term found.';
}

Спасибо.

0 голосов
/ 12 июня 2019

Для первой проблемы у вас есть:

$args = array(
    'post_type'   => 'messages',
    'post_status' => 'publish',
    'tax_query'   => array(
        array(
            'taxonomy' => 'cpt_series',
            'field'    => 'series_type',
            'terms'    => 'main'
        )
    )
);

'field' => 'series_type' - вы указываете здесь, что вы ищете, и варианты: term_id, name, slug или term_taxonomy_id.Зайдите в базу данных и найдите таблицу wp_terms.Там вы можете увидеть эти значения.Поэтому я предполагаю, что эти строки должны выглядеть примерно так:

array(
    'taxonomy' => 'cpt_series',
    'field'    => 'slug',
    'terms'    => 'main'
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...