Intereting Posts
Планируемое событие WordPress не работает Изменить классы выравнивания для изображений Программное обеспечение для WordPress Theme и разработки плагинов? Как сделать shortcode, чтобы скрыть выбор текста из сообщения или страницы? Как повернуть изображение заголовка в день? Одновременное обновление администратора приводит к тому, что настраиваемые поля не обновляются где хранить некоторые флаги для темы Как правильно экспортировать / импортировать базу данных WordPress (MySQL) через командную строку? Post Format Archive имя шаблона для папки темы? флажки с меткой «ящик» из цикла не будут сохраняться Тема WordPress с несколькими цветовыми схемами Thickbox больше не работает на интерфейсе, изменился код в WP3.3 beta 3? Пользовательская высота / ширина для толстого ящика в WP Backend Проблема с параметрами wp_get_attachment_image () и SVG Можно ли перечислить вложения в конце конечной точки под URL с помощью специального шаблона?

Как добавить несколько таксономий в URL?

Несколько таксономий в URL-адресе

Как добавить несколько таксономий к URL-адресу, имеющему следующее:

  • Тип сообщения: продукты
  • Таксономия: product_type
  • Таксономия: product_brand

Добавление нового продукта и выбор типа и бренда для данного продукта:

При добавлении нового продукта есть два блока таксономии (product_type и product_brand). Назовем этот новый тестовый продукт 1 . Первое, что мы хотим сделать, это отметить, какой тип продукта я имею в виду, скажем, сотовые телефоны . Затем я хочу отметить, к какому бренду принадлежит продукт, скажем, samsung.

Теперь « тестовый продукт 1 » связан с типом «сотовые телефоны» и брендом «samsung» .

Желаемый конечный результат:

/продукты
»Просмотреть все публикации пользователя

/ продукты / Мобильные телефоны
»Просмотреть все пользовательские сообщения с сотовыми телефонами таксономии

/ продукта / сотовые телефоны / Samsung /
»Посмотреть все пользовательские сообщения, где таксономия – сотовые телефоны И samsung

/ продукция / сотовые телефоны / Samsung / Тест-продукт-1
»Просмотр продукта (отдельный пользовательский пост)

Вопрос

Как можно сделать это возможным? Моя первоначальная мысль заключалась в использовании одной таксономии, имеющей «сотовые телефоны» в качестве родительского термина «samsung» . Фактически добавление таксономии и ее условий было не столь жестким. Но это привело к множеству других проблем, некоторые из которых были известны, некоторые – не так много. Во всяком случае, это не работает так, как это дает 404 вопросов, и WP не позволит некоторые вещи.
WP.org »шаблон таксономии-архива

Это привело меня к тому, чтобы переосмыслить структуру, вынудив оставить таксономии и ее термины, и я подумал; почему бы не создать вторую таксономию и связать с ней тип сообщения и добавить это к URL-адресу?

Хороший вопрос, но как?

Solutions Collecting From Web of "Как добавить несколько таксономий в URL?"

Это, безусловно, возможно, используя некоторые правила перезаписи в некоторой степени. API WP_Rewrite предоставляет функции, которые позволяют добавлять правила перезаписи (или «карты») для преобразования запроса в запрос.

Есть предпосылки для написания хороших правил перезаписи, а главное – основное понимание регулярных выражений. Механизм WordPress Rewrite использует регулярные выражения для перевода частей URL-адреса в запросы для получения сообщений.

Это короткий и хороший учебник по PHP PCRE (совместимые с Perl регулярные выражения).

Итак, вы добавили две таксономии, давайте предположим, что их имена:

  • Тип продукта
  • product_brand

Мы можем использовать их в таких запросах:

get_posts( array( 'product_type' => 'cell-phones', 'product_brand' => 'samsung' ) ); 

Запрос будет ?product_type=cell-phones&product_brand=samsung . Если вы наберете этот запрос, вы получите список телефонов Samsung. Чтобы переписать /cell-phones/samsung в этот запрос, необходимо добавить правило перезаписи.

add_rewrite_rule() сделает это за вас. Вот пример того, как может выглядеть ваше правило перезаписи для вышеуказанного случая:

 add_rewrite_rule( '^products/([^/]*)/([^/]*)/?', 'index.php?product_type=$matches[1]&product_brand=$matches[2]', 'top' ); 

Вам нужно будет flush_rewrite_rules() как только вы добавите правило перезаписи, чтобы сохранить его в базе данных. Это делается только один раз, нет необходимости делать это с каждым запросом, как только правило будет очищено от него. Чтобы удалить его, просто выполните сброс без добавления правила перезаписи.

