Skip to content

Instantly share code, notes, and snippets.

@RiodeJaneiroo
Created April 4, 2019 17:19
Show Gist options
  • Save RiodeJaneiroo/2d96afe0234ec8696361e29c76a51c56 to your computer and use it in GitHub Desktop.
Save RiodeJaneiroo/2d96afe0234ec8696361e29c76a51c56 to your computer and use it in GitHub Desktop.
[Wordpress ЧПУ URL] делает чпу без слагов #wordpress #redirect #cpt
<?php
add_filter('request', 'rudr_change_term_request', 1, 1 );
function rudr_change_term_request($query){
$tax_name = 'kapers'; // specify you taxonomy name here, it can be also 'category' or 'post_tag'
// Request for child terms differs, we should make an additional check
if( isset($query['attachment']) && $query['attachment']) :
$include_children = true;
$name = $query['attachment'];
else:
$include_children = false;
if(isset($query['name'])) {
$name = $query['name'];
}
endif;
if(isset($name)){
$term = get_term_by('slug', $name, $tax_name); // get the current term to make sure it exists
}
if (isset($name) && $term && !is_wp_error($term)): // check it here
if( $include_children ) {
unset($query['attachment']);
$parent = $term->parent;
while( $parent ) {
$parent_term = get_term( $parent, $tax_name);
$name = $parent_term->slug . '/' . $name;
$parent = $parent_term->parent;
}
} else {
unset($query['name']);
}
switch( $tax_name ):
case 'category':{
$query['category_name'] = $name; // for categories
break;
}
case 'post_tag':{
$query['tag'] = $name; // for post tags
break;
}
default:{
$query[$tax_name] = $name; // for another taxonomies
break;
}
endswitch;
endif;
return $query;
}
// for cpt
add_filter( 'term_link', 'rudr_term_permalink', 10, 3 );
function rudr_term_permalink( $url, $term, $taxonomy ){
$taxonomy_name = 'kapers'; // your taxonomy name here
$taxonomy_slug = 'kapers'; // the taxonomy slug can be different with the taxonomy name (like 'post_tag' and 'tag' )
// exit the function if taxonomy slug is not in URL
if ( strpos($url, $taxonomy_slug) === FALSE || $taxonomy != $taxonomy_name ) return $url;
$url = str_replace('/' . $taxonomy_slug, '', $url);
return $url;
}
add_action('template_redirect', 'rudr_old_term_redirect');
function rudr_old_term_redirect() {
$taxonomy_name = 'kapers';
$taxonomy_slug = 'kapers';
// exit the redirect function if taxonomy slug is not in URL
if( strpos( $_SERVER['REQUEST_URI'], $taxonomy_slug ) === FALSE)
return;
if( ( is_category() && $taxonomy_name=='category' ) || ( is_tag() && $taxonomy_name=='post_tag' ) || is_tax( $taxonomy_name ) ) :
wp_redirect( site_url( str_replace($taxonomy_slug, '', $_SERVER['REQUEST_URI']) ), 301 );
exit();
endif;
}
add_filter('post_link', 'true_post_type_permalink', 20, 3);
add_filter('post_type_link', 'true_post_type_permalink', 20, 3);
function true_post_type_permalink( $permalink, $post_id, $leavename ) {
$post_type_name = 'kaper'; // название типа записи, вы можете найти его в админке или в функции register_post_type()
$post_type_slug = 'kaper'; // часть URL товаров, не всегда совпадает с названием типа записи!
$tax_name = 'kapers'; // ну это понятно, название таксономии - категории товаров
$post = get_post( $post_id ); // получаем объект поста по его ID
if ( strpos( $permalink, $post_type_slug ) === FALSE || $post->post_type != $post_type_name ) // не делаем никаких изменений, если тип записи не соответствует или если URL не содержит ярлык tovar
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, $termini[0]->slug, $permalink );
return $permalink;
}
add_filter('request', 'true_post_type_request', 1, 1 );
function true_post_type_request( $query ){
global $wpdb; // нам немного придётся поработать с БД
$post_type_name = 'kaper'; // указываем тут название типа записей товара
$tax_name = 'kapers'; // а также название таксономии - категории товаров
$yarlik = isset($query['attachment']) ? $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; // возвращаем результат
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment