Как получить название категории из URL и передать в шаблон

2 янв. 2014 г., 18:13:29
Просмотры: 14.8K
Голосов: 1

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

Например, ссылка на нужную страницу с особым шаблоном 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(); ?>
0
Все ответы на вопрос 3
1

Вместо создания страниц и назначения шаблона, я бы использовал фильтр 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;
2 янв. 2014 г. 19:24:22
Комментарии

Мило, спасибо за помощь. Ваше лаконичное решение было идеальным и гораздо проще, чем моя первая попытка. Я быстро учусь в WordPress, и ваш ответ оказался именно тем, что мне было нужно. Еще раз спасибо.

user3154076 user3154076
3 янв. 2014 г. 20:55:01
2

WordPress будет использовать первый найденный файл шаблона из текущей темы в следующем порядке:

  1. category-slug.php
  2. category-ID.php
  3. category.php
  4. archive.php
  5. index.php

Источник: http://codex.wordpress.org/Category_Templates

Вы можете добавить название категории, вставив этот код в шаблон до начала цикла (The Loop):

<p>Категория: <?php single_cat_title(); ?></p>
2 янв. 2014 г. 18:26:51
Комментарии

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

user3154076 user3154076
2 янв. 2014 г. 18:55:14

Обновил свой ответ с кодом.

Brad Dalton Brad Dalton
2 янв. 2014 г. 19:10:19
1

Если вы хотите использовать этот шаблон для нескольких категорий, скорее всего, вы назвали его 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>
2 янв. 2014 г. 18:26:57
Комментарии

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

user3154076 user3154076
2 янв. 2014 г. 18:49:37