locate_template с несколькими категориями?

в этом примере (из книги Wrox), если существует файл с single-category-$slug.php , он будет показан, в противном случае это файл single.php . Но если у нас есть более одной категории для каждого сообщения (давайте рассмотрим, что массивы $templates будут содержать более одного результата), что будет содержать $template ? где мы выбираем правильный слизень с этим кодом?

 <?php add_filter( 'single_template', 'boj_single_template' ); function boj_single_template( $template ) { global $wp_query; /* Check if viewing a singular post. */ if ( is_singular( 'post' ) ) { /* Get the post ID. */ $post_id = $wp_query->get_queried_object_id(); /* Get the post categories. */ $terms = get_the_terms( $post_id, 'category' ); /* Loop through the categories, adding slugs as part of the file name. */ $templates = array(); foreach ( $terms as $term ) $templates[] = "single-category-{$term->slug}.php"; /* Check if the template exists. */ $locate = locate_template( $templates ); /* If a template was found, make it the new template. */ if ( !empty( $locate ) ) $template = $locate; } /* Return the template file name. */ return $template; } ?> 

благодаря

Solutions Collecting From Web of "locate_template с несколькими категориями?"

Вы отправили код по всем категориям, которые назначены почтой.

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

Функция locate_template() будет проходить через массив $templates и вернуть первую из них, которая фактически существует. То, что будет присвоено переменной $ template.

Если окажется, что ни один из файлов не существует, я считаю, что locate_template() вернет false. Ваш код там просто проверяет, удалось ли locate_template() найти любой из шаблонов, прежде чем назначать его $template .

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

Изменить: Дополнительная информация

get_the_terms использует wp_get_object_terms который по умолчанию возвращает термины в порядке возрастания по имени, поэтому, если сообщение находится в нескольких категориях, вы всегда будете загружать шаблон первого слова в алфавитном порядке. Чтобы изменить это поведение, используйте wp_get_object_terms напрямую и укажите orderby arg для «count», «slug», «term_group», «term_order» или «term_id».