Каталог для 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 добавляем код :

/*
replacement function for the_thumb, as found in the post-thumb plugin
searches a pots for images, gets the image id, then retrives info about it, displays the thumb
 
args:
$size, should be "thumbnail" or "medium"
*/
function cim_the_thumb($size="thumbnail"){
    global $post;
    preg_match('/<img(.*?)src=["'."']".'(.*?)["'."']".'(.*?)\/\>/i', $post->post_content, $matches);  //get all the images
 
    if (!$matches)  //if no images
        return null;
 
    ereg('wp-image-([0-9]+)',$matches[0],$regs);  //find the string "wp-image-nnn" in the image, where nnn is the image id
 
    if (!$regs){
        echo "<!-- there was an error getting an image for this post -->\n";
        return null;
    }
 
    if (is_numeric($regs[1])){  //check to make sure the ID we got is numeric (it should be!)
 
        //add classes specifically for the CIM sites
        if ($size =="medium"){
            $imgClass="img-holder";
        } elseif ($size == "thumbnail"){
            $imgClass = "smallthumb";
        }
        $image = wp_get_attachment_image_src($regs[1], $size, false);  //get image sizes
        if ( $image ) {
            list($src, $width, $height) = $image;
            echo '<a href="'.get_permalink($post->ID).'" title="'.get_the_title($post->ID).'">';
            echo '<img src="'.attribute_escape($src).'" class="'.$imgClass.' attachment-'.attribute_escape($size).'" alt="'.get_the_title($post->ID).'" />';
            echo "</a>\n";
        }
    } else {
        echo "<!-- there was an error getting an image for this post -->\n";
        return null;
    }
}

Там где надо вывести картинку (у меня это archive.php и category.php) вставляем следующий код:

<?php if ( function_exists( 'cim_the_thumb' ) ) { cim_the_thumb('thumbnail'); } ?>

Работает на wordpress 3.2.1, в остальных не проверял

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