Intereting Posts
Показывать the_content при нажатии jquery Не удается сохранить значение ajax для базы данных Сохранение категории до публикации, до публикации публикации Могу ли я создать каталог для моего URL-адреса, даже до того, как он перейдет от того, кто его владеет? Проблема пересоединения таксономии add_rewrite_rule не загружает правильную страницу и не получает переменные Как создать массив с порядком идентификаторов категорий тем, у кого есть последнее сообщение Многопроцессор WordPress не возвращается, как ожидалось Не-UTF-символы ломают RSS-канал Сортировка результатов поиска по таксономии Генетический фильтрующий изотоп портфеля Очень странное поведение, связанное с htaccess и настраиваемыми сообщениями и подстроками пользовательских сообщений (BUG?) Ошибка при добавлении метабоксов, но только при добавлении 3 с тем же обратным вызовом Крюк администратора на странице входа Использование глобальных переменных, дорогостоящих для PHP

Определить постоянные ссылки для настраиваемого типа сообщений по таксономии в WP 3.4

Я хочу создать канонические постоянные ссылки для продуктов и типов продуктов. У меня есть настраиваемые типы сообщений, и выработана таксономия, но я не знаю, можно ли определить постоянные ссылки с таксономиями. Так, например, мой рабочий процесс …

  1. Я создаю персонализированный тип сообщения, называемый продуктом .
  2. Затем я создаю пользовательскую таксономию для типов продуктов .
  3. Затем я добавляю тип продукта под названием «Стулья» и добавляю продукт под названием «Красный стул» в эту категорию.

Как только я создаю этот продукт, желаемая структура постоянной ссылки для просмотра этого продукта будет отформатирована так:>

http://shop.com/products/chairs/red-chair 

Возможно ли это в wordpress 3.4? Мета-поля в моем настраиваемом типе сообщений позволяют выбирать типы продуктов, определенные для моей пользовательской таксономии, и будет только один тип для каждого продукта.

Если это возможно, я также хотел бы включить в него всех родителей выбранной категории продуктов (например, если категория «стулья» была ребенком категории «гостиная» , структура permalink была бы следующей:

 http://shop.com/products/lounge/chairs/red-chair 

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

 /* Custom Post Type - Products ------- */ function products_init() { $args = array( 'public' => true, 'label' => 'Products' ); register_post_type( 'products', $args ); } add_action( 'init', 'products_init' ); /* Custom Taxonomy - Product Type ------- */ add_action( 'init', 'create_prodtype' ); function create_prodtype() { $labels = array( 'name' => _x( 'Product Type', 'products' ), 'singular_name' => _x( 'Product Category', 'product' ), 'search_items' => __( 'Search Product Types' ), 'all_items' => __( 'All Product Types' ), 'parent_item' => __( 'Products' ), 'parent_item_colon' => __( 'Products:' ), 'edit_item' => __( 'Edit Product Type' ), 'update_item' => __( 'Update Product Type' ), 'add_new_item' => __( 'Add New Product Type' ), 'new_item_name' => __( 'New Product Type' ), ); register_taxonomy( 'products', array('products'), array( 'rewrite' => array( 'slug' => 'products', 'hierarchical' => true ), 'with_front' => false, 'labels' => $labels )); } 

Решение

Я понял это с помощью этих сообщений Яна Фабри ->

https://wordpress.stackexchange.com/a/5478/10350 https://wordpress.stackexchange.com/a/22490/10350

Я настроил тип персонализированного сообщения следующим образом ->

  • Пользовательский тип сообщения (register_post_type) -> «продукт»
  • Таксономия (register_taxonomy) -> «тип продукта»

Внутренняя функция

Я переписываю структуру permalink, которая сохраняется в back-end, так что постоянная ссылка сохраняется, чтобы включить пользовательский тип таксономии – «тип продукта»,

 add_filter('post_type_link', 'product_type_permalink', 10, 4); function product_type_permalink($post_link, $post, $leavename, $sample) { //If is custom post type "product" if ($post->post_type == 'product') { // Get current post object global $post; // Get current value from custom taxonomy "product-type" $terms = get_the_terms($post->id, 'product-type'); // Define category from "slug" of taxonomy object $term = $terms[0]->slug; // Re-structure permalink with string replace to include taxonomy value and post name $permalink = str_replace('product/', 'product/' . $term . '/', $post_link); } return $permalink; } 

Установите для параметра постоянной ссылки значение «Отправить имя» и сохраните. Если вы добавляете продукт в категорию и сохраняете, он должен переписать постоянную ссылку, чтобы включить определение таксономии, в данном случае – «тип продукта». Поэтому, если вы добавите «Красный стул» в категорию «Стулья» , URL-адрес будет отформатирован следующим образом ->

 http://website.com/product/chairs/red-chair/ 

Но если вы попытаетесь перейти на эту страницу, вы получите ошибку 404. Это связано с тем, что wordpress пока не знает, как запросить базу данных с этим URL-адресом, поэтому вам нужно написать ее.

Фронтальная функция

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

 add_rewrite_rule( // The regex to match the incoming URL 'product/([^/]+)/([^/]+)/?', // The resulting internal URL: `index.php` because we still use WordPress // `pagename` because we use this WordPress page // `designer_slug` because we assign the first captured regex part to this variable 'index.php?product-type=$matches[1]&product=$matches[2]', // This is a rather specific URL, so we add it to the top of the list // Otherwise, the "catch-all" rules at the bottom (for pages and attachments) will "win" 'top' ); 

В этой функции массив совпадений определяется WordPress, вставляя данную строку при каждой косой чертой. Таким образом, в этом примере регулярное выражение ([^/]+) используется для сопоставления между каждой косой чертой. В этом примере есть 2 уровня, поэтому он соответствует типу продукта, затем произведению, и добавляет их в массив совпадений, где product-type = $ соответствует 1 , а product = $ соответствует 2 .

Это правило перезаписи переводит это ->

 product/chairs/red-chair/ 

В этом ->

 index.php?product-type=chair&product=red-chair 

Что наша база данных может использовать для запроса базы данных и возврата правильной страницы продукта с форматированной постоянной ссылкой.

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

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

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

нижняя сторона

В настоящее время это займет только один уровень таксономии, поэтому структура пользовательской таксономии не может быть иерархической. Если вы укажете более одной таксономии, она будет использовать самую первую с первым идентификатором, чтобы определить постоянную ссылку. Потенциальным обходным путем для этого является скрыть пользовательское меню таксономии, которое появляется в боковой панели пользовательских типов сообщений, и добавить мета-поле для таксономии, где можно использовать только поле выбора. Для этого я использую плагин Meta Box . (nb, этот плагин не имеет никаких меню администратора, он позволяет вам писать мета-поля для пользовательских типов сообщений в ваших функциях.php, просто создавая массивы – настоятельно рекомендуется!)