Рубрика: WordPress » Навигация »

Как связать постоянные страницы с записями блога

"Похожие статьи" вместо "Похожих записей"

Как средство перелинковки сайта и дополнительной навигации по сайту, помогающее посетителям находить информацию на смежные или связанные темы, в блогах на WordPress часто используется плагин или встроенная функциональность темы для вывода ссылок на "Related Posts", т.е. "Похожие записи". Это могут быть записи, имеющие такие же метки (или одну из меток), как и текущая запись. Если записей в блоге достаточно много, количество выводимых ссылок ограничивают, например, до пяти.
Если постоянные страницы - это немногочисленные страницы с информацией, не имеющей прямой связи с записями, такие как "О блоге", "Об авторе", "Контакты", вывода ссылок на "Похожие записи" в конце каждой записи достаточно.
Но в этом и в другом моем блоге "Study English Now" постоянные страницы используются как страницы Справочника с обзорными и конспективными статьями, материалы которых могут подробно рассматриваться в записях блога, поэтому нужно связать все "похожие статьи", т.е. и постоянные страницы и записи, а не только "похожие записи".
Постоянные страницы (ПС) pages и записи блога posts имеют отличающиеся наборы свойств, хотя, имеют и общие, например, произвольные поля (custom fields). Связать ПС и записи можно через произвольное поле или поля, но можно обойтись и без них.
Для вывода ссылок на "Похожие записи" используются метки, но у ПС меток нет. У ПС (как и у записей) есть название (title) и ярлык (slug, часть постоянной ссылки после последнего слэша). Можно добавлять для записей метку, совпадающую с ярлыком или с названием ПС. Названия статей, конечно, могут быть достаточно длинными, поэтому лучше использовать ярлык (slug) как эквивалент метки постоянной страницы для связи с записями с совпадающей меткой (названия меток на английском языке, как и URL, т.е. постоянные ссылки). Конечно, это имеет смысл, когда на сайте используются понятные человеку ссылки.Таким образом можно в конце статей Справочника выводить ссылки на записи с метками, которые имеют такое же значение, что и ярлык текущей (постоянной) страницы.

Список записей на странице справочника: метка=ярлык страницы

На страницы Справочника, имеющие дочерние страницы, добавляем список дочерних страниц и список "похожих" записей:

<ul>
<?php
 global $post;
 $args = array( 'numberposts' => -1, 'tag'=> basename($_SERVER['REQUEST_URI']), 'order' => 'ASC');
 $myposts = get_posts( $args );
 if ($myposts){
   echo '<h4>Дополнительно: записи блога:</h4>';
   foreach( $myposts as $post ) : setup_postdata($post); ?>
 	   <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
	<?php endforeach; }?>
</ul>

Здесь
'numberposts' => -1 // вывод всех записей
basename($_SERVER['REQUEST_URI']) // ярлык страницы
'order' => 'ASC' // вывод в порядке возрастания (по умолчанию по дате)
get_posts // новый запрос с заданными аргументами

У этого способа есть свои недостатки. Например, используемые при таком подходе метки на английском языке, возможно, придется исключать из облака меток. Более универсальным является использование произвольного поля. И здесь возможны варианты.

Имя рубрики в произвольном поле

Поучительный пример из Кодекса (для дефолтной темы WordPress "Kubrick"): A Page of Posts - шаблон страницы pageofposts.php с именем PageofPosts, в котором извлекается значение произвольного поля "category" и используется как имя рубрики, записи из которой нужно вывести. Список полученных записей разбивается на страницы, на каждой из которых выводится не более 4 записей и добавляются ссылки на предыдущие и последующие записи:

<?php
  /*
  Template Name: PageOfPosts
*/

