Intereting Posts
Сообщение удаляет любой текст из сообщения, следующего за специальными символами Порядок сортировки для пользовательского запроса в архиве типа сообщения не работает Кнопка «Добавить новую» в настраиваемой сетке типа сообщения Как использовать shortcode извлечения в цикле? Остановите WordPress полностью и запустите свой собственный код. add_action wp_ajax_ не загружается в файл плагина WP Network Персонализация пользовательских сообщений разрешения локальной папки vs chown – соображения безопасности Добавление слайдера в систему комментариев Вариации Javascript не работает при отображении продукта в Quick view через ajax Плагин расширенных пользовательских полей: введите URL-адрес файла в родительский Удалить поле из json в wp rest api v1 Пользовательский шаблон для разных типов сообщений Переход от одного теста к нескольким конечным средам Мне нужен пользовательский url например альбомы / album_folder / album_type / album1. Как я могу это достичь?

Удалите таксономический пул из пользовательской иерархической таксономии

Я создал таксономию «форума», используя следующие правила:

register_taxonomy( 'forum', array('topic'), array( 'public' => true, 'name' => _a('Forums'), 'singular_name' => _a('Forum'), 'show_ui' => true, 'show_in_nav_menus' => true, 'hierarchical' => true, 'labels' => array( 'name' => _a('Forums'), 'singular_name' => _a('Forum'), 'search_items' => _a('Search Forums'), 'popular_items' => _a('Popular Forums'), 'all_items' => _a('All Forums'), 'parent_item' => _a('Parent Forum'), 'parent_item_colon' => _a('Parent Forum:'), 'edit_item' => _a('Edit Forum'), 'update_item' => _a('Update Forum'), 'add_new_item' => _a('Add New Forum'), 'new_item_name' => _a('New Forum Name'), ), 'query_var' => true, 'rewrite' => array('slug' => 'forums', 'with_front' => false, 'hierarchical' => true), ) ); 

В интерфейсе URL-адреса выглядят так:

 forums/general-discussion/sub-forum 

Как удалить передний слизень («форумы»)? Т.е., измените URL-адреса на:

 general-discussion/sub-forum 

Если я передаю пустой аргумент slug для register_taxonomy (), он работает, но это вызывает проблемы с постоянными ссылками типа сообщения, связанные с этой таксономией

ОБНОВИТЬ

Поскольку в этом ядре WordPress добавлен крюк 'do_parse_request' который позволяет обрабатывать URL-адреса элегантно и без необходимости расширения класса WP . Я подробно рассмотрел эту тему в своем октябрьском разговоре в Word 2007 в Атланте, озаглавленном « Hardcore URL Routing » ; слайды доступны по ссылке.

ОРИГИНАЛЬНЫЙ ОТВЕТ

