Skip to content

Instantly share code, notes, and snippets.

@amorkovin
Last active June 5, 2020 14:04
Show Gist options
  • Save amorkovin/c369305f1268293948e668bf50ffb253 to your computer and use it in GitHub Desktop.
Save amorkovin/c369305f1268293948e668bf50ffb253 to your computer and use it in GitHub Desktop.
Настройка произвольного типа записи в WordPress с редиректами в случае изменения url и с присутствием в url части от термина таксономии
<?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