Если вы хотите добавить разбивку на страницы, вы можете сделать это, выполнив что-то вроде:

 add_rewrite_rule( '^products/([^/]*)/([^/]*)/(\d*)?', 'index.php?product_type=$matches[1]&product_brand=$matches[2]&p=$matches[3]', 'top' ); 

Конечный результат

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

 /** * Changes the permalink setting <:> post_type_link * Functions by looking for %product-type% and %product-brands% in the URL * * products_type_link(): returns the converted url after inserting tags * * products_add_rewrite_rules(): creates the post type, taxonomies and applies the rewrites rules to the url * * * Setting: [ produkter / %product-type% / %product-brand% / %postname% ] * Is actually: [ post-type / taxonomy / taxonomy / postname ] * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Desired result: [ products / cellphones / apple / iphone-4 ] */ // Add the actual filter add_filter('post_type_link', 'products_type_link', 1, 3); function products_type_link($url, $post = null, $leavename = false) { // products only if ($post->post_type != 'products') { return $url; } // Post ID $post_id = $post->ID; /** * URL tag <:> %product-type% */ $taxonomy = 'product-type'; $taxonomy_tag = '%' . $taxonomy . '%'; // Check if taxonomy exists in the url if (strpos($taxonomy_tag, $url) <= 0) { // Get the terms $terms = wp_get_post_terms($post_id, $taxonomy); if (is_array($terms) && sizeof($terms) > 0) { $category = $terms[0]; } // replace taxonomy tag with the term slug » /products/%product-type%/productname $url = str_replace($taxonomy_tag, $category->slug, $url); } /** * URL tag <:> %product-brand% */ $brand = 'product-brand'; $brand_tag = '%' . $brand . '%'; // Check if taxonomy exists in the url if (strpos($brand_tag, $url) < 0) { return $url; } else { $brand_terms = wp_get_post_terms($post_id, $brand); } if (is_array($brand_terms) && sizeof($brand_terms) > 0) { $brand_category = $brand_terms[0]; } // replace brand tag with the term slug and return complete url » /products/%product-type%/%product-brand%/productname return str_replace($brand_tag, $brand_category->slug, $url); } function products_add_rewrite_rules() { global $wp_rewrite; global $wp_query; /** * Post Type <:> products */ // Product labels $product_labels = array ( 'name' => 'Products', 'singular_name' => 'product', 'menu_name' => 'Products', 'add_new' => 'Add product', 'add_new_item' => 'Add New product', 'edit' => 'Edit', 'edit_item' => 'Edit product', 'new_item' => 'New product', 'view' => 'View product', 'view_item' => 'View product', 'search_items' => 'Search Products', 'not_found' => 'No Products Found', 'not_found_in_trash' => 'No Products Found in Trash', 'parent' => 'Parent product' ); // Register the post type register_post_type('products', array( 'label' => 'Products', 'labels' => $product_labels, 'description' => '', 'public' => true, 'show_ui' => true, 'show_in_menu' => true, 'capability_type' => 'post', 'hierarchical' => true, 'rewrite' => array('slug' => 'products'), 'query_var' => true, 'has_archive' => true, 'menu_position' => 5, 'supports' => array( 'title', 'editor', 'excerpt', 'trackbacks', 'revisions', 'thumbnail', 'author' ) ) ); /** * Taxonomy <:> product-type */ register_taxonomy('product-type', 'products', array( 'hierarchical' => true, 'label' => 'Product Types', 'show_ui' => true, 'query_var' => true, 'rewrite' => array('slug' => 'products/types'), 'singular_label' => 'Product Types') ); /** * Taxonomy <:> product-type */ register_taxonomy('product-brand', 'products', array( 'hierarchical' => true, 'label' => 'Product Brands', 'show_ui' => true, 'query_var' => true, 'rewrite' => array('slug' => 'product/brands'), 'singular_label' => 'Product Brands') ); $wp_rewrite->extra_permastructs['products'][0] = "/products/%product-type%/%product-brand%/%products%"; // flush the rules flush_rewrite_rules(); } // rewrite at init add_action('init', 'products_add_rewrite_rules'); 

Некоторые мысли:

Это работает. Хотя вы «обязаны» назначать обе таксомии для каждого сообщения, или URL-адрес будет иметь конечный '/' » '/products/taxonomy//postname' . Поскольку я собираюсь назначить обе таксономии всем своим прокутам, имея тип и бренд, этот код, похоже, работает для моих нужд. Если у кого-то есть предложения или улучшения, не стесняйтесь отвечать!

Проверьте этот путь, у него все еще есть некоторые ошибки с брендом-архивом

http://pastebin.com/t8SxbDJy

 add_filter('post_type_link', 'products_type_link', 1, 3); function products_type_link($url, $post = null, $leavename = false) { // products only if ($post->post_type != self::CUSTOM_TYPE_NAME) { return $url; } $post_id = $post->ID; $taxonomy = 'product_type'; $taxonomy_tag = '%' . $taxonomy . '%'; // Check if exists the product type tag if (strpos($taxonomy_tag, $url) < 0) { // replace taxonomy tag with the term slug: /products/%product_type%/samsumng/productname $url = str_replace($taxonomy_tag, '', $url); } else { // Get the terms $terms = wp_get_post_terms($post_id, $taxonomy); if (is_array($terms) && sizeof($terms) > 0) { $category = $terms[0]; // replace taxonomy tag with the term slug: /products/%product_type%/samsumng/productname $url = str_replace($taxonomy_tag, $category->slug, $url); } } /* * Brand tags */ $brand = 'product_brand'; $brand_tag = '%' . $brand . '%'; // Check if exists the brand tag if (strpos($brand_tag, $url) < 0) { return str_replace($brand_tag, '', $url); } $brand_terms = wp_get_post_terms($post_id, $brand); if (is_array($brand_terms) && sizeof($brand_terms) > 0) { $brand_category = $brand_terms[0]; } // replace brand tag with the term slug: /products/cell-phone/%product_brand%/productname return str_replace($brand_tag, $brand_category->slug, $url); } function products_add_rewrite_rules() { global $wp_rewrite; global $wp_query; register_post_type('products', array( 'label' => 'Products', 'description' => 'GVS products and services.', 'public' => true, 'show_ui' => true, 'show_in_menu' => true, 'capability_type' => 'post', 'hierarchical' => true, 'rewrite' => array('slug' => 'products'), 'query_var' => true, 'has_archive' => true, 'menu_position' => 6, 'supports' => array( 'title', 'editor', 'excerpt', 'trackbacks', 'revisions', 'thumbnail', 'author'), 'labels' => array ( 'name' => 'Products', 'singular_name' => 'product', 'menu_name' => 'Products', 'add_new' => 'Add product', 'add_new_item' => 'Add New product', 'edit' => 'Edit', 'edit_item' => 'Edit product', 'new_item' => 'New product', 'view' => 'View product', 'view_item' => 'View product', 'search_items' => 'Search Products', 'not_found' => 'No Products Found', 'not_found_in_trash' => 'No Products Found in Trash', 'parent' => 'Parent product'), ) ); register_taxonomy('product-categories', 'products', array( 'hierarchical' => true, 'label' => 'Product Categories', 'show_ui' => true, 'query_var' => true, 'rewrite' => array('slug' => 'products'), 'singular_label' => 'Product Category') ); $wp_rewrite->extra_permastructs['products'][0] = "/products/%product_type%/%product_brand%/%products%"; // product archive add_rewrite_rule("products/?$", 'index.php?post_type=products', 'top'); /* * Product brands */ add_rewrite_rule("products/([^/]+)/([^/]+)/?$", 'index.php?post_type=products&product_brand=$matches[2]', 'top'); add_rewrite_rule("products/([^/]+)/([^/]+)/page/([0-9]{1,})/?$", 'index.php?post_type=products&product_brand=$matches[2]&paged=$matches[3]', 'top'); /* * Product type archive */ add_rewrite_rule("products/([^/]+)/?$", 'index.php?post_type=products&product_type=$matches[1]', 'top'); add_rewrite_rule("products/([^/]+)/page/([0-9]{1,})/?$", 'index.php?post_type=products&product_type=$matches[1]&paged=$matches[1]', 'bottom'); // product type pagination // single product add_rewrite_rule("products/([^/]+)/([^/]+)/([^/]+)/?$", 'index.php?post_type=products&product_type=$matches[1]&product_brand=$matches[2]&products=$matches[3]', 'top'); flush_rewrite_rules(); 

}

 add_action('init', 'products_add_rewrite_rules'); 

В то время как не ваша точная структура URL-адреса, вы можете получить:

/продукты
»Просмотреть все публикации пользователя

