Удалить категорию и теговую базу из URL WordPress - без плагина

30

Я хотел бы удалить категорию и базу тегов из wordpress URL. Я столкнулся с другими сообщениями и решениями, которые использовали плагины. Я хотел бы держаться подальше от плагинов и иметь решение изнутри functions.php. Это предотвратит изменение любых будущих обновлений плагинов или файлов Wordpress по умолчанию.

Любая помощь будет оценена по достоинству. Спасибо!

Я уже пробовал эти решения:

Теги:
base
category

12 ответов

33

Мне понравилось это решение:

Если вы хотите удалить /category/ из URL-адреса, выполните следующие два действия:

  • Перейдите в Настройки → Permalinks и выберите Custom и введите: /%category%/%postname%/
  • Затем установите для базы категорий .

Сохраните его, и вы увидите, что ваш URL-адрес изменен на этот формат: HTTP:/yourblog.com/quotes/

(Источник: http://premium.wpmudev.org/blog/daily-tip-quick-trick-to-remove-category-from-wordpress-url/)

  • 1
    Последняя версия WP (v.4, по крайней мере, в моем случае) , по-видимому, не позволяет / должна быть установлена для базы категорий. Предложите вместо этого использовать ответ @ Robbert.
  • 4
    @gmaggio Просто используйте . вместо / и он будет работать нормально.
Показать ещё 6 комментариев
20
  • Установить пользовательскую структуру:/% postname%/
  • Установить категорию базы:. (точка не /)

  • Сохранить. 100% работают правильно.

  • 3
    Это приводит к исчезновению категории, но если я нажму на эту новую ссылку, она перенаправит меня на несуществующую страницу. Зачем?
  • 1
    У меня тоже не работает - разрывает ссылки на категории. Я укусил пулю и установил плагин.
Показать ещё 2 комментария
13

Пока вы отклоняете его как решение, плагин является самым простым и наиболее последовательным методом, и они не изменяют файлы Wordpress по умолчанию.

http://wordpress.org/plugins/wp-no-category-base/

Его не нужно обновлять в течение года, поэтому он не создает никаких проблем с обновлениями.

Существует не просто ручное решение, которое будет делать все это, что не просто реплицирует то, что делает плагин из ваших собственных функций. php

  • Улучшенные и логические константы, такие как myblog.com/my-category/и myblog.com/my-category/my-post/.
  • Простой плагин - едва ли добавляет накладные расходы.
  • Работает из коробки - настройка не требуется. Нет необходимости изменять Wordpress файлы.
  • Не требует использования других плагинов.
  • Совместимость с плагинами Sitemap.
  • Работает с несколькими подкатегориями.
  • Работает с WordPress Multisite.
  • Перенаправляет старые константы категории на новые (перенаправление 301, хорошо для SEO).

Плюс вы получите преимущество, которое, если Wordpress изменится, тогда плагин будет обновлен, чтобы работать, пока вам нужно будет выяснить, как самостоятельно исправить свой собственный код.

  • 1
    Плагин работает хорошо. Мне все еще интересно увидеть альтернативные решения.
  • 4
    Вот более актуальная альтернатива: Удалить URL категории
Показать ещё 5 комментариев
8

Если вы используете плагин Yoast SEO, просто перейдите к:

Advanced > Permalinks > Change URLs

И выберите remove из Strip the category base (usually /category/) from the category URL.

Что касается удаления тега, я еще не нашел решения.

  • 3
    По состоянию на 13 апреля 2017 года «точечный» способ сделать это нарушает многие функции Wordpress 4.6 и выше. Другими словами, это больше не жизнеспособное решение. Однако Yoast справляется с этим без особых усилий. Установите плагин, включите функцию, и она работает без нареканий. Кроме того, вы получаете отличный плагин для управления большим количеством вашего сайта. Win Win!
  • 0
    Также можно добавить, что «Страницы с расширенными настройками» необходимо включить на вкладке «Функции» плагина в его текущей версии.
Показать ещё 4 комментария
3

вместо этого поместите это в свои функции. 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 );
  • 0
    Отличное решение без плагина ! Как раз то, что мне было нужно!
  • 1
    Тем не менее, выше, кажется, не работает для подкатегорий , хотя ... например. www.site.com/main-category/sub-category/ . Вернул страницу ошибки 404
Показать ещё 2 комментария
2

Точечный трюк, скорее всего, испортит ваши 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;
}
  • 0
    где вы положили этот код?
  • 0
    Ваш файл functions.php
Показать ещё 2 комментария
2

Если вы все еще ищете комбинацию (теги, категории и страницы на основе url), вы можете сделать это, как я.

Протестировано с помощью Wordpress 3.9.1

Если у вас есть страницы, категории или теги с одинаковым именем, система примет:

  • тег
  • страница
  • категория
2

Плагин без категории не работал у меня.

Для Multisite WordPress следующие работы:

  • Перейдите на сайты сетевого администрирования;
  • Открыть сайт под \;
  • Перейти к настройкам;
  • В разделе структуры константных ссылок /%category%/%postname%/. Это отобразит ваш URL как www.domainname.com/categoryname/postname;
  • Теперь перейдите на панель инструментов своего сайта (а не в сетевую панель);
  • Открыть настройки;
  • Открыть постоянную ссылку. Не сохраняйте (постоянная ссылка будет показывать неизменяемое поле как yourdoamainname/blog/). Игнорируйте его. Если вы сохраните сейчас, то работа, которую вы сделали на шаге 4., будет перезаписана. Этот шаг открытия страницы постоянной ссылки, но не сохранения в необходимом для обновления базы данных.
0

Выберите пользовательскую структуру в постоянных ссылках и добавьте /% категории%/% postname%/после вашего домена. Добавление "/" в базу категорий не работает, вам нужно добавить период/точку. Я написал учебник для этого здесь: удалить категорию из учебника URL

  • 0
    Это, кажется, не работает для подкатегорий, хотя. Вы получите 404.
0

https://wordpress.org/plugins/remove-category-url/ Используйте этот плагин, чтобы он отлично справлялся со скрытием базы категорий Он не требует установки только для установки и активации.

  • 1
    Вопрос ищет решение "без плагина".
-3

обновленный ответ:

другое решение:
В файле wp-includes/rewrite.php вы увидите код:
$this->category_structure = $this->front . 'category/'; просто скопируйте всю функцию, поместите в свои функции .php и зацепите ее. просто измените приведенную выше строку следующим образом:
$this->category_structure = $this->front . '/';

  • 0
    Разумно ли менять файлы в wp-include? В случае обновления от WordPress все изменения будут потеряны. Существует решение, упомянутое выше, с использованием functions.php.
  • 2
    Изменение основных файлов редко является решением, которое вы ищете, так как они могут быть изменены и перезаписаны основными разработчиками в любое время.
Показать ещё 1 комментарий
-4

Добавление "." или "/" не будет работать, если вы хотите консолидированный просмотр блога. Кроме того, я знаю, что это будет делать для 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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню