Intereting Posts
Список категорий для пользовательских типов сообщений – WordPress Пользовательские возможности подменю типа сообщения – настраиваемый плагин Custom Post Type / Two level deep taxonomy (cat и subcat.) Проблема uri (ошибка 404) Есть ли плагин, который толкает сообщения в ваш профиль Google+? Как создать виджет, который позволяет только один экземпляр? Shortcode в выдержке разрешить подписчикам просматривать сообщения без использования плагина Заменить меню с помощью виджета или файла настраиваемого шаблона Проблема с Ajax в WordPress Перемещение тестовой темы на сайт без ошибки mySQL – как? проблема options.php – данные не сохранены Как сбросить канонические URL-адреса / исправить цикл перенаправления Как вставить виджет поиска amazon в сообщения или страницы? не может видеть живую версию style.css – это кеширование веб-сервера? переписать конечную точку, не работающую на домашней странице

Удаление ссылок на базовую форму категории испортит поведение родительского и дочернего

Я использую «стандартный» трюк для удаления категории в WordPress. В моих постоянных ссылках я устанавливал структуру постоянных ссылок на

/%category%/%postname%/ 

И моя база категорий

 . 

Это работало нормально, пока клиент не сказал, что он хочет, чтобы родительские категории отображались в заголовке статьи, а дочерние категории отображались в нижнем колонтитуле статей на домашней / индексной странице …

Я настроил его, но проблема в том, что ссылки на дочерние категории теперь:

 http://www.example.com/./parent_category/child_category 

И когда я нажимаю дочернюю категорию, я отправляюсь в последнюю статью.

Я пытался добавить в свой .htaccess

 RewriteRule ^category/(.+)$ http://www.example.com/$1 [R=301,L] 

Но это ничего не делало.

Теперь все это работает, когда я удаляю точку, но тогда мои ссылки выглядят так:

 http://www.example.com/category/parent_category/child_category 

И клиент явно не хочет, чтобы category/ в ссылке …

Что делать, если не устанавливать плагин? Как это сортировать? Можно мне

 http://www.example.com/parent_category/child_category 

Как моя постоянная ссылка, и если да, то как этого добиться?

Solutions Collecting From Web of "Удаление ссылок на базовую форму категории испортит поведение родительского и дочернего"

«.» метод всегда был маловероятным kludge.

Плагин «Удалить URL-адрес категории» работает нормально и, по моему опыту, рекламируется. Я не уверен, что основанием для отвращения к установке плагина для этой цели является, но если вы не хотите этого делать по какой-то причине, вы всегда можете просто изучить его и скопировать и удалить техника, применяемая разработчиками плагинов, хотя код, основанный на овладении встроенными правилами, на самом деле не очень сложный. Весь основной файл составляет всего 128 строк, а основная функциональность – около 100 из них, охватывающая четыре действия и четыре фильтра.

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

 /** * Plugin Name: Remove Category URL * Plugin URI: http://valeriosouza.com.br/portfolio/remove-category-url/ * Description: This plugin removes '/category' from your category permalinks. (eg `/category/my-category/` to `/my-category/`) * Version: 1.1 * Author: Valerio Souza, WordLab Academy * Author URI: http://valeriosouza.com.br/ */ /* hooks */ register_activation_hook( __FILE__, 'remove_category_url_refresh_rules' ); register_deactivation_hook( __FILE__, 'remove_category_url_deactivate' ); /* actions */ add_action( 'created_category', 'remove_category_url_refresh_rules' ); add_action( 'delete_category', 'remove_category_url_refresh_rules' ); add_action( 'edited_category', 'remove_category_url_refresh_rules' ); add_action( 'init', 'remove_category_url_permastruct' ); /* filters */ add_filter( 'category_rewrite_rules', 'remove_category_url_rewrite_rules' ); add_filter( 'query_vars', 'remove_category_url_query_vars' ); // Adds 'category_redirect' query variable add_filter( 'request', 'remove_category_url_request' ); // Redirects if 'category_redirect' is set add_filter( 'plugin_row_meta', 'remove_category_url_plugin_row_meta', 10, 4 ); function remove_category_url_refresh_rules() { global $wp_rewrite; $wp_rewrite->flush_rules(); } function remove_category_url_deactivate() { remove_filter( 'category_rewrite_rules', 'remove_category_url_rewrite_rules' ); // We don't want to insert our custom rules again remove_category_url_refresh_rules(); } /** * Removes category base. * * @return void */ function remove_category_url_permastruct() { global $wp_rewrite, $wp_version; if ( 3.4 <= $wp_version ) { $wp_rewrite->extra_permastructs['category']['struct'] = '%category%'; } else { $wp_rewrite->extra_permastructs['category'][0] = '%category%'; } } /** * Adds our custom category rewrite rules. * * @param array $category_rewrite Category rewrite rules. * * @return array */ function remove_category_url_rewrite_rules( $category_rewrite ) { global $wp_rewrite; $category_rewrite = array(); /* WPML is present: temporary disable terms_clauses filter to get all categories for rewrite */ if ( class_exists( 'Sitepress' ) ) { global $sitepress; remove_filter( 'terms_clauses', array( $sitepress, 'terms_clauses' ) ); $categories = get_categories( array( 'hide_empty' => false, '_icl_show_all_langs' => true ) ); add_filter( 'terms_clauses', array( $sitepress, 'terms_clauses' ) ); } else { $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 ( 0 != $category->parent ) { $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]'; } // Redirect support from Old Category Base $old_category_base = get_option( 'category_base' ) ? get_option( 'category_base' ) : 'category'; $old_category_base = trim( $old_category_base, '/' ); $category_rewrite[ $old_category_base . '/(.*)$' ] = 'index.php?category_redirect=$matches[1]'; return $category_rewrite; } function remove_category_url_query_vars( $public_query_vars ) { $public_query_vars[] = 'category_redirect'; return $public_query_vars; } /** * Handles category redirects. * * @param $query_vars Current query vars. * * @return array $query_vars, or void if category_redirect is present. */ function remove_category_url_request( $query_vars ) { if ( isset( $query_vars['category_redirect'] ) ) { $catlink = trailingslashit( get_option( 'home' ) ) . user_trailingslashit( $query_vars['category_redirect'], 'category' ); status_header( 301 ); header( "Location: $catlink" ); exit; } return $query_vars; } function remove_category_url_plugin_row_meta( $links, $file ) { if( plugin_basename( __FILE__ ) === $file ) { $links[] = sprintf( '<a target="_blank" href="%s">%s</a>', esc_url('http://wordlab.com.br/donate/'), __( 'Donate', 'remove_category_url' ) ); } return $links; } 

Поместите этот код в свой файл functions.php, и вам хорошо идти (даже с WordPress 4.7.2)

 /* hooks */ register_activation_hook(__FILE__, 'yw_no_category_slug_refresh_rules'); register_deactivation_hook(__FILE__, 'yw_no_category_slug_deactivate'); /* actions */ add_action('created_category', 'yw_no_category_slug_refresh_rules'); add_action('delete_category', 'yw_no_category_slug_refresh_rules'); add_action('edited_category', 'yw_no_category_slug_refresh_rules'); add_action('init', 'yw_no_category_slug_permastruct'); /* filters */ add_filter('category_rewrite_rules', 'yw_no_category_slug_rewrite_rules'); add_filter('query_vars', 'yw_no_category_slug_query_vars'); // Adds 'category_redirect' query variable add_filter('request', 'yw_no_category_slug_request'); // Redirects if 'category_redirect' is set function yw_no_category_slug_refresh_rules() { global $wp_rewrite; $wp_rewrite->flush_rules(); } function yw_no_category_slug_deactivate() { remove_filter( 'category_rewrite_rules', 'yw_no_category_slug_rewrite_rules' ); // We don't want to insert our custom rules again yw_no_category_slug_refresh_rules(); } /** * Removes category base. * * @return void */ function yw_no_category_slug_permastruct() { global $wp_rewrite; global $wp_version; if ( $wp_version >= 3.4 ) { $wp_rewrite->extra_permastructs['category']['struct'] = '%category%'; } else { $wp_rewrite->extra_permastructs['category'][0] = '%category%'; } } /** * Adds our custom category rewrite rules. * * @param array $category_rewrite Category rewrite rules. * * @return array */ function yw_no_category_slug_rewrite_rules($category_rewrite) { global $wp_rewrite; $category_rewrite=array(); /* WPML is present: temporary disable terms_clauses filter to get all categories for rewrite */ if ( class_exists( 'Sitepress' ) ) { global $sitepress; remove_filter( 'terms_clauses', array( $sitepress, 'terms_clauses' ) ); $categories = get_categories( array( 'hide_empty' => false ) ); //Fix provided by Albin here https://wordpress.org/support/topic/bug-with-wpml-2/#post-8362218 //add_filter( 'terms_clauses', array( $sitepress, 'terms_clauses' ) ); add_filter( 'terms_clauses', array( $sitepress, 'terms_clauses' ), 10, 4 ); } else { $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})/{$wp_rewrite->pagination_base}/?([0-9]{1,})/?$"] = 'index.php?category_name=$matches[1]&paged=$matches[2]'; $category_rewrite['('.$category_nicename.')/?$'] = 'index.php?category_name=$matches[1]'; } // Redirect support from Old Category Base $old_category_base = get_option( 'category_base' ) ? get_option( 'category_base' ) : 'category'; $old_category_base = trim( $old_category_base, '/' ); $category_rewrite[$old_category_base.'/(.*)$'] = 'index.php?category_redirect=$matches[1]'; return $category_rewrite; } function yw_no_category_slug_query_vars($public_query_vars) { $public_query_vars[] = 'category_redirect'; return $public_query_vars; } /** * Handles category redirects. * * @param $query_vars Current query vars. * * @return array $query_vars, or void if category_redirect is present. */ function yw_no_category_slug_request($query_vars) { if( isset( $query_vars['category_redirect'] ) ) { $catlink = trailingslashit( get_option( 'home' ) ) . user_trailingslashit( $query_vars['category_redirect'], 'category' ); status_header( 301 ); header( "Location: $catlink" ); exit(); } return $query_vars; }