Дизайн URL-адресов был важным для более десяти лет; Я даже написал блог об этом несколько лет назад. И хотя WordPress является суммой – это блестящий бит программного обеспечения, к сожалению , система перезаписи URL-адресов просто не хватает мертвого мозга (ИМХО, конечно. 🙂 В любом случае, рад видеть, что люди заботятся о дизайне URL!

Ответ, который я собираюсь предоставить, – это плагин, который я WP_Extended что является доказательством концепции этого предложения в Trac (обратите внимание, что предложение началось как одно и превратилось в другое, поэтому вам нужно прочитать всю вещь, чтобы увидеть где он возглавлял.)

В основном идея заключается в подклассе WP класса, переопределении parse_request() , а затем присваивании глобальной переменной $wp экземпляром подкласса. Затем в parse_request() вы фактически проверяете путь по сегменту пути, а не используете список регулярных выражений, которые должны соответствовать URL целиком.

Таким образом, чтобы указать это явно, этот метод вставляет логику перед parse_request() которая проверяет соответствие URL-to-RegEx и вместо этого сначала ищет совпадения таксономии, но она ТОЛЬКО заменяет parse_request() и оставляет весь остаток WordPress Система маршрутизации URL-адресов, в том числе и особенно использование переменной $query_vars .

Для вашего случая использования эта реализация сравнивает только сегменты URL-адреса с таксономическими терминами, поскольку это все, что вам нужно. Эта реализация проверяет термины таксономии, соблюдая отношения между родительскими и дочерними терминами, и когда она находит совпадение, она назначает путь URL (минус ведущие и завершающие косые черты) до $wp->query_vars['category_name'] , $wp->query_vars['tag'] или $wp->query_vars['taxonomy'] & $wp->query_vars['term'] и он обходит метод parse_request() класса WP .

С другой стороны, если URL-адрес не соответствует термину из таксономии, которую вы указали, он делегирует логику маршрутизации URL-адресов в систему перезаписи WordPress, вызывая метод parse_request() класса WP .

Чтобы использовать WP_Extended для вашего прецедента, вам нужно вызвать функцию register_url_route() из файла functions.php вашей темы следующим образом:

 add_action('init','init_forum_url_route'); function init_forum_url_route() { register_url_route(array('taxonomy'=>'forum')); } 

Что здесь является исходным кодом для плагина:

 <?php /* Filename: wp-extended.php Plugin Name: WP Extended for Taxonomy URL Routes Author: Mike Schinkel */ function register_url_route($args=array()) { if (isset($args['taxonomy'])) WP_Extended::register_taxonomy_url($args['taxonomy']); } class WP_Extended extends WP { static $taxonomies = array(); static function on_load() { add_action('setup_theme',array(__CLASS__,'setup_theme')); } static function register_taxonomy_url($taxonomy) { self::$taxonomies[$taxonomy] = get_taxonomy($taxonomy); } static function setup_theme() { // Setup theme is 1st code run after WP is created. global $wp; $wp = new WP_Extended(); // Replace the global $wp } function parse_request($extra_query_vars = '') { $path = $_SERVER['REQUEST_URI']; $domain = str_replace('.','\.',$_SERVER['SERVER_NAME']); //$root_path = preg_replace("#^https?://{$domain}(/.*)$#",'$1',WP_SITEURL); $root_path = $_SERVER['HTTP_HOST']; if (substr($path,0,strlen($root_path))==$root_path) $path = substr($path,strlen($root_path)); list($path) = explode('?',$path); $path_segments = explode('/',trim($path,'/')); $taxonomy_term = array(); $parent_id = 0; foreach(self::$taxonomies as $taxonomy_slug => $taxonomy) { $terms = get_terms($taxonomy_slug); foreach($path_segments as $segment_index => $path_segment) { foreach($terms as $term_index => $term) { if ($term->slug==$path_segments[$segment_index]) { if ($term->parent!=$parent_id) { // Make sure we test parents $taxonomy_term = array(); } else { $parent_id = $term->term_id; // Capture parent ID for verification $taxonomy_term[] = $term->slug; // Collect slug as path segment unset($terms[$term_index]); // No need to scan it again } break; } } } if (count($taxonomy_term)) break; } if (count($taxonomy_term)) { $path = implode('/',$taxonomy_term); switch ($taxonomy_slug) { case 'category': $this->query_vars['category_name'] = $path; break; case 'post_tag': $this->query_vars['tag'] = $path; break; default: $this->query_vars['taxonomy'] = $taxonomy_slug; $this->query_vars['term'] = $path; break; } } else { parent::parse_request($extra_query_vars); // Delegate to WP class } } } WP_Extended::on_load(); не <?php /* Filename: wp-extended.php Plugin Name: WP Extended for Taxonomy URL Routes Author: Mike Schinkel */ function register_url_route($args=array()) { if (isset($args['taxonomy'])) WP_Extended::register_taxonomy_url($args['taxonomy']); } class WP_Extended extends WP { static $taxonomies = array(); static function on_load() { add_action('setup_theme',array(__CLASS__,'setup_theme')); } static function register_taxonomy_url($taxonomy) { self::$taxonomies[$taxonomy] = get_taxonomy($taxonomy); } static function setup_theme() { // Setup theme is 1st code run after WP is created. global $wp; $wp = new WP_Extended(); // Replace the global $wp } function parse_request($extra_query_vars = '') { $path = $_SERVER['REQUEST_URI']; $domain = str_replace('.','\.',$_SERVER['SERVER_NAME']); //$root_path = preg_replace("#^https?://{$domain}(/.*)$#",'$1',WP_SITEURL); $root_path = $_SERVER['HTTP_HOST']; if (substr($path,0,strlen($root_path))==$root_path) $path = substr($path,strlen($root_path)); list($path) = explode('?',$path); $path_segments = explode('/',trim($path,'/')); $taxonomy_term = array(); $parent_id = 0; foreach(self::$taxonomies as $taxonomy_slug => $taxonomy) { $terms = get_terms($taxonomy_slug); foreach($path_segments as $segment_index => $path_segment) { foreach($terms as $term_index => $term) { if ($term->slug==$path_segments[$segment_index]) { if ($term->parent!=$parent_id) { // Make sure we test parents $taxonomy_term = array(); } else { $parent_id = $term->term_id; // Capture parent ID for verification $taxonomy_term[] = $term->slug; // Collect slug as path segment unset($terms[$term_index]); // No need to scan it again } break; } } } if (count($taxonomy_term)) break; } if (count($taxonomy_term)) { $path = implode('/',$taxonomy_term); switch ($taxonomy_slug) { case 'category': $this->query_vars['category_name'] = $path; break; case 'post_tag': $this->query_vars['tag'] = $path; break; default: $this->query_vars['taxonomy'] = $taxonomy_slug; $this->query_vars['term'] = $path; break; } } else { parent::parse_request($extra_query_vars); // Delegate to WP class } } } WP_Extended::on_load(); 

PS CAVEAT № 1

Хотя для данного сайта я считаю, что этот метод работает блестяще, но этот метод НИКОГДА не должен использоваться для распространения плагина на WordPress.org для использования другими пользователями . Если он лежит в основе программного пакета на основе WordPress, тогда это может быть хорошо. В противном случае этот метод должен быть ограничен улучшением маршрутизации URL для определенного сайта .

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

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

CAVEAT # 2

Я написал это, чтобы переопределить parse_request() который является очень большой функцией, и вполне возможно, что я пропустил свойство или два из глобального объекта $wp который я должен был установить. Так что если что-то действует, то дайте мне знать, и я мы будем рады исследовать его и, если потребуется, пересмотреть ответ.

Так или иначе…

Просто, на самом деле.

Шаг 1: Прекратите использовать параметр перезаписи. Мы собираемся переделать ваши собственные перезаписи.

 'rewrite'=>false; 

Шаг 2: Установите подробные правила страницы. Это приводит к тому, что нормальные страницы имеют свои собственные правила вместо того, чтобы быть уловкой в ​​нижней части страницы.

Шаг 3: Создайте правила перезаписи для обработки ваших случаев использования.

Шаг 4: Ручное принудительное выполнение правил флеша. Самый простой способ: перейдите в настройки-> ссылку и нажмите кнопку сохранения. Я предпочитаю это по методу активации плагинов для моего собственного использования, так как я могу заставить правила стираться всякий раз, когда меняю вещи.

Итак, время кода:

 function test_init() { // create a new taxonomy register_taxonomy( 'forum', 'post', array( 'query_var' => true, 'public'=>true, 'label'=>'Forum', 'rewrite' => false, ) ); // force verbose rules.. this makes every Page have its own rule instead of being a // catch-all, which we're going to use for the forum taxo instead global $wp_rewrite; $wp_rewrite->use_verbose_page_rules = true; // two rules to handle feeds add_rewrite_rule('(.+)/feed/(feed|rdf|rss|rss2|atom)/?$','index.php?forum=$matches[1]&feed=$matches[2]'); add_rewrite_rule('(.+)/(feed|rdf|rss|rss2|atom)/?$','index.php?forum=$matches[1]&feed=$matches[2]'); // one rule to handle paging of posts in the taxo add_rewrite_rule('(.+)/page/?([0-9]{1,})/?$','index.php?forum=$matches[1]&paged=$matches[2]'); // one rule to show the forum taxo normally add_rewrite_rule('(.+)/?$', 'index.php?forum=$matches[1]'); } add_action( 'init', 'test_init' ); которого function test_init() { // create a new taxonomy register_taxonomy( 'forum', 'post', array( 'query_var' => true, 'public'=>true, 'label'=>'Forum', 'rewrite' => false, ) ); // force verbose rules.. this makes every Page have its own rule instead of being a // catch-all, which we're going to use for the forum taxo instead global $wp_rewrite; $wp_rewrite->use_verbose_page_rules = true; // two rules to handle feeds add_rewrite_rule('(.+)/feed/(feed|rdf|rss|rss2|atom)/?$','index.php?forum=$matches[1]&feed=$matches[2]'); add_rewrite_rule('(.+)/(feed|rdf|rss|rss2|atom)/?$','index.php?forum=$matches[1]&feed=$matches[2]'); // one rule to handle paging of posts in the taxo add_rewrite_rule('(.+)/page/?([0-9]{1,})/?$','index.php?forum=$matches[1]&paged=$matches[2]'); // one rule to show the forum taxo normally add_rewrite_rule('(.+)/?$', 'index.php?forum=$matches[1]'); } add_action( 'init', 'test_init' ); 

Помните, что после добавления этого кода вам необходимо активировать его, когда вы сбрасываете правила постоянной ссылки (путем сохранения страницы в Настройках-> постоянных)!

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

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

 function test_foot() { global $wp_rewrite; echo '<pre>'; var_dump($wp_rewrite->rules); echo '</pre>'; } add_action('wp_footer','test_foot'); 

Таким образом, я вижу текущие правила с первого взгляда на моей странице. Просто помните, что с учетом любого URL-адреса система запускается в верхней части правил и проходит через них, пока не найдет ту, которая соответствует. Затем совпадение используется для перезаписи запроса в более нормальный вид? Key = value set. Эти ключи анализируются в том, что входит в объект WP_Query. Просто.

Edit: Side note, этот метод, вероятно, будет работать только в том случае, если ваша обычная структура сообщений начинается с чего-то, что не является полным, например% category% или какой-то такой вещи. Вам нужно запустить его со статической строки или числовой, например% year%. Это делается для того, чтобы не догнать ваш URL до того, как он доберется до ваших правил.

Вы не сможете это сделать, используя только WP_Rewrite, так как он не может различать термин slugs и post slugs.

Вы также должны зацепить «запрос» и предотвратить 404, установив вместо него таксономический запрос var var.

Что-то вроде этого:

 function fix_post_request( $request ) { $tax_qv = 'forum'; $cpt_name = 'post'; if ( !empty( $request[ $tax_qv ] ) ) { $slug = basename( $request[ $tax_qv ] ); // if this would generate a 404 if ( !get_term_by( 'slug', $slug, $tax_qv ) ) { // set the correct query vars $request[ 'name' ] = $slug; $request[ 'post_type' ] = $cpt_name; unset( $request[$tax_qv] ); } } return $request; } add_filter( 'request', 'fix_post_request' ); 

Обратите внимание, что таксономия должна быть определена до типа публикации.

Это было бы подходящее время, чтобы указать, что наличие таксономии и типа сообщения с одним и тем же запросом var является плохой идеей.

Кроме того, вы не сможете достигнуть сообщений, имеющих один и тот же слизень, как и одно из условий.

Я бы посмотрел на код плагина верхнего уровня:

http://fortes.com/projects/wordpress/top-level-cats/

Вы могли бы легко адаптировать это, чтобы он искал вашу обычную цепочку таксономии, изменив

 $category_base = get_option('category_base'); 

в строке 74 на что-то вроде:

 $category_base = 'forums'; 

Я бы предложил посмотреть плагин Custom Post Permalinks . У меня нет времени проверять прямо сейчас, но это может помочь в вашей ситуации.

Поскольку я знаком с вашим другим вопросом , я отвечу на это.

Я вообще не тестировал это, но это может сработать, если вы выполните его один раз сразу после регистрации всех желаний.

 class RRSwitcher { var $rules; function RRSwitcher(){ add_filter( 'topic_rewrite_rules', array( $this, 'topics' ) ); add_filter( 'rewrite_rules_array', array( $this, 'rules' ) ); } function topics( $array ){ $this->rules = $array; return array(); } function rules( $array ){ return array_merge( (array)$array, (array)$this->rules ); } } $RRSwitcher = new RRSwitcher(); global $wp_rewrite; $wp_rewrite->use_verbose_rules = true; $wp_rewrite->flush_rules(); 

Что это делает: он удаляет правила перезаписи, созданные из постоянной ссылки на темы из обычного потока массива правил, и повторно объединяет их в конце массива. Это мешает этим правилам вмешиваться в любые другие правила перезаписи. Затем он принудительно устанавливает правила перезаписи (каждая страница получает индивидуальное правило с определенным регулярным выражением). Это предотвращает вмешательство страниц в правила вашей темы. Наконец, он выполняет жесткий флеш (убедитесь, что ваш файл .htaccess доступен для записи, иначе это не сработает) и сохраняет очень большой очень сложный массив правил перезаписи.

Для этого есть плагин .

Он удаляет тип slug, добавляя определенное правило для каждой страницы пользовательского типа сообщения.

Не уверен, что это будет работать для таксономий, но оно работает для пользовательских типов сообщений

Хотя он не обновлялся в течение 2 лет, для меня работал плагин ниже: http://wordpress.org/plugins/remove-slug-from-custom-post-type/

FYI Я запускаю WP 3.9.1 с типами WP 1.5.7

Используйте косую черту как значение для slug … 100% работает

 'rewrite' => array( 'slug' => '/', 'with_front' => FALSE ),