web-dev-qa-db-ja.com

WP 書き換え規則 - カスタム投稿の種類と分類法

私はこれを理解しようとして数日間壁に向かって頭を叩いてきました。カスタムの投稿タイプとカスタムの分類法があり、URLを機能させることができます。

これが私が目指しているURLの構造です:http://url.dev/custom-post-type/taxonomy/post-name/

最初の2つの部分は機能しています。私はちょうどcustom-post-typeに行くことができ、それは私の archive-custom-post-type.php fileを使います。私はまた/custom-post-type/taxonomyに行くことができ、それは私の taxonomy-name.php を使用します。

ただし、実際の投稿に移動しようとすると、404エラーページが表示されます。 Rewrite Analyzer プラグインを使用していますが、書き換え規則が正しいようです。これがいくつかのスクリーンショットです。

enter image description here

enter image description here

それは正しく見えます、それが起こる必要があるものです。しかし、単一の製品ページの1つに移動しようとすると404エラーが発生します。

これが私のfunctions.phpでの私の実際の書き換え規則です。

function taxonomy_slug_rewrite($wp_rewrite) {
    $rules = array();
    // get all custom taxonomies
    $taxonomies = get_taxonomies(array('_builtin' => false), 'objects');
    // get all custom post types
    $post_types = get_post_types(array('public' => true, '_builtin' => false), 'objects');

    foreach ($post_types as $post_type) {
        foreach ($taxonomies as $taxonomy) {

            // go through all post types which this taxonomy is assigned to
            foreach ($taxonomy->object_type as $object_type) {

                // check if taxonomy is registered for this custom type
                if ($object_type == $post_type->rewrite['slug']) {

                    // get category objects
                    $terms = get_categories(array('type' => $object_type, 'taxonomy' => $taxonomy->name, 'hide_empty' => 0));

                    // make rules
                    foreach ($terms as $term) {
                        $rules[$object_type . '/' . $term->slug . '/([^/]*)/?'] = 'index.php?pagename=$matches[1]&' . $term->taxonomy . '=' . $term->slug;
                    }
                }
            }
        }
    }
    // merge with global rules
    $wp_rewrite->rules = $rules + $wp_rewrite->rules;
}
add_filter('generate_rewrite_rules', 'taxonomy_slug_rewrite');

私が間違っていることはありますか?

私がパーマリンクをデフォルトに戻すならば、私は行くことができます: http://uss.local/?超音波機器= sequoia-512と機器メーカー= acuson そしてそれはちょうどうまく働きます。しかし、私が "Post Name"パーマリンクに切り替えると、うまくいきません。

2
Drew

投稿タイプと分類法を登録するときに、rewrite引数を使用してすべての用語にルールを追加しなくてもこれを実現できます。あなたが必要とする唯一の余分な規則は分類学のためのページ付けを扱うことです。

まず投稿タイプを登録します。投稿タイプと分類法を登録する順序は重要です。重要な部分に焦点を当てるために、ほとんどの引数を省略しました。

$args = array(
    'has_archive' => 'custom-type',
    'rewrite' => array(
        'slug' => 'custom-type/%custom-tax%',
        'with_front' => false
    )
);
register_post_type( 'custom-type', $args );

それから分類法を登録します。

$args = array(
    'rewrite' => array(
        'slug' => 'custom-type',
        'with_front' => false
    )
);
register_taxonomy( 'custom-tax', array( 'custom-type' ), $args );

次に、分類のページ付けを処理するための書き換え規則を追加します。

function wpd_taxonomy_pagination_rewrites(){
    add_rewrite_rule(
        'custom-type/([^/]+)/page/([0-9]+)/?$',
        'index.php?custom-tax=$matches[1]&paged=$matches[2]',
        'top'
    );
}
add_action( 'init', 'wpd_taxonomy_pagination_rewrites' );

パーマリンクで選択した用語を取得するには、post_type_linkをフィルタリングします。

function wpd_post_link( $post_link, $id = 0 ){
    $post = get_post($id);  
    if ( is_object( $post ) && $post->post_type == 'custom-type' ){
        $terms = wp_get_object_terms( $post->ID, 'custom-tax' );
        if( $terms ){
            foreach( $terms as $term ){
                if( 0 == $term->parent ){
                    return str_replace( '%custom-tax%' , $term->slug , $post_link );
                }
            }
        } else {
            return str_replace( '%custom-tax%' , 'uncategorized', $post_link );
        }
    }
    return $post_link;
}
add_filter( 'post_type_link', 'wpd_post_link', 1, 3 );
3
Milo