В данной статье 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( '←', 'Previous post link', 'twentyten' ) . ' %title','true','','true' ); ?> <?php next_post_link( '%link', '%title ' . _x( '→', '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/