Руслан

Каталог для WordPress. Финишная прямая

Я тут, наверное, уже всех замучил. Но, думаю не зря. Вот вышел на финишную прямую и осталось только несколько шагов до полной реализации задуманного. Решил я сделать на базе 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/

Отдельный сайдбар для рубрики

Здравствуйте, хочу сделать для одной из рубрик отдельный сайдбр. Нашел в интернете один вариант и сделал следующее.
Имею код в 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>',
    ));

И код в sidebar.php

<div class="SR">

<?php if ( !function_exists('dynamic_sidebar')
|| !dynamic_sidebar() ) : ?>

  <!-- 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>

<div class="SR">

<?php if ( !function_exists('dynamic_sidebar')
|| !dynamic_sidebar(2) ) : ?>

  <!-- 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>

Пытался сделать так. Написал в function.php в регистрации сайдбара "3" вместо "2", добавил еще одну строчку с кодом сайдбара в sidebar.php. При этом третий сайдбар без проблем появился. После этого в arhive.php прописал следующий код:

if ( is_category('10') ) {
include  'get_sidebar(3)';
}  else {
include  'get_sidebar()'; 
} ?>

Не вышло, по прежнему отображается все 3 сайдбара.
Потом создал файл с отдельным сайдбаром и прописал такой код:

    <?php
if ( is_category('10') ) {
include  'sidebar_cat.php';
}  else {
include  'sidebar.php' ;
} ?>

Тоже не работает.
Может быть, кто подскажет, почему?

Magic Fields 2

Нашел вот такой замечательный плагин для создания произвольный полей и создания пользовательской таксономии. В этом плагине есть замечательная функция создания нового типа записей Add New Post Types. Для нового типа записей создаются свои теги, рубрики и прочие настройки. Сразу после создания в меню в админке появляется новая панель по типу панели записи (Все, Добавить новую, метки, рубрики и т. д.). И все бы замечательно… Но. Запись добавляется, добавляется рубрика со ссылкой, запись можно посмотреть по своей ссылке. Выводятся даже теги в сайдбаре. При просмотре записей их можно листать (следующая, предыдущая). Но вот статьи рубрики все вместе, как при просмотре других рубрик не выводятся даже по ссылке. :mad:Показывает 404 not found. Кто встречался с этим плагином, подскажите, как это исправить?
Вот здесь подробно показан процесс создания, но о каких то дополнительных вещей для вывода этих сообщений нет http://wiki.magicfields.org/doku.php?id=post_types_v20#using_a_post_type
P.S. Кстати, теги, которые выводятся в сайдбаре тоже оказываются неработоспособными.
По первой версии плагина, кстати, есть много информации, но она либо не полная, либо не работает. Но кому то может пригодиться:

Magic Fields. Создание разных типов записей с дополнительными полями


http://inroot.ru/2011-07/funktsionalnyy_katalog_na_wordpress_magic_fields_1.html
http://seogad.ru/cms/magic-fields-wordpress-plugin
По второй версии плагина, где как раз добавлены функции таксономии и создания новых типов записи информации не находил. Хотя странно, ведь очень функциональный плагин, этот Magic Fields 2

Anonymous
Отправить
Ответ на: