Created
April 4, 2019 17:19
-
-
Save RiodeJaneiroo/2d96afe0234ec8696361e29c76a51c56 to your computer and use it in GitHub Desktop.
[Wordpress ЧПУ URL] делает чпу без слагов #wordpress #redirect #cpt
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 | |
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