Я хотел бы удалить категорию и базу тегов из wordpress URL. Я столкнулся с другими сообщениями и решениями, которые использовали плагины. Я хотел бы держаться подальше от плагинов и иметь решение изнутри functions.php. Это предотвратит изменение любых будущих обновлений плагинов или файлов Wordpress по умолчанию.
Любая помощь будет оценена по достоинству. Спасибо!
Я уже пробовал эти решения:
Мне понравилось это решение:
Если вы хотите удалить /category/
из URL-адреса, выполните следующие два действия:
/%category%/%postname%/
.
Сохраните его, и вы увидите, что ваш URL-адрес изменен на этот формат: HTTP:/yourblog.com/quotes/
(Источник: http://premium.wpmudev.org/blog/daily-tip-quick-trick-to-remove-category-from-wordpress-url/)
Установить категорию базы:. (точка не /)
Сохранить. 100% работают правильно.
Пока вы отклоняете его как решение, плагин является самым простым и наиболее последовательным методом, и они не изменяют файлы Wordpress по умолчанию.
http://wordpress.org/plugins/wp-no-category-base/
Его не нужно обновлять в течение года, поэтому он не создает никаких проблем с обновлениями.
Существует не просто ручное решение, которое будет делать все это, что не просто реплицирует то, что делает плагин из ваших собственных функций. php
Плюс вы получите преимущество, которое, если Wordpress изменится, тогда плагин будет обновлен, чтобы работать, пока вам нужно будет выяснить, как самостоятельно исправить свой собственный код.
Если вы используете плагин Yoast SEO
, просто перейдите к:
Advanced > Permalinks > Change URLs
И выберите remove
из Strip the category base (usually /category/) from the category URL
.
Что касается удаления тега, я еще не нашел решения.
вместо этого поместите это в свои функции. php отлично работает, не имеет проблем с перенаправлением.
function fix_slash( $string, $type )
{
global $wp_rewrite;
if ( $wp_rewrite->use_trailing_slashes == false )
{
if ( $type != 'single' && $type != 'category' )
return trailingslashit( $string );
if ( $type == 'single' && ( strpos( $string, '.html/' ) !== false ) )
return trailingslashit( $string );
if ( $type == 'category' && ( strpos( $string, 'category' ) !== false ) )
{
$aa_g = str_replace( "/category/", "/", $string );
return trailingslashit( $aa_g );
}
if ( $type == 'category' )
return trailingslashit( $string );
}
return $string;
}
add_filter( 'user_trailingslashit', 'fix_slash', 55, 2 );
www.site.com/main-category/sub-category/
. Вернул страницу ошибки 404
Точечный трюк, скорее всего, испортит ваши rss-каналы и/или разбивку на страницы. Однако эти работы:
// remove category base
add_filter('category_rewrite_rules', 'no_category_base_rewrite_rules');
function no_category_base_rewrite_rules($category_rewrite) {
$category_rewrite=array();
$categories=get_categories(array('hide_empty'=>false));
foreach($categories as $category) {
$category_nicename = $category->slug;
if ( $category->parent == $category->cat_ID )
$category->parent = 0;
elseif ($category->parent != 0 )
$category_nicename = get_category_parents( $category->parent, false, '/', true ) . $category_nicename;
$category_rewrite['('.$category_nicename.')/(?:feed/)?(feed|rdf|rss|rss2|atom)/?$'] = 'index.php?category_name=$matches[1]&feed=$matches[2]';
$category_rewrite['('.$category_nicename.')/page/?([0-9]{1,})/?$'] = 'index.php?category_name=$matches[1]&paged=$matches[2]';
$category_rewrite['('.$category_nicename.')/?$'] = 'index.php?category_name=$matches[1]';
}
global $wp_rewrite;
$old_base = $wp_rewrite->get_category_permastruct();
$old_base = str_replace( '%category%', '(.+)', $old_base );
$old_base = trim($old_base, '/');
$category_rewrite[$old_base.'$'] = 'index.php?category_redirect=$matches[1]';
return $category_rewrite;
}
// remove tag base
add_filter('tag_rewrite_rules', 'no_tag_base_rewrite_rules');
function no_tag_base_rewrite_rules($tag_rewrite) {
$tag_rewrite=array();
$tags=get_tags(array('hide_empty'=>false));
foreach($tags as $tag) {
$tag_nicename = $tag->slug;
if ( $tag->parent == $tag->tag_ID )
$tag->parent = 0;
elseif ($tag->parent != 0 )
$tag_nicename = get_tag_parents( $tag->parent, false, '/', true ) . $tag_nicename;
$tag_rewrite['('.$tag_nicename.')/(?:feed/)?(feed|rdf|rss|rss2|atom)/?$'] = 'index.php?tag=$matches[1]&feed=$matches[2]';
$tag_rewrite['('.$tag_nicename.')/page/?([0-9]{1,})/?$'] = 'index.php?tag=$matches[1]&paged=$matches[2]';
$tag_rewrite['('.$tag_nicename.')/?$'] = 'index.php?tag=$matches[1]';
}
global $wp_rewrite;
$old_base = $wp_rewrite->get_tag_permastruct();
$old_base = str_replace( '%tag%', '(.+)', $old_base );
$old_base = trim($old_base, '/');
$tag_rewrite[$old_base.'$'] = 'index.php?tag_redirect=$matches[1]';
return $tag_rewrite;
}
// remove author base
add_filter('author_rewrite_rules', 'no_author_base_rewrite_rules');
function no_author_base_rewrite_rules($author_rewrite) {
global $wpdb;
$author_rewrite = array();
$authors = $wpdb->get_results("SELECT user_nicename AS nicename from $wpdb->users");
foreach($authors as $author) {
$author_rewrite["({$author->nicename})/(?:feed/)?(feed|rdf|rss|rss2|atom)/?$"] = 'index.php?author_name=$matches[1]&feed=$matches[2]';
$author_rewrite["({$author->nicename})/page/?([0-9]+)/?$"] = 'index.php?author_name=$matches[1]&paged=$matches[2]';
$author_rewrite["({$author->nicename})/?$"] = 'index.php?author_name=$matches[1]';
}
return $author_rewrite;}
add_filter('author_link', 'no_author_base', 1000, 2);
function no_author_base($link, $author_id) {
$link_base = trailingslashit(get_option('home'));
$link = preg_replace("|^{$link_base}author/|", '', $link);
return $link_base . $link;
}
Если вы все еще ищете комбинацию (теги, категории и страницы на основе url), вы можете сделать это, как я.
.
) для базы категорий и тегов (https://premium.wpmudev.org/blog/removing-category-base-urls-wordpress/)Протестировано с помощью Wordpress 3.9.1
Если у вас есть страницы, категории или теги с одинаковым именем, система примет:
Плагин без категории не работал у меня.
Для Multisite WordPress следующие работы:
\
;/%category%/%postname%/
.
Это отобразит ваш URL как www.domainname.com/categoryname/postname
;yourdoamainname/blog/
). Игнорируйте его. Если вы сохраните сейчас, то работа, которую вы сделали на шаге 4., будет перезаписана. Этот шаг открытия страницы постоянной ссылки, но не сохранения в необходимом для обновления базы данных.Выберите пользовательскую структуру в постоянных ссылках и добавьте /% категории%/% postname%/после вашего домена. Добавление "/" в базу категорий не работает, вам нужно добавить период/точку. Я написал учебник для этого здесь: удалить категорию из учебника URL
https://wordpress.org/plugins/remove-category-url/ Используйте этот плагин, чтобы он отлично справлялся со скрытием базы категорий Он не требует установки только для установки и активации.
другое решение:
В файле wp-includes/rewrite.php вы увидите код:
$this->category_structure = $this->front . 'category/';
просто скопируйте всю функцию, поместите в свои функции .php и зацепите ее. просто измените приведенную выше строку следующим образом:
$this->category_structure = $this->front . '/';
Добавление "." или "/" не будет работать, если вы хотите консолидированный просмотр блога. Кроме того, я знаю, что это будет делать для RSS или XML-каналов. Я чувствую себя лучше, придерживаясь конвенции WP. Тем не менее, я придумал более элегантный подход.
Во-первых, я называю URL-адрес главной страницы "blog"
Затем я создал категорию под названием "все". Наконец, я, но все мои подкатегории под "все". Поэтому я получаю структуру url, как это.
/blog - 404 - recommend 301 redirect to /blog/all/
/blog/all/ - all posts combined.
/blog/all/category1/ - posts filtered by category1
/blog/all/category2/ - posts filterer by category2
Я помещаю пользовательскую метку в пункт меню, называемый "Блог", но он идет в блог/все. Было бы неплохо добавить 301 redirect/blog to/blog/all в файл .htaccess, чтобы избежать включения/записи в 404.
/
должна быть установлена для базы категорий. Предложите вместо этого использовать ответ @ Robbert..
вместо/
и он будет работать нормально.