Ограничение стандартной навигации по записям

Дата публикации:Июнь 10, 2012

В данной статье David Powell расскажет вам, как ограничить стандартную навигацию по записям. Допустим, вы изучаете запись определенного автора из выбранной рубрики. Навигация, которая обычно размещается под рассматриваемой записью, включает в себя два перехода: назад, к более ранней записи, и вперед, к более свежей. Однако неудобство заключается в том, что более свежая запись может находиться в совершенно другой рубрике, то есть нарушается логика повествования. Как с этим справиться? В данной статье мы рассмотрим метод, который позволяет удерживать навигацию в рамках одной рубрики и одного автора. Примечание: метод основан на модификации базовых WordPress файлов, так что использовать его надо очень осторожно.

Функции next_post_link и previous_post_link, отвечающие за навигацию, позволяют сохранять ссылки для одной и той же рубрики. Однако для авторов они этого не делают. Чтобы решить проблему, придется отредактировать файл link-template.php.

Для того чтобы ограничить навигацию по записям, поместите файл link-template.php в папку /wp-includes/ и отредактируйте с помощью любого текстового редактора. В этом файле требуется поменять четыре функции. Найдите в нем следующие строки:

function previous_post_link($format='« %link', $link='%title', $in_same_cat = false, $excluded_categories = '') {
	adjacent_post_link($format, $link, $in_same_cat, $excluded_categories, true);
}

Измените на следующее:

function previous_post_link($format='« %link', $link='%title', $in_same_cat = false, $excluded_categories = '', $is_author = false) {
	adjacent_post_link($format, $link, $in_same_cat, $excluded_categories, true, $is_author);
}

Также под предыдущими строками вы найдете:

function next_post_link($format='%link »', $link='%title', $in_same_cat = false, $excluded_categories = '') {
	adjacent_post_link($format, $link, $in_same_cat, $excluded_categories, false);
}

Замените на:

function next_post_link($format='%link »', $link='%title', $in_same_cat = false, $excluded_categories = '',$is_author = false) {
	adjacent_post_link($format, $link, $in_same_cat, $excluded_categories, false, $is_author);
}

Мы провели небольшие изменения. Все, что мы сделали, это добавили $is_author = false к параметрам функции и $is_author в вызов функции.

В следующей функции мы добавим другой параметр и подкорректируем запрос SELECT, получающий предыдущую и последующую запись. Найдите следующую строку:

function get_adjacent_post($in_same_cat = false, $excluded_categories = '', $previous = true) {
	...
	}

Этот фрагмент довольно объемный, поэтому я рассмотрю только часть его, которая подвергнется изменениям. В первой строке мы добавим тот же самый параметр, что и раньше($is_author = false):

function get_adjacent_post($in_same_cat = false, $excluded_categories = '', $previous = true, $is_author = false) {
	...
	}

Затем в этой же самой функции найдем переменную $where (примерно вниз на 50 строк):

$where = apply_filters( "get_{$adjacent}_post_where", $wpdb->prepare("WHERE p.post_date $op %s AND p.post_type = %s AND p.post_status = 'publish' $posts_in_ex_cats_sql", $current_post_date, $post->post_type), $in_same_cat, $excluded_categories );

Нам требуется изменить ее, чтобы она сохраняла автора только тогда, когда $is_author = true. Добавим небольшое окончание для переменной where:

$where = apply_filters( "get_{$adjacent}_post_where", $wpdb->prepare("WHERE p.post_date $op %s AND p.post_type = %s AND p.post_status = 'publish' $posts_in_ex_cats_sql", $current_post_date, $post->post_type), $in_same_cat, $excluded_categories );
	if($is_author)
		$where .= " AND p.post_author='".$post->post_author."'";

Наконец, финальным аккордом будет добавление в файл link-template.php изменений к следующей функции:

function adjacent_post_link($format, $link, $in_same_cat = false, $excluded_categories = '', $previous = true) {
	if ( $previous && is_attachment() )
		$post = & get_post($GLOBALS['post']->post_parent);
	else
		$post = get_adjacent_post($in_same_cat, $excluded_categories, $previous);

Поместим $is_author в adjacent_post_link и добавим вызов get_adjacent_post:

function adjacent_post_link($format, $link, $in_same_cat = false, $excluded_categories = '', $previous = true, $is_author = false) {
	if ( $previous && is_attachment() )
		$post = & get_post($GLOBALS['post']->post_parent);
	else
		$post = get_adjacent_post($in_same_cat, $excluded_categories, $previous, $is_author);

Теперь вы можете использовать эту новую опцию в файлах темы. Для ее «активации» добавьте в файл single.php что-нибудь наподобие следующего:

<?php previous_post_link( '%link', '' . _x( '&larr;', 'Previous post link', 'twentyten' ) . ' %title','true','','true' ); ?>
<?php next_post_link( '%link', '%title ' . _x( '&rarr;', 'Next post link', 'twentyten' ) . '','true','','true' ); ?>

Установка последнего значения в true активирует сохранение автора для данной ссылки. Заметьте, что в предыдущем примере у меня есть $excluded_categories, поскольку я хочу оставаться в пределах той же самой рубрики.

Учтите, что при обновлении версии WP вам придется снова вносить вручную все изменения.
Чтобы провести все в автоматическом режиме, можно воспользоваться плагином http://wordpress.org/extend/plugins/retain-author/

http://digwp.com/2012/05/post-navigation-author-category/

Поделиться

2 комментария

  1. Иван says:

    Спасибо. Как ни странно, с большим трудом нашел этот материал. Кажется — то что нужно. А нет ли способа решить этот вопрос через functions.php темы?

    • Architect Of Ruin says:

      Если Вам необходимо оставаться только в одной рубрике, то можно воспользоваться простыми функциями:

      <?php previous_post_link('%link', 'Next: %title &raquo;' , in_same_cat, 'excluded_categories '); ?>
      <?php next_post_link('%link', '&laquo; Previous: %title', in_same_cat, 'excluded_categories '); ?>

      Если же вывод нужен еще и по автору, то тогда только тем способом, что описан.

      p.s. С большим трудом нашли материал, потому что я не использую SEO.

Оставить комментарий

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

Получать новые комментарии по электронной почте. Вы можете подписаться без комментирования.