Intereting Posts
Выбор боковой панели из создания страницы Добавить пользовательские классы для привязки в wp_nav_menu Google Map iframe в выпуске вкладки Дата запроса в цепочке wordpress Что такое браузеры с поддержкой WordPress? Получать сообщения на основе заголовка соответствия тегам Как отключить или скрыть определенные темы в многопользовательском режиме? Как добавить ярлык Visual Edit к моду темы? Управление пользовательским столбцом добавить класс "num" Как перечислить сообщения определенного формата Когда использовать API файловой системы? Должен ли я использовать его вообще? Активировать плагин, который находится в подпапке? Я хочу получить родительский идентификатор, только на родительском -> дочернем -> дочернем как заставить WordPress отправлять комментарии на внешнюю страницу Shortcode в страницах или файлах tempate для пользовательского типа сообщения

Структура Permalink, не работающая с пользовательской таксономией (URL как ./taxonomy/category/postname)

Я хочу публиковать и организовывать проблемы с WordPress. Журнал структурирован в проблемы (например, Magazine № 23), категории (всегда одни и те же категории независимо от выпуска) и, наконец, сообщения.

Я хотел бы иметь следующую структуру URL example.com/issue-X/Y/Z с X для номера проблемы, Y для категории и Z для имени сообщения.


Мой код

Самый простой способ – использовать WordPress, встроенный Post Post Type и таксономию category . Я создал пользовательскую таксономию для проблем, названную magazine_issue и связанную с post :

 function jt_magazine_issue_taxonomy() { $labels = array( 'name' => _x('Numéros', 'Taxonomy General Name', 'twentysixteen'), 'singular_name' => _x('Numéro', 'Taxonomy Singular Name', 'twentysixteen'), 'menu_name' => __('Numéros', 'twentysixteen'), 'all_items' => __('Tous les numéros', 'twentysixteen'), 'parent_item' => __('Numéro parent', 'twentysixteen'), 'parent_item_colon' => __('Numéro parent :', 'twentysixteen'), 'new_item_name' => __('Nom', 'twentysixteen'), 'add_new_item' => __('Ajouter un nouveau numéro', 'twentysixteen'), 'edit_item' => __('Modifier le numéro', 'twentysixteen'), 'update_item' => __('Mettre à jour', 'twentysixteen'), 'view_item' => __('Voir le numéro', 'twentysixteen'), 'separate_items_with_commas' => __('Separate items with commas', 'twentysixteen'), 'add_or_remove_items' => __('Ajouter ou supprimer des numéros', 'twentysixteen'), 'choose_from_most_used' => __('Les plus utilisées', 'twentysixteen'), 'popular_items' => __('Numéros populaires', 'twentysixteen'), 'search_items' => __('Rechercher dans les numéros', 'twentysixteen'), 'not_found' => __('Aucun numéro trouvé', 'twentysixteen'), 'no_terms' => __('Aucun numéros', 'twentysixteen'), 'items_list' => __('Liste des numéros', 'twentysixteen'), 'items_list_navigation' => __('Items list navigation', 'twentysixteen'), ); $args = array( 'labels' => $labels, 'hierarchical' => true, 'public' => true, 'show_ui' => true, 'show_admin_column' => true, 'show_in_nav_menus' => true, 'show_tagcloud' => false, 'rewrite' => false, ); register_taxonomy('magazine_issue', array('post'), $args); } add_action('init', 'jt_magazine_issue_taxonomy', 0); 

Обратите внимание, что я установил свойство rewrite равным false .

Чтобы настроить собственную структуру URL-адресов, я использовал фильтр rewrite_rules_array :

 function jt_rewrite_rules($rules) { $newRules = array(); $newRules['issue-(.+)/(.+)/(.+)/?$'] = 'index.php?pagename=$matches[3]'; $newRules['issue-(.+)/(.+)/?$'] = 'index.php?category_name=$matches[2]'; $newRules['issue-(.+)/?$'] = 'index.php?magazine_issue=$matches[1]'; return array_merge($newRules, $rules); } add_filter('rewrite_rules_array', 'jt_rewrite_rules'); 

Затем я добавляю этот код для обработки %magazine_issue% при создании или обновлении сообщения:

 function jt_magazine_issue_permalink($permalink, $post_id, $leavename) { if (strpos($permalink, '%magazine_issue%') === FALSE) { return $permalink; } // Get post $post = get_post($post_id); if (!$post) { return $permalink; } // Get taxonomy terms $terms = wp_get_object_terms($post->ID, 'magazine_issue'); if (!is_wp_error($terms) && !empty($terms) && is_object($terms[0])) $taxonomy_slug = $terms[0]->slug; else $taxonomy_slug = 'inconnu'; return str_replace('%magazine_issue%', 'numero-'.$taxonomy_slug, $permalink); } add_filter('post_link', 'jt_magazine_issue_permalink', 10, 3); 

Структура permalink в бэкэнд WordPress устанавливается так:

/%magazine_issue%/%category%/%postname%/


Что работает

  • example.com/issue-X/ перенаправление в архив таксономии
  • example.com/issue-X/Y/ перенаправление на встроенный архив категорий WordPress

Что не работает

  • example.com/issue-X/Y/Z/ не перенаправляется на сообщение (single.php) => 404 error

Даже прямой вызов index.php?pagename=Z не удалось (ошибка 404).


Любые решения?

Спасибо и счастливые новые годы!

Гийом


Обновление (решение)

Благодаря Milo проблема «проблема» разрешена ( postname должно быть заменено name , которое является ключом для имени встроенного сообщения).

 $newRules['issue-(.+)/(.+)/(.+)/?$'] = 'index.php?name=$matches[3]';