Как включить иерархические постоянные ссылки для иерархических таксономий


Если у вас есть категория "срок" и подкатегория "промежуточные", вы можете получить доступ к промежуточным публикациям в /cat/subcat. Но это не работает из коробки с пользовательскими таксономиями. Они доступны по адресу /таксономия/промежуточный, но не /таксономия/термин/промежуточный.

Они обсудили это в профиле Wordpress (http://core.trac.wordpress.org/ticket/12659 ), и это похоже на выглядит, как будто у них есть решение, но, поскольку я никогда не использовал Trac и не полностью понимая его язык (различия и т.д.), Мне нужен кто-то более опытный, чтобы на самом деле рассказать мне, как это реализовать. Есть ли там код, который я должен вставить в основные файлы Wordpress? Это уже реализовано, и я могу что-то добавить в свою тему functions.php ?

Если возможно, я бы предпочел не изменять какие-либо основные файлы. Помогите!

Author: supertrue, 2011-05-15

4 answers

Это реализовано в WordPress с версии 3.1.

Когда вы регистрируете свою таксономию, убедитесь, что для параметра rewrite hierarchical установлено значение true, а также для самой таксономии:

<?php
register_taxonomy('genre',array('book'), array(
'hierarchical' => true, // this makes it hierarchical in the UI
'labels' => $labels,
'show_ui' => true,
'query_var' => true,
'rewrite' => array( 'hierarchical' => true ), // this makes hierarchical URLs
));
 8
Author: Milo, 2011-05-15 22:52:39

Есть ли способ добавить параметр в уже зарегистрированную пользовательскую таксономию? Все мои таксономии были построены с помощью плагина, поэтому было бы неплохо, если бы я мог что-то добавить в functions.php это просто добавило бы "перезапись" => массив ("иерархический" => true) к этим таксономиям.

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

Http://core.trac.wordpress.org/browser/tags/3.4.2/wp-includes/taxonomy.php#L305

ПРЕДУПРЕЖДЕНИЕ: Непроверенный код!
(В основном, просто с моей головы. Я не несу ответственности за неработающие сайты.):

function reregister_taxonomy() {
    # the post types that the taxonomy is registered to
    $post_types = array('post');
    # set this to the taxonomy name
    $tax_name = 'TAXONOMY_NAME_TO_CHANGE';
    # load the already created taxonomy as array so we can
    # pass it back in as $args to register_taxonomy
    $tax = (array)get_taxonomy($tax_name);

    if ($tax) {
        # adjust the hierarchical necessities
        $tax['hierarchical'] = true;
        $tax['rewrite']['hierarchical'] = true;

        # adjust the hierarchical niceties (these could be ignored)
        $tax['labels']['parent_item'] = sprintf(__("Parent %s"),
            $tax->labels->singular_name);
        $tax['labels']['parent_item_colon'] = sprintf(__("Parent %s:"),
            $tax->labels->singular_name);

        # cast caps to array as expected by register_taxonomy
        $tax['capabilities'] = (array)$tax['cap'];
        # cast labels to array
        $tax['labels'] = (array)$tax['labels'];
        # register the taxonomy with our new settings
        register_taxonomy($tax_name, array('post'), $tax);
    }
}
# init action with a late priority so other taxonomies are loaded
# alternatively could be done with the `registered_taxonomy` action hook
add_action('init', 'reregister_taxonomy', 9999);

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

 2
Author: totels, 2012-11-08 22:50:42

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

function keha_add_rewrite_rules() {
        add_rewrite_rule( '^posttype_slug/(.+?)/(.+?)/(.+?)$', 'index.php?taxonomy=$matches[1]&taxonomy=$matches[2]&posttype=$matches[3]', 'top' );
        add_rewrite_rule( '^posttype_slug/(.+?)/(.+?)/$', 'index.php?posttype=$matches[2]', 'top' );
        add_rewrite_rule( '^posttype_slug/(.+?)/(.+?)/(.+?)$', 'index.php?posttype=$matches[3]', 'top' );
        add_rewrite_rule( '^posttype_slug/(.+?)/(.+?)/?$', 'index.php?taxonomy=$matches[2]', 'top' );
        add_rewrite_rule( '^posttype_slug/(.+?)$', 'index.php?taxonomy=$matches[1]', 'top' );
}
add_action('init', 'keha_add_rewrite_rules');

Посмотрите мой рабочий пример на Github:

Https://github.com/keha76/WordPress-CPT-Hierarchical-Taxonomy-Permalinks

 2
Author: keha76, 2013-09-22 17:49:26

Благодаря @anubhava

Небольшое исследование о API перезаписи WP найдите решение.

1) Я создал пользовательский URL-адрес для перезаписи и поместил его в свой functions.php

function services_rewrite_basic() {
  add_rewrite_rule('^services/.*', 'index.php?page_id=110&level=$matches[1]&level=$matches[1]&level=$matches[1]', 'top');
}
add_action('init', 'services_rewrite_basic');

2) И, наконец, просто сохранил страницу с пермлинком без каких-либо изменений, и это делает свое дело.

 0
Author: Fury, 2019-11-29 11:40:48