Last active
June 5, 2020 14:04
-
-
Save amorkovin/c369305f1268293948e668bf50ffb253 to your computer and use it in GitHub Desktop.
Настройка произвольного типа записи в WordPress с редиректами в случае изменения url и с присутствием в url части от термина таксономии
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
// Решаю проблему отстутствия редиректа и непраивльного canonical от Yoast SEO в случае изменения части URL для произвольного типа записи. | |
// Если произвольный тип записи зарегистрирован следующим обарзом | |
register_taxonomy( 'tournaments', [ 'fight' ], [ | |
'label' => '', | |
'labels' => [ | |
'name' => 'Турниры', | |
'singular_name' => 'Турнир', | |
'search_items' => 'Поиск', | |
'all_items' => 'Все турниры', | |
'view_item ' => 'Посмотреть', | |
'parent_item' => 'Родительский турнир', | |
'parent_item_colon' => 'Родитель:', | |
'edit_item' => 'Редактировать турнир', | |
'update_item' => 'Обновить турнир', | |
'add_new_item' => 'Добавить турнир', | |
'new_item_name' => 'Название турнира', | |
'menu_name' => 'Турниры', | |
], | |
'rewrite' => array( 'slug' => 'fights' ), | |
] ); | |
register_post_type( 'fight', array( | |
'label' => null, | |
'labels' => array( | |
'name' => 'Бои', // основное название для типа записи | |
'singular_name' => 'Бой', // название для одной записи этого типа | |
'add_new' => 'Добавить бой', // для добавления новой записи | |
'add_new_item' => 'Добавление боя', // заголовка у вновь создаваемой записи в админ-панели. | |
'edit_item' => 'Редактирование боя', // для редактирования типа записи | |
'new_item' => 'Новый бой', // текст новой записи | |
'view_item' => 'Смотреть бой', // для просмотра записи этого типа. | |
'search_items' => 'Искать бой', // для поиска по этим типам записи | |
'not_found' => 'Не найдено', // если в результате поиска ничего не было найдено | |
'not_found_in_trash' => 'Не найдено в корзине', // если не было найдено в корзине | |
'parent_item_colon' => '', // для родителей (у древовидных типов) | |
'menu_name' => 'Бои', // название меню | |
), | |
'description' => '', | |
'public' => true, | |
'rewrite' => array( 'slug' => 'fights/%tournaments%', 'with_front' => false ), | |
'has_archive' => 'fights', | |
'capability_type' => 'post', | |
'taxonomies' => [ 'tournaments' ], | |
'supports' => [ 'title', 'custom-fields', 'thumbnail', 'editor', 'comments' ], | |
// 'title','editor','author','thumbnail','excerpt','trackbacks','custom-fields','comments','revisions','page-attributes','post-formats' | |
) ); | |
// И я хочу, чтобы термин таксономии tournaments присутствовал в url публикации | |
add_filter( 'post_type_link', 'man_build_custom_permalink', 1, 2 ); | |
function man_build_custom_permalink( $permalink, $post ) { | |
if ( strpos( $permalink, '%tournaments%' ) === false ) { | |
return $permalink; | |
} | |
if ( strpos( $permalink, '%tournaments%' ) !== false ) { | |
$terms = get_the_terms( $post, 'tournaments' ); | |
if ( ! is_wp_error( $terms ) && ! empty( $terms ) && is_object( $terms[0] ) ) { | |
$taxonomy_slug = $terms[0]->slug; | |
} else { | |
$taxonomy_slug = 'general-tournament'; | |
} | |
return str_replace( '%tournaments%', $taxonomy_slug, $permalink ); | |
} | |
} | |
// Может возникнуть проблема, когда статья была опубликована в одном термине таксономии tournaments, а потом перенесена в другой. | |
//Yoast SEO почему-то продолжает выводить в качестве canonical url со старым значением термина таксономии. Фиксится это сделующим обарзом. | |
// Изменяю canonical плагина Yoast SEO для дополнительных типов записей | |
add_filter( 'wpseo_canonical', 'man_change_canonical_yoast_seo' ); | |
function man_change_canonical_yoast_seo($url) { | |
if( get_post_type() == 'fight' ) { | |
$url = get_permalink(); | |
} | |
return $url; | |
} | |
// И было бы хорошей идеей отдать по неподходящему url либо 404 либо 301 с редиректом на новый url. Ниже вариант 301 редиректа. | |
// Редирект для лишних url произвольных типов записей | |
add_action( 'template_redirect', 'man_redirect301_additional_post_type_to_wrong_url' ); | |
function man_redirect301_additional_post_type_to_wrong_url() { | |
$post_type = get_query_var('post_type'); | |
if ( is_single() && $post_type == 'fighter' ) { | |
$permalink = get_permalink(); | |
$actual_link = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; | |
if ( $permalink != $actual_link ) { | |
wp_redirect( $permalink, 301 ); | |
exit; | |
} | |
} | |
} | |
// И нужно отключить json ld от Yoast SEO, т.к. в нем также фигурирует старое значение темина таксомноии в url | |
add_filter( 'wpseo_json_ld_output', '__return_false' ); | |
// В принципе можно попробовать поменять именно неправильное значение url в json ld. По этому поводу можно почитать про разные фильтры от YoastSEO: https://developer.yoast.com/features/schema/api/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment