Есть функция добавления в 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" не трогал.
В чём может быть проблема?