Вконтакте
Телефон для заказов: +7 (910) 487 81 94
Подписка на RSS

Изменение структуры ЧПУ в дополнительном типе записей WordPress

Недавно я рассказывал вам о том, как сделать дополнительный тип записей для публикации новостей. После того, как он появился на блоге, я сразу отправил достаточно много заявок оптимизаторам, и теперь мне придётся поплатиться за это низкой скоростью размещения — что ж, будем умнее в будущем.

А радость моя сегодняшняя в том, что один из оптимизаторов дал мне весьма дельный совет — избавиться от повторения «news» в адресах новостей. То есть Яндекс вполне может позволить себе зафильтровать все ссылки по категории.

Честно говоря, это меня весьма озадачило, и весь вечер я потратил на поиски решения. Ещё и коллегу напряг, которому выражаю глубокую благодарность за оказанную помощь.

Алексей Крылышкин, тот самый оптимизатор, посоветовал сделать url «датовыми», но если их делать таковыми — то делать только для всех материалов — и для новостей, и для постов.

Иначе же Яндекс также может зафильтровать новости и по году — для него нет разницы, находятся сотни страниц с продажными ссылками в каталоге «news» или «2010″, он лишь выводы делает и действует, как ему приказали.

В результате мне пришлось настроить отдельную структуру постоянных ссылок (ЧПУ) специально для дополнительного типа записей «Новости».

Я хотел оставить в адресе только название новости, но к сожалению ничего у меня с этим не получилось — перестали работать обычные страницы типа «об авторе».

Для того, чтобы избежать конфликта двух структур ЧПУ, пришлось вставить перед названием id материала, что конечно тоже не очень клёво смотрится, и при желании их тоже можно зафильтровать, например, по количеству цифр — но всё же это менее очевидно чем рубрика, отделённая слешем, так как id по крайней мере уникальны для каждой новости.

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

В ближайшее время я планирую сделать перевод этой статьи, а сегодня я поделюсь с вами кодом, который я добавил в файл functions.php своего шаблона.

function add_permastruct2() {
	global $wp_rewrite;
$gallery_structure = '/%post_id%-%news%';
$wp_rewrite->add_rewrite_tag("%news%", '([^/]+)', "news=");
$wp_rewrite->add_permastruct('news', $gallery_structure, false); 
}

add_action('init', 'add_permastruct2');

// Add filter to plugin init function
add_filter('post_type_link', 'gallery_permalink', 10, 3);	
// Adapted from get_permalink function in wp-includes/link-template.php
function gallery_permalink($permalink, $post_id, $leavename) {
	$post = get_post($post_id);
	$rewritecode = array(
		'%year%',
		'%monthnum%',
		'%day%',
		'%hour%',
		'%minute%',
		'%second%',
		$leavename? '' : '%postname%',
		'%post_id%',
		'%category%',
		'%author%',
		$leavename? '' : '%pagename%',
	);
 
	if ( '' != $permalink && !in_array($post->post_status, array('draft', 'pending', 'auto-draft')) ) {
		$unixtime = strtotime($post->post_date);
 
		$category = '';
		if ( strpos($permalink, '%category%') !== false ) {
			$cats = get_the_category($post->ID);
			if ( $cats ) {
				usort($cats, '_usort_terms_by_ID'); // order by ID
				$category = $cats[0]->slug;
				if ( $parent = $cats[0]->parent )
					$category = get_category_parents($parent, false, '/', true) . $category;
			}
			// show default category in permalinks, without
			// having to assign it explicitly
			if ( empty($category) ) {
				$default_category = get_category( get_option( 'default_category' ) );
				$category = is_wp_error( $default_category ) ? '' : $default_category->slug;
			}
		}
 
		$author = '';
		if ( strpos($permalink, '%author%') !== false ) {
			$authordata = get_userdata($post->post_author);
			$author = $authordata->user_nicename;
		}
 
		$date = explode(" ",date('Y m d H i s', $unixtime));
		$rewritereplace =
		array(
			$date[0],
			$date[1],
			$date[2],
			$date[3],
			$date[4],
			$date[5],
			$post->post_name,
			$post->ID,
			$category,
			$author,
			$post->post_name,
		);
		$permalink = str_replace($rewritecode, $rewritereplace, $permalink);
	} else { // if they're not using the fancy permalink option
	}
	return $permalink;
}

Если честно, я забыл исправить в названиях функций gallery на что-нибудь вроде news, но в принципе сделать это не мешало бы, для сохранения гармонии. Если есть такая возможность — не поленитесь.

Самое основное находится в этих строчках:

$gallery_structure = '/%post_id%-%news%';
$wp_rewrite->add_rewrite_tag("%news%", '([^/]+)', "news=");
$wp_rewrite->add_permastruct('news', $gallery_structure, false);

Структура ЧПУ задаётся в параметре $gallery_structure. Также нужно заменить все «news» на имя вашего дополнительного типа записей.

Кроме того, в функции добавления типа записей (ищите register_post_type) необходимо добавить параметры ‘query_var’ => true и ‘rewrite’ => false. У меня, например, получилось в итоге следующее:

function post_type_news() {
	register_post_type(
                'news',
                array(
                        'label' => __('News'),
                        'public' => true,
                        'show_ui' => true,
						 'publicly_queryable' => true,
						 'query_var' => true,
						 'rewrite' => false,
                        'supports' => array(
											'title',
											'editor',
                                     'excerpts',
                                     'custom-fields',
                                     'revisions',

'comments',
'trackbacks')
                )
        );

	register_taxonomy( 'newscat', 'news', array( 'hierarchical' => true, 'label' => __('Category') ) );
}
add_action('init', 'post_type_news');

Теперь нужно перейти в адмнке на страницу Параметры→Постоянные ссылки и пересохранить настройки ЧПУ. После этого, если вы всё правильно сделали, должны измениться адреса материалов в дополнительном типе записей.

Для наглядности, посмотрите, как они отображаются у меня, в левом сайдбаре.

Вот и вся хитрость. Главное было правильно сформировать запрос в Гугле =)

Надеюсь, у вас не возникнут трудности в применении данного решения. А если возникнут — как всегда жду ваши вопросы в комментариях.

Что вообще думаете о подобной «защите» разделов со ссылками? Эффективно ли или всё равно рано или поздно накроет, если сильно обнаглеть?

Желаю вам всего самого доброго!
Seogad

Понравилась статья?

Создание блога под ключ всего за 999 рублей!

«Изменение структуры ЧПУ в дополнительном типе записей WordPress» — комментарии (5)

  • Спасибо за статью.
    А зачем нужно пересохранять настройки ЧПУ, разве без этого работать не будет?
    В функции gallery_permalink кажется много лишнего, там вообще можно чуть ли не все удалить или я не прав?

  • @Renald, у вас есть все возмоность при использовании кода что-то из него удалить, если считаете нужным =)

  • А не проще делать вид постоянных ссылок в таком формате-%post%- что гораздо лучше для seo оптимизации блога

  • @seokniga, по простоте также, а смысла нет — хуже будет.

  • Пожалуй с вами не соглашусь, сейчас именно такую структуру %postname% ставят многие блогеры, но если конечно часто менять структуру постоянных ссылок, могут выкинуть страницы из индекса и снизить пузомерки

Ваш комментарий

Поля отмеченные * нужно в любом случае заполнить. Пожалуйста, воспринимайте буквально текст «Блог или профиль в соц. сети», не оставляйте ссылки на интернет-магазины, коммерческие сайты и страницы, на которых нельзя познакомиться с вами и вашей деятельностью - такое творчество будет удалено. Это dofollow блог.