Intereting Posts
Миниатюра Изображение, чтобы пойти в сообщении, а также Функции the_password_form не работают вместе Отображение разбиения на страницы не отображается в пользовательском терминологическом архиве Шрифт базы данных WordPress / Сортировка Как получить значение метабокса в wp_query ключ meta_query Использование jquery с wordpress с использованием wp_enqueue_scripts Панель поиска в тезисе WordPress Site Как заблокировать кого-то из комментариев? Настроить изображение для нескольких сообщений Как получить события, используя несколько настраиваемых мета-полей? Пользовательские типы сообщений, переписывание URL-адресов на нескольких CPT Могу ли я создать таблицу на моей БД без создания плагина? Получение пользовательского изображения типа post с помощью 'get_post_custom' Настроить элемент управления не показывает значение настройки, которое было добавлено через JS API Настройки WordPress, потерянные после миграции сайта

Пользовательские типы сообщений и независимые категории – сложная таксономия

Входные данные:

  1. Существует тип персонализированного сообщения, в котором Companies позиции Companies , относящихся к категории Company ;
  2. Существует тип персонализированного сообщения с Products которые привязаны к Items -> Item-type категориям Items -> Item-type ;
  3. Существует тип персонализированного сообщения, со Articles которые связаны с категорией Articles ;

Подводя итог, структура выглядит следующим образом:

 + Companies (cat) |- Company-1 (post) `- Company-2 + Items (cat) `- Item-type-1 (cat) | |- Product-1-1 (post) | `- Product-1-2 `- Item-type-2 (cat) |- Product-2-1 (post) `- Product-2-2 + Articles (cat) |- Article-1 (post) `- Article-2 

Проблема:

Я буду признателен за способ реализации структуры, к которой можно получить доступ, например:

 http://example.com/company-1/items/item-type-1/product-1 http://examplecom/company-2/items/item-type-1/product-1 //(note that both company 1 and 2 can produce a similar product) http://example.com/company-1/articles/article-1-1 http://example.com/company-2/articles/article-2-1 

В обоих продуктах и ​​статьях есть настраиваемые поля, в которых хранятся идентификаторы компаний, к которым они привязаны.

ОБНОВИТЬ:

Я думал о его разработке с помощью пользовательских таксономий:

 http://example.com/post-type-company/taxonomy-item/term-item-type/product 

Можете ли вы посоветовать более подходящий способ?

Solutions Collecting From Web of "Пользовательские типы сообщений и независимые категории – сложная таксономия"

В wordpress slug (post name) уникален для каждого типа сообщений.

Таким образом, URL-адрес /company-1/items/item-type-1/product-1 и один, например /company-2/items/item-type-1/product-1 где product-1 – это имя, не может адрес на 2 разных продукта.

Если вы создадите 2 продукта с таким же названием, WordPress при сохранении установит уникальный слизень.

То же самое касается статей.

По этой причине в URL-адресе:

 http://example.com/company-1/items/item-type-1/product-1 

можно просто переписать в

 http://example.com/index.php?post_type=products&name=product-1 

и URL-адрес:

 http://example.com/company-1/articles/article-1-1 

можно просто переписать в

 http://example.com/index.php?post_type=articles&name=article-1-1 

Итак, как вы можете видеть, независимо от категории.

Вам нужно всего 2 правила перезаписи:

 add_action('init','my_rewrite_rules'); function my_rewrite_rules() { add_rewrite_rule( '[^/]+/items/[^/]+/(.+)/?$' , 'index.php?post_type=products&name=$matches[1]' , 'top' ); add_rewrite_rule( '[^/]+/articles/(.+)/?$' , 'index.php?post_type=articles&name=$matches[1]' , 'top' ); } 

После этого вам нужно сбросить правила перезаписи, перейдя в раздел Настройки-> Постоянная ссылка на ваш сервер и сохранив изменения.

Теперь URL-адреса работают так, как вы ожидаете, если их вручную записать в браузере, но проблема заключается в генерации правильного URL- the_permalink с использованием функции the_permalink . Вы должны использовать фильтр post_link и генерировать правильный URL-адрес:

 add_filter('post_link', 'my_custom_permalink', 99, 3); function my_custom_permalink($permalink, $post, $leavename) { if ( $post->post_type == 'products' ) return products_permalink($permalink, $post, $leavename); if ( $post->post_type == 'articles' ) return articles_permalink($permalink, $post, $leavename); return $permalink; } function products_permalink($permalink, $post, $leavename) { if ( $post->post_type != 'products' ) return $permalink; $cats = get_the_category( $post->ID ); $companies = get_term_by('slug', 'companies', 'category'); $items= get_term_by('slug', 'items', 'category'); if ( empty($cats) || empty($companies) || empty($items) ) return $permalink; $item = ''; $company = ''; while ( ! empty($cats) ) { if ( $item && $company ) return home_url() . '/' . $company . '/items/' . $item . '/' . $post->name; $cat = array_pop($cats); if ( $cat->parent == $companies->term_id ) $company = $cat->slug; if ( $cat->parent == $items->term_id ) $item = $cat->slug; } return $permalink; } function articles_permalink($permalink, $post, $leavename) { if ( $post->post_type != 'articles' ) return $permalink; $cats = get_the_category( $post->ID ); $companies = get_term_by('slug', 'companies', 'category'); if ( empty($cats) || empty($companies) ) return $permalink; $company = ''; while ( ! empty($cats) ) { if ( $company ) return home_url() . '/' . $company . '/articles/' . $post->name; $cat = array_pop($cats); if ( $cat->parent == $companies->term_id ) $company = $cat->slug; } return $permalink; } 

Здесь я предполагаю, что вы используете только стандартные категории, где категория «Компании» является родительской категорией для компаний, а «Элементы» являются родительской категорией для предметов.

Также предполагается, что cpt называются «продуктами» и «статьями» (обратите внимание на множественное число).

Ajust функции, если в вашей конфигурации что-то другое.