web-dev-qa-db-ja.com

階層的分類法のための階層的パーマリンクを有効にする方法

"term"というカテゴリと "subterm"というサブカテゴリがある場合は、/ cat/subcatにあるサブタムの投稿にアクセスできます。しかし、これはカスタム分類法ではそのままでは機能しません。それらは/ taxonomy/subtermでアクセス可能ですが、/ taxonomy/term/subtermではアクセスできません。

彼らはWordpress Trac( http://core.trac.wordpress.org/ticket/12659 )でこれをやり遂げました、そしてそれは一種の ルックス 彼らが解決策を持っているようですが、私はTracを使ったことがなく、その言語(diffなど)を完全に理解していないので、これを実装する方法を実際に教えてもらうには、もっと経験豊富な人が必要です。 Wordpressのコアファイルに貼り付ける必要があるコードはありますか。これはすでに実装されていて、私のテーマのfunctions.phpに何か追加することができますか?

可能であれば、私はどんなコアファイルも変更しないことを望みます。助けて!

1
supertrue

これはWordPress 3.1で実装されました。

分類法を登録する の場合は、分類法だけでなくrewrite hierarchyを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
));
6
Milo

階層型パーマリンクを機能させるには、書き換え規則を追加する必要があります。私は、パーマリンクに反映されている親/子用語を使ったカスタム分類法を使ってカスタム投稿タイプを作るコードをいくつか組み立てることができました。完璧ではありませんが、うまくいっています。

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
keha76

すでに登録されているカスタム分類法にパラメータを追加する方法はありますか?私の分類法はすべてプラグインで構築されているので、それらの分類法に 'rewrite' => array( 'hierarchy' => true)を追加するだけの何かをfunctions.phpに追加できればいいでしょう。

あなたが影響を与えたい分類を再登録するために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);

これを書いた後で初めて、私はこの質問が1年半前のものであることに気付きました。

2
totels

@anubhavaに感謝

WP Rewrite APIについてのちょっとした研究 解決策を見つけてください。

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)そして最後に変更なしでpermlinkページを保存してください、そしてそれは流血トリックをします。

0
Fury