Добавить вторую таксономию в URL записи?

Есть функция добавления в url записи произвольного типа "my_post_type" термина произвольной таксономии "my_tax". В результате вместо "site.ru/my_post" получаем "site.ru/my_term/my_post".
// перезаписываем ссылки
add_filter('post_link', 'my_post_type_permalink', 20, 3);
add_filter('post_type_link', 'my_post_type_permalink', 20, 3);
function my_post_type_permalink($permalink, $post_id, $leavename) {
	$post_type_name = 'my_post_type'; // название типа записи
	$post_type_slug = 'my_post'; // slug типа записи
	$tax_name = 'my_tax'; // название таксономии
	$post = get_post($post_id); // получаем объект поста по его ID
	if (strpos($permalink, $post_type_slug) === FALSE || $post->post_type != $post_type_name) // не делаем никаких изменений, если тип записи не соответствует или если URL не содержит $post_type_slug
		return $permalink;
        $termini = wp_get_object_terms($post->ID, $tax_name); // получаем все категории, к которым принадлежит данный пост
        if (!is_wp_error($termini) && !empty($termini) && is_object($termini[0])) // и делаем перезапись ссылки, только, если пост находится хотя бы в одной категории, иначе возвращаем ссылку по умолчанию
        	$permalink = str_replace($post_type_slug, _sm_txt_get_the_terms($post->ID, $tax_name, 'slug'), $permalink);
	return $permalink;
}

// перезаписываем основной запрос
add_filter('request', 'my_post_type_request', 1, 1);
function my_post_type_request($query){
	global $wpdb;
	$post_type_name = 'my_post_type'; // название типа записи
	$tax_name = 'my_tax'; // название таксономии
	$yarlik = $query['attachment']; // после того, как мы изменили ссылки товаров в предыдущей функции, WordPress начал принимать их за страницы вложений
	// получим ID поста, ярлык которого соответствует запросу на странице
	$post_id = $wpdb->get_var(
		"
		SELECT ID
		FROM $wpdb->posts
		WHERE post_name = '$yarlik'
		AND post_type = '$post_type_name'
		"
	);
	$termini = wp_get_object_terms($post_id, $tax_name); // пост должен находиться в таксономии (одной или нескольких)
	if (isset($yarlik) && $post_id && !is_wp_error($termini) && !empty($termini)) : // изменяем запрос, если всё ок
		unset($query['attachment']);
		$query[$post_type_name] = $yarlik;
		$query['post_type'] = $post_type_name;
		$query['name'] = $yarlik;
	endif;
	return $query;
}

// ставим 301 редирект со старых ссылок на новые
add_action('template_redirect', 'my_post_type_redirect');
function my_post_type_redirect() {
	$post_type_name = 'my_post_type'; // название типа записи
	$post_type_slug = 'my_post'; // slug типа записи
	$tax_name = 'my_tax'; // название таксономии
	if (strpos( $_SERVER['REQUEST_URI'], $post_type_slug) === FALSE) // выходим из функции ничего не делая, если URL не содержит $post_type_slug
		return;
	if (is_singular($post_type_name)) : // функцию выполняем только на страницах постов данного типа
		global $post, $wp_rewrite;
		$termini = wp_get_object_terms($post->ID, $tax_name); // опять проверяем пост на наличие таксономий
		if (!is_wp_error($termini) && !empty($termini) && is_object($termini[0])) :
			wp_redirect(site_url() . '/' . $wp_rewrite->front . '/' . _sm_txt_get_the_terms($post->ID, $tax_name, 'slug') . $post->post_name, 301);
			exit();
        endif;
	endif;
}

Чтобы не возникало вопросов, пользовательская функция "_my_txt_get_the_terms" выводит slug выбранной таксономии, к которой принадлежит запись.

С одной таксономией всё работает. Необходимо добавить в url вторую таксономию "my_tax2", чтобы получилось "site.ru/my_term/my_term2/my_post"
При изменении функций "my_post_type_permalink" и "my_post_type_redirect" ссылки перезаписываются, но страница выдаёт 404. Функцию "my_post_type_request" не трогал.

В чём может быть проблема?
  • Вопрос задан
  • 2518 просмотров
Решения вопроса 1
dimasmagadan
@dimasmagadan
Проблема в том, что вы пытаетесь вырезать аппендицит через нос. Немного не так это предполагается в WordPress делать.

Посмотрите тут?
shibashake.com/wordpress-theme/custom-post-type-pe...
Статья в двух частях, как раз разбирают ваш случай
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы