Измените ссылку в get_terms, если в категории есть только одно сообщение

Я создал короткий код, который будет перечислять категории в моей пользовательской таксономии и вернет список всех категорий, у которых есть хотя бы одно сообщение (не пустое).

В результате, когда кто-то нажимает на мои ссылки, он переносит их на страницу архива этой категории.

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

это мой код:

// Creates a list of eval specialties function doc_categories() { $tax = 'team_group'; // slug of taxonomy to list $terms = get_terms($tax, array('hide_empty' => 1 )); $specials = '<div>'; foreach ($terms as $term) { $slug = $term->slug; $description = $term->description; $link = "<a href='/?$tax=$slug' ><h5> $term->name </h5></a>"; $imglink ="<a href='/?$tax=$slug' ><img src='".z_taxonomy_image_url($term->term_id)."'></a>"; $specials .='<div class="flex_column av_one_third specialty flex_column_div">'; $specials .='<div class="specialty-name"'.$link.'</div>'; $specials .= $imglink; $specials .= '</div>'; } $specials .= '</div>'; return $specials; } add_shortcode( 'evalspecialties', 'doc_categories' ); 

Solutions Collecting From Web of "Измените ссылку в get_terms, если в категории есть только одно сообщение"

Это можно сделать в шаблоне, который отображает вашу страницу архива, когда wp_query возвращает только одно сообщение для данной категории. Что-то вроде этого:

 if ( $wp_query->post_count == 1 && $wp_query->max_num_pages == 1 ) { wp_redirect( get_permalink( $wp_query->posts['0']->ID ) ); exit; } 

ЗАВЕРШЕНИЕ

Из комментариев

К сожалению, когда я пробую метод один, все ссылки возвращаются на главную страницу

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

 <a href='/?$tax=$slug' ><h5> $term->name </h5></a> 

Это говорит мне, что get_term_link() не возвращает ожидаемый URL-адрес, который 404-й, который перенаправляется на главную страницу. Это вызвано, по всей вероятности, потому, что вы не очистили свои постоянные ссылки после того, как создали свою таксономию, или у вас есть проблема с permalink. Сначала вы должны отсортировать его и использовать мой код в опции 1 в качестве эталона. Как я уже сказал, мой код теперь протестирован, и все работает так, как ожидалось, поэтому оно должно работать и на вас

Просто подсказка, если что-то не работает, не скрывайте проблему так, как вы это сделали, исправьте ее. Простое скрытие проблемы может вызвать другие неожиданные вещи позже 😉

ОРИГИНАЛЬНЫЙ ОТВЕТ

Есть два способа сделать это

  • Внутри вашего короткого кода, где вы проверяете количество сообщений для этого термина, а затем запрашиваете одно сообщение, а затем показываете эту ссылку вместо ссылки категории

  • Использование $wp_query->found_posts template_redirect для перенаправления страницы терминов на одно сообщение, когда $wp_query->found_posts возвращает 1

Просто заметьте, прежде чем я начну. Вы не должны создавать свои собственные статические ссылки, они могут вызывать проблемы при изменении структуры постоянной ссылки. Пусть get_term_link() обрабатывает построение ссылок. В вашем контексте вы можете просто передать полный объект term в get_term_link() . Это не вызывает дополнительный вызов db, и у вас есть надежная ссылка на страницу терминов

ПРИМЕЧАНИЕ. Весь код не проверен

ОПЦИЯ 1

Вы можете попробовать следующее в своем коротком коде

 add_shortcode( 'evalspecialties', 'doc_categories' ); function doc_categories() { $tax = 'team_group'; // slug of taxonomy to list $specials = ''; //Define $specials as a empy string // Get all the terms belonging to the team_group taxonomy $terms = get_terms( $tax ); // IMPORTANT, make sure we have terms and also if we do not have a WP_Error if ( !$terms || is_wp_error( $terms ) ) return $specials; // Ok, everything checks out, lets continue $specials .= '<div>'; foreach ( $terms as $term ) { // Just in case we somehow set hide_empty to false through a filter if ( 0 == $term->count ) continue; $description = $term->description; $term_link = get_term_link( $term ); // If we have more than one post, show term link, otherwise show post permalink if ( 1 == $term->count ) { $args = [ 'posts_per_page' => 1, 'fields' => 'ids', //Just get postID 'tax_query' => [ [ 'taxonomy' => $term->taxonomy, 'terms' => $term->term_id, ] ], // Add any extra parameter ]; $q = get_posts( $args ); $term_link = get_permalink( $q[0] ); } $link = '<a href="' . esc_url( $term_link ) . '"><h5>' . $term->name . '</h5></a>'; $imglink = '<a href="' . esc_url( $term_link ) . '"><img src="' . z_taxonomy_image_url($term->term_id) . '"></a>'; $specials .= '<div class="flex_column av_one_third specialty flex_column_div">'; $specials .= $link; $specials .= $imglink; $specials .= '</div>'; } //endforeach $specials .= '</div>'; return $specials; } 

ВАРИАНТ 2

Это лучший более чистый способ сделать это. Здесь вы в основном просто обмениваете значение $found_posts , а затем перенаправляете на одну страницу сообщения, если значение равно 1. Мы будем использовать template_redirect здесь.

Сначала быстро измените свой короткий код

 add_shortcode( 'evalspecialties', 'doc_categories' ); function doc_categories() { $tax = 'team_group'; // slug of taxonomy to list $specials = ''; // Define $specials as a empy string // Get all the terms belonging to the team_group taxonomy $terms = get_terms( $tax ); // IMPORTANT, make sure we have terms and also if we do not have a WP_Error if ( !$terms || is_wp_error( $terms ) ) return $specials; // Ok, everything checks out, lets continue $specials .= '<div>'; foreach ( $terms as $term ) { // Just in case we somehow set hide_empty to false through a filter if ( 0 == $term->count ) continue; $description = $term->description; $term_link = get_term_link( $term ); $link = '<a href="' . esc_url( $term_link ) . '"><h5>' . $term->name . '</h5></a>'; $imglink = '<a href="' . esc_url( $term_link ) . '"><img src="' . z_taxonomy_image_url($term->term_id) . '"></a>'; $specials .= '<div class="flex_column av_one_third specialty flex_column_div">'; $specials .= $link; $specials .= $imglink; $specials .= '</div>'; } //endforeach $specials .= '</div>'; return $specials; } 

Это будет действие перенаправления

 add_action( 'template_redirect', function () { global $wp_query; // Check if found_posts is 1, if not, bail if ( 1 != $wp_query->found_posts ) return; // Only target or taxonomy page if ( !is_tax( 'team_group' ) ) return; // We only have one post, redirect to the single post page $single_post = $wp_query->post; $permalink = get_permalink( $single_post ); wp_redirect( esc_url( $permalink ) ); exit; }); 

РЕДАКТИРОВАТЬ

Вышеприведенный код теперь протестирован и работает