/ продукты / тип / сотовые телефоны
»Просмотреть все пользовательские сообщения с сотовыми телефонами таксономии

/ продукты / тип / сотовые телефоны / бренд / Samsung
»Посмотреть все пользовательские сообщения, где таксономия – сотовые телефоны И samsung

/ бренд / Samsung
»Просмотреть все пользовательские сообщения, в которых таксономия является samsung

/ продукт / Тест-продукт-1
»Просмотр продукта (отдельный пользовательский пост)

без необходимости указывать пользовательские правила перезаписи.

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

 product_type taxonomy slug = products/type product custom_post_type slug = product product custom_post_type archive slug = products product_brand taxonomy slug = brand 

Затем вы можете зарегистрировать их в следующем порядке:

 register_taxonomy( 'products_type', 'products', array( 'label' => 'Product Type', 'labels' => $product_type_labels, 'public' => true, 'show_ui' => true, 'show_in_nav_menus' => true, 'args' => array( 'orderby' => 'term_order' ), 'rewrite' => array( 'slug' => 'products/type', 'with_front' => false ), 'has_archive' => true, 'query_var' => true, ) ); register_post_type('products', array( 'labels' =>$products_labels, 'singular_label' => __('Product'), 'public' => true, 'show_ui' => true, 'capability_type' => 'post', 'hierarchical' => false, 'rewrite' => array('slug' => 'product', 'with_front' => false ), 'has_archive' => 'products', 'supports' => array('title', 'editor', 'thumbnail', 'revisions','comments','excerpt'), )); register_taxonomy( 'products_brand', 'products', array( 'label' => 'Brand', 'labels' => $products_brand_labels, 'public' => true, 'show_ui' => true, 'show_in_nav_menus' => true, 'args' => array( 'orderby' => 'term_order' ), 'rewrite' => array( 'slug' => 'brand', 'with_front' => false ), 'has_archive' => true, 'query_var' => true, ) ); 

Если вам абсолютно необходим URL-адрес:

/ продукты / типа / сотовые телефоны / бренд / Samsung / Тест-продукт-1
»Просмотр продукта (отдельный пользовательский пост)

Тогда вам потребуется правило перезаписи примерно так:

  add_rewrite_rule( '/products/type/*/brand/*/([^/]+)/?', 'index.php?pagename='product/$matches[1]', 'top' ); 

UPDATE https://stackoverflow.com/questions/3861291/multiple-custom-permalink-structures-in-wordpress

Вот как вы правильно переопределяете один URL сообщения.

Установите для повторной записи значение false для настраиваемого типа сообщения. (Оставьте архив как есть), а затем, зарегистрировав таксономии и сообщения, также зарегистрируйте следующие правила перезаписи.

  'rewrite' => false global $wp_rewrite; $product_structure = '/%product_type%/%brand%/%product%'; $wp_rewrite->add_rewrite_tag("%product%", '([^/]+)', "product="); $wp_rewrite->add_permastruct('product', $product_structure, false); 

Затем фильтруйте post_type_link для создания желаемой структуры URL-адреса, что позволяет не учитывать значения таксономии. Изменив код из связанного сообщения, вы должны:

 function product_permalink($permalink, $post_id, $leavename){ $post = get_post($post_id); if( 'product' != $post->post_type ) return $permalink; $rewritecode = array( '%product_type%', '%brand%', $leavename? '' : '%postname%', $leavename? '' : '%pagename%', ); if('' != $permalink && !in_array($post->post_status, array('draft', 'pending', 'auto-draft'))){ if (strpos($permalink, '%product_type%') !== FALSE){ $terms = wp_get_object_terms($post->ID, 'product_type'); if (!is_wp_error($terms) && !empty($terms) && is_object($terms[0])) $product_type = $terms[0]->slug; else $product_type = 'unassigned-artist'; } if (strpos($permalink, '%brand%') !== FALSE){ $terms = wp_get_object_terms($post->ID, 'brand'); if (!is_wp_error($terms) && !empty($terms) && is_object($terms[0])) $brand = $terms[0]->slug; else $brand = 'unassigned-brand'; } $rewritereplace = array( $product_type, $brand, $post->post_name, $post->post_name, ); $permalink = str_replace($rewritecode, $rewritereplace, $permalink); } return $permalink; } add_filter('post_type_link', 'product_permalink', 10, 3); 

Теперь мне просто нужно выяснить, как переписать URL-адрес таксономии бренда без основного тега бренда, и я должен точно соответствовать вашему желаемому URL.