Как получить название категории из URL и передать в шаблон
Я использую следующий шаблон страницы для отображения записей из одной категории и планирую форматировать первую запись иначе, чем остальные. Это работает как нужно, но у меня название категории жестко прописано в шаблоне. Я хочу использовать этот шаблон для нескольких разных категорий и мне нужно научиться передавать название категории в шаблон из ссылки.
Например, ссылка на нужную страницу с особым шаблоном http://wildcatweb.net/5th/, где '5th' - это название категории. Как указать шаблону брать название категории из URL и использовать его в шаблоне?
<?php
/*
Шаблон страницы: pageAssignments
*/ ?>
<?php get_header(); ?>
<div class="small-12 large-8 columns" id="content" role="main">
<header>
<h1 class="entry-title"><?php the_title(); ?></h1>
</header>
<!-- Показываем последнюю запись ПОЛНОСТЬЮ -->
<?php
// Получаем последний сегмент URL как название категории
$category_slug = basename(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH));
query_posts('showposts=1&category_name='.$category_slug);
?>
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<div class="lastest-post">
<h2 class="pagetitle"><?php the_title(); ?></h2>
<?php the_content(); ?>
</div><!--закрываем .latest-post -->
<?php endwhile; endif; ?><!-- конец последней записи -->
<!-- Показываем старые записи в виде анонсов -->
<?php
query_posts('showposts=5&offset=1&category_name='.$category_slug);
?>
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<div class="older-post">
<h3 class="pagetitle"><a href="<?php the_permalink() ?>" rel="bookmark" title="<?php the_title(); ?>"><?php the_title(); ?></a></h3>
<?php the_excerpt(); ?>
</div><!--.older-post -->
<?php endwhile; endif; ?><!-- конец старых записей -->
</div>
<?php get_sidebar(); ?>
<?php get_footer(); ?>

Вместо создания страниц и назначения шаблона, я бы использовал фильтр category_template
для загрузки конкретного шаблона для всех этих определенных категорий. В этом примере я использую жестко заданный массив, но его можно адаптировать для загрузки опции, которая хранит ярлыки категорий, к которым нужно применить шаблон.
function wpa_category_template( $templates = '' ){
// Массив специальных категорий
$special_categories = array(
'one',
'another',
'more'
);
// Получаем текущую категорию
$this_category = get_queried_object();
// Проверяем, является ли текущая категория специальной
if( in_array( $this_category->slug, $special_categories ) ){
// Ищем шаблон special_category.php
$templates = locate_template( array( 'special_category.php', $templates ), false );
}
return $templates;
}
// Добавляем фильтр для шаблона категорий
add_filter( 'category_template', 'wpa_category_template' );
Теперь вам больше не нужно делать запрос для этих записей в шаблоне, так как записи уже находятся в основном запросе. (Кстати, никогда не используйте query_posts
).
В шаблоне вы можете использовать функцию single_cat_title
для вывода названия категории.
Также вам не нужно использовать два запроса и цикла для того, чтобы стилизовать первую запись по-другому. Просто проверяйте переменную current_post
в цикле, чтобы знать, какую запись вы выводите.
if (have_posts()):
while (have_posts()):
the_post();
// Проверяем, является ли текущая запись первой
if( 0 == $wp_query->current_post ):
echo 'это первая запись';
else:
echo 'это запись > 1';
endif;
endwhile;
endif;

WordPress будет использовать первый найденный файл шаблона из текущей темы в следующем порядке:
- category-slug.php
- category-ID.php
- category.php
- archive.php
- index.php
Источник: http://codex.wordpress.org/Category_Templates
Вы можете добавить название категории, вставив этот код в шаблон до начала цикла (The Loop):
<p>Категория: <?php single_cat_title(); ?></p>

Я не хочу, чтобы этот шаблон применялся ко всем страницам категорий, только к тем 5-6, которым нужно особое форматирование. Именно поэтому я создаю отдельный шаблон. Помимо дублирования шаблона для каждого category-ID или category-slug, есть ли у вас идеи, как я могу передать название категории в шаблон? Спасибо за помощь

Если вы хотите использовать этот шаблон для нескольких категорий, скорее всего, вы назвали его category.php
?
Чтобы получить название термина, который в данный момент отображается, используйте этот код (перед входом в The Loop) -
$taxonomy_slug = $wp_query->tax_query->queries[0]['taxonomy'];
$term_slug = $wp_query->tax_query->queries[0]['terms'][0];
$term = get_term_by('slug', $term_slug, $taxonomy_slug);
$term_name = $term->name;
А затем замените -
<h1 class="entry-title"><?php the_title(); ?></h1>
На -
<h1 class="entry-title"><?php echo $term_name ?></h1>

Я не назвал файл category.php, потому что хочу использовать его только для нескольких категорий, так как планирую добавить специальное форматирование всего для 5-6 страниц. Спасибо, что показали, как выводить запрос. Думаю, это будет полезно для разных задач. Рассмотрю подробнее, когда выдастся возможность сегодня.