get_header(); ?>
<div id="content" class="narrowcolumn">
<?php
  if (is_page() ) {
  $category = get_post_meta($posts[0]->ID, 'category', true);
  }
  if ($category) {
  $cat = get_cat_ID($category);
  $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
  $post_per_page = 4; // -1 shows all posts
  $do_not_show_stickies = 1; // 0 to show stickies
  $args=array(
   'category__in' => array($cat),
   'orderby' => 'date',
   'order' => 'DESC',
   'paged' => $paged,
   'posts_per_page' => $post_per_page,
   'caller_get_posts' => $do_not_show_stickies
  );

  $temp = $wp_query;  // сохранение исходного запроса для последующего использования
  $wp_query = null;
  $wp_query = new WP_Query($args);
  if( have_posts() ) :
   while ($wp_query->have_posts()) : $wp_query->the_post(); ?>
   <div <?php post_class() ?> id="post-<?php the_ID(); ?>">
    <h2><a href="<?php the_permalink() ?>" rel="bookmark"
         title="Постоянная ссылка на <?php the_title_attribute(); ?>"><?php the_title(); ?></a></h2>

  <small><?php the_time('jS F Y') ?> <!-- автор: <?php the_author() ?> --></small>
  <div class="entry">
  <?php the_content('Читать »'); ?>
  </div>
<p class="postmetadata"><?php the_tags('Tags: ', ', ', '<br />'); ?> Рубрика
     <?php the_category(', ') ?> | <?php edit_post_link('Edit', '', ' | '); ?>
     <?php comments_popup_link('Без комментариев »', '1 комментарий »', 'Комментариев: % »'); ?></p>

  </div>
  <?php endwhile; ?>

  <div class="navigation">
   <div class="alignleft"><?php next_posts_link('« Следующие записи') ?></div>
   <div class="alignright"><?php previous_posts_link('Предыдущие записи »') ?></div>
  </div>

  <?php else : ?>
   <h2 class="center">Записей нет</h2>
  <p class="center">Вы ищите то, чего здесь нет.</p>
  <?php get_search_form(); ?>
<?php endif;

  $wp_query = $temp;  //результаты исходного запроса

  }  // if ($category)
 ?>
</div>
<?php get_sidebar(); ?>
<?php get_footer(); ?>

Серия статей

При публикации серии статей (записей и/или постоянных страниц) имеет смысл помещать в конце каждой статьи список остальных статей серии. Пометить статью как принадлежащую серии можно с помощью постоянного поля.
Итак, добавляем произвольное поле с ключом Series и для всех статей серии добавляем для него значение - название данной серии. Всю работу выполняет эта функция, которую можно добавить в файл (дочерней) темы (см. Дочерние темы) или использовать в плагине:

<?php
 function article_series() {
  global $post;
  $series = get_post_meta($post->ID, 'Series', true);
  if($series) :
    $args = array(
      'numberposts' => -1,
      'meta_key' => 'Series',  // ключ
      'meta_value' => $series, // значение
    );
    $series_posts = get_posts($args);
    if($series_posts) :
     $class = preg_replace("/[^a-z0-940.-_]/i", "", $series);
     $class = strtolower(str_replace(array(' ', '&nbsp;'), '-', $class));
     echo '<div class="series series-' . $class . '"><h4 class="series-title">' .
            __('Статьи в этой серии') . '</h4><ul>';
     foreach($series_posts as $serial) :
      if($serial->ID == $post->ID)
       echo '<li class="current-post">' . $serial->post_title . '</li>';
      else
       echo '<li><a href="' . get_permalink($serial->ID) . '" title="' .
             str_replace('"', '"', $serial->post_title) . '">' .
             str_replace('"', '"', $serial->post_title) . '</a></li>';
     endforeach;
    echo '</ul></div>';
   endif;
  endif;
}
?>

Использование функции (в файле темы single.php и/или page.hph)

<?php article_series(); ?>

Источник: WordPress Custom Fields: Listing A Series Of Posts

Опубликовано в рубрике Навигация | с метками , , , , , . |

Еще записи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *