Я тут, наверное, уже всех замучил. Но, думаю не зря. Вот вышел на финишную прямую и осталось только несколько шагов до полной реализации задуманного. Решил я сделать на базе WordPress каталог фильмов. Сначала попробовал использовать плагин Magic Fields 2, но он оказался сложен в использовании, а как им пользоваться никто не признавался.:lol: Решил поискать информацию в интернете и реализовать задуманное с помощью пользовательских полей (custom taxonomy) без использования плагинов. Правда, один все же пришлось установить, но об этом позже. И так. Мне требовалась сортировка фильмов по следующим признакам: Год, Режиссер, Страна. Для этого, что бы зарегистрировать новые таксономии вставил в function.php следующий код :
<?php
add_action( 'init', 'create_pc_db_taxonomies', 0 );
function create_pc_db_taxonomies() {
register_taxonomy( 'director', 'post', array( 'hierarchical' => false, 'label' => __('Режиссер', 'series'), 'query_var' =>
'director', 'rewrite' => array( 'slug' => 'directors' ) ) );
register_taxonomy( 'year', 'post', array( 'hierarchical' => false, 'label' => __('Год', 'series'), 'query_var' => 'year',
'rewrite' => array( 'slug' => 'years' ) ) );
register_taxonomy( 'country', 'post', array( 'hierarchical' => false, 'label' => __('Страна', 'series'), 'query_var' =>
'producer', 'rewrite' => array( 'slug' => 'countrys' ) ) );
remove_filter ('pre_term_description', 'wp_filter_kses');
}
?>
Все в порядке, таксономии появились в админке и их можно спокойно заполнять при написании поста. Но их еще ведь надо вывести. Причем отдельно от остального контента. Что делать? Я пошел следующим путем. Создал категорию "Каталог фильмов". Исключил категорию из вывода на главной странице кодом в index.php
if ( have_posts() ) : query_posts($query_string .'&cat=-21'); while ( have_posts() ) : the_post();
?>
где "-21" – это ID рубрики, которую надо было исключить.
Все в порядке, посты рубрики выводятся только на странице своей рубрики. Но как сделать так, что бы пользовательские поля выводились в виде ссылок в сообщениях, а так же организовать удобную навигацию по ним для пользователя? Я решил использовать для навигации функции сайдбара. Для этого создал отдельный сайдбар, где вывел в виде облака меток только созданные кастономии. Для этого я создал новый файл sidebar-cat.php, куда скопировал полностью код из оригинального файла sidebar.php. Вот что получилось:
<div class="SR">
<?php if ( !function_exists('dynamic_sidebar')
|| !dynamic_sidebar(3) ) : ?>
<!-- Start SideBar2 -->
<div class="SRR">
<!-- Start Найти -->
<div class="Найти">
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<input type="text" name="s" class="keyword" />
<div class="bt">
<input name="submit" type="submit" class="search" title="Найти" alt="Найти" value="Найти" />
</div>
</form>
<div class="clr"></div>
</div>
<!-- End Найти -->
<!-- Start Рубрики -->
<div>
<h2>Рубрики</h2>
<ul>
<?php wp_list_cats('show_count=1'); ?>
</ul>
</div>
<!-- End Рубрики -->
<!-- Start Архивы -->
<div>
<h2>Архивы</h2>
<ul>
<?php wp_get_archives('type=monthly'); ?>
</ul>
</div>
<!-- End Архивы -->
<!-- Start Ссылки -->
<div>
<h2>Ссылки</h2>
<ul>
</ul>
</div>
<!-- End Ссылки -->
<!-- Start Meta -->
<div>
<h2>Meta</h2>
<ul>
<?php wp_register(); ?>
<li>
<?php wp_loginout(); ?>
</li>
<?php wp_meta(); ?>
</ul>
</div>
<!-- End Meta -->
<!-- Start Flickr Photostream -->
<div class="widget_flickrrss">
<h2 class="TabLink">Flickr PhotoStream</h2>
<?php if (function_exists('get_flickrRSS')) { ?>
<ul>
<?php get_flickrRSS(8, "community", "london,people", "square", "<li>", "</li>", "34427469792@N01"); ?>
</ul>
<?php } ?>
</div>
<div class="clr"></div>
<!-- End Flickr Photostream -->
</div>
<!-- End SideBar2 -->
<?php endif; ?>
</div>
Где цифра 3 в коде
dynamic_sidebar(2)
Это новый сайдбар, а в function.php я зарегистрировал этот сайдбар с помощью изменения кода
<?php
if ( function_exists('register_sidebar') )
register_sidebars(2, array(
'before_widget' => '<div id="%1$s" class="widget %2$s">',
'after_widget' => '</div>',
'before_title' => '<h2 class="widgettitle">',
'after_title' => '</h2>',
));
(У меня было два сайдбара) на
<?php
if ( function_exists('register_sidebar') )
register_sidebars(3, array(
'before_widget' => '<div id="%1$s" class="widget %2$s">',
'after_widget' => '</div>',
'before_title' => '<h2 class="widgettitle">',
'after_title' => '</h2>',
));
Все в порядке, сайдбар появился в админке. Теперь его надо вывести именно в той рубрике, где мне и надо было. Для этого я прописал в файле category.php такой код вместо стандартного
<?php get_sidebar(); ?>
<?php
if ( is_category('21') ) :
get_sidebar ('cat');
else:
get_sidebar () ;
endif;
?>
Где "21" это ID категории в которой нужно вывести новый сайдбар.
По правилам моего сайдбара, он становиться динамическим при размещении в нем любого виджета, при этом статические функции прописанные в нем изчезают, а виджеты работают. Поэтому я просто "Перетащил" три виджета "Облако меток" в новый сайдбар и назначил каждому (эта функция есть только в последних версиях WordPress) отображение одной из созданных таксономий:
В итоге в этой рубрике стал появляться только созданный мной новый сайдбар. Но навигация терялась при просмотре нужного сообщения. Значит нужно задать нужному сообщению тот же сайдбар, что и для всей рубрики. Это я решил с помощью плагина http://wordpress.org/extend/plugins/single-post-template/. Что бы он заработал, нужно создать новый файл с названием single-cat.php (cat- это у меня, у вас может быть другое имя), куда копируем код из single.php + в самом начале прописываем:
<?php
/*
Single Post Template: Single Cat
Description: This part is optional, but helpful for describing the Post Template
*/
?>
Теперь, при написании поля у нас есть возможность выбрать именно этот шаблон для сооющения, а что бы в нем отображался нужный нам сайдбар просто прописываем в single-cat.php вместо стандартного
<?php get_sidebar(); ?>
следующее:
<?php include(TEMPLATEPATH."/sidebar-cat.php"); ?>
Для того, что бы наша таксономия отображалась в нужном нам месте сообщения используем следующий код (я вывел таксономию там, где у меня прописана категория поста, под заголовком):
<?php echo get_the_term_list( $post->ID, 'director', 'Режиссер: ', ', ', '' ); ?>
<?php echo get_the_term_list( $post->ID, 'year', 'Год: ', ', ', '' ); ?>
<?php echo get_the_term_list( $post->ID, 'country', 'Страна: ', ', ', '' ); ?>
Этот код прописываем в category.php, single-cat.php, tag.php (этого файла у меня не было, мне пришлось его создать) и arhive.php.
Все отображается, но… теги пользовательской таксономии не работали. Эту проблему я решил достаточно неожиданно – решил обновить wordpress до версии 3.2.1 и все вроде заработало. (Если кто знает чего не хватало, поделитесь) Почти. Остались нерешенными несколько вопросов и если кто знает как их решить, напишите, что бы закончить эту тему.
1. Почему то не хочет работать таксономия "Год", хотя остальные – без проблем
2. Остался нерешенным вопрос (в интернете не нашел по этому поводу инфы) про отображение нового сайдбара, созданного для каталога, при просмотре архива тега (когда жмешь на тег созданной таксономии выводится обычный набор сайдбаров)
3. Хотелось бы выводить при просмотре категории и архива пользовательской таксономии не просто ссылку на пост с описанием, но в виде обычной главной страницы с сообщениями. Согласитесь, так намного приятнее.
Предлагаю решить эту проблему вместе, ибо очень полезная функция – каталог для WordPress. То, что получилось, можно посмотреть здесь http://kabushikigaisha.ru/category/catalogue_of_horror_movie/