web-dev-qa-db-ja.com

このパーマリンクを達成する方法 - >カテゴリ名/カスタムポストタイプ名/ポスト名

私は自分のサイトに構造を提供するためにカテゴリを使用しようとしています。私のサイトにはイングランド、ウェールズ、スコットランド、アイルランドというセクションを作成します。これらはカテゴリになります。私の投稿はカスタム投稿タイプを使用します - ビデオ、ガイド、イベント、クラブなど.

それで、私が「Video」CPTを使って「Trouble down south」という投稿を作成し、それを「England」カテゴリに添付するなら、スラッグフォーマットは以下のようになるでしょう:

カテゴリ名/カスタム投稿タイプ名/投稿名

mysite.com/england/video/trouble-down-south

私は以下のパーマリンクもそう働きたいと思います -

mysite.com/england/ - CPTに関係なくそのカテゴリのすべての投稿を表示

mysite.com/video/ - カテゴリに関係なくすべてのビデオCPT投稿を表示

私の例にしたがうと、私は私のように私のビデオCPTを作成します。

add_action( 'init', 'register_cpt_video' );

function register_cpt_video() {

    $labels = array( 
        'name' => _x( 'videos', 'video' ),

        some code...

    );

    $args = array( 

        some code...

        'taxonomies' => array( 'category' ),

        some code...

        'has_archive' => true,
        'rewrite' => array( 
            'slug' => 'video', 
            'with_front' => false,
            'feeds' => true,
            'pages' => true
        ),
        'capability_type' => 'post'
    );

    register_post_type( 'video', $args );
}

これはほとんど私が必要としていることです。私はで正しいリストを得ます

mysite.com/england(つまり、カテゴリアーカイブページ)

および

mysite.com/video(つまり、CPTアーカイブページ)

残念ながら、私が実際の投稿をクリックすると、スラッグは次のように表示されます。

mysite.com/video/trouble-down-south

をお願いします

mysite.com/england/video/trouble-down-south

私は次の書き換えスラグを使ってみました

'slug' => '%category%/video',

これは動作しません。 %category%は、実際のカテゴリ名に変換されずに文字列としてURLに挿入されます。

このサイトで解決策を検索しましたが、解決策が見つかりませんでした。ほとんどの関連する回答は、CPTスラッグへの追加分類法を取り上げているようです。

すなわち、mysite.com/video/england/trouble-down-south

彼らは、書き換え規則のカスケードのような性質を利用した分類書き換えスラグにCPT名を明示的に付加することでこれを達成しているようです(私は理解していない他のいくつかの魔法使い)。

とにかく、category-name/custom-post-type-name/post-name、およびアーカイブページの要件に対処したことが見つかったものはありません。必要です。

私の望むパーマリンク構造をどのようにして達成するかについてのアイデアはありますか?

2
bob

適切なパーマリンクを作成するために'post_type_link'をフィルタリングする必要があります。同様の例については、 この答え を参照してください。

次のコードは機能します。

add_action( 'init', array ( 'WPSE_63343', 'init' ) );

class WPSE_63343
{
    protected $post_type = 'video';

    public static function init()
    {
        new self;
    }

    public function __construct()
    {
        $args = array (
            'public' => TRUE,
            'rewrite' => array(
                'slug' => '[^/]+/' . $this->post_type .'/([^/]+)/?$'
            ),
            'has_archive' => TRUE,
            'supports' => array( 'title', 'editor' ),
            'taxonomies' => array( 'category' ),
            'labels' => array (
                'name' => 'Video',
                'singular_name' => 'Video'
            )
        );
        register_post_type( $this->post_type, $args );

        add_rewrite_rule(
            '[^/]+/' . $this->post_type .'/([^/]+)/?$',
            'index.php?post_type=' . $this->post_type . '&pagename=$matches[1]',
            'top'
        );

        // Inject our custom structure.
        add_filter( 'post_type_link', array ( $this, 'fix_permalink' ), 1, 2 );

        # uncomment for debugging
        # add_action( 'wp_footer', array ( $this, 'debug' ) );
    }

    /**
     * Print debug data into the 404 footer.
     *
     * @wp-hook wp_footer
     * @since   2012.09.04
     * @return  void
     */
    public function debug()
    {
        if ( ! is_404() )
        {
            return;
        }

        global $wp_rewrite, $wp_query;

        print '<pre>' . htmlspecialchars( print_r( $wp_rewrite, TRUE ) ) . '</pre>';
        print '<pre>' . htmlspecialchars( print_r( $wp_query, TRUE ) ) . '</pre>';
    }

    /**
     * Filter permalink construction.
     *
     * @wp-hook post_type_link
     * @param  string $post_link default link.
     * @param  int    $id Post ID
     * @return string
     */
    public function fix_permalink( $post_link, $id = 0 )
    {
        $post = &get_post( $id );
        if ( is_wp_error($post) || $post->post_type != $this->post_type )
        {
            return $post_link;
        }
        // preview
        empty ( $post->slug )
        and ! empty ( $post->post_title )
        and $post->slug = sanitize_title_with_dashes( $post->post_title );

        $cats = get_the_category( $post->ID );

        if ( ! is_array( $cats ) or ! isset ( $cats[0]->slug ) )
        {
            return $post_link;
        }

        return home_url(
            user_trailingslashit( $cats[0]->slug . '/' . $this->post_type . '/' . $post->slug )
        );
    }
}

保存されている書き換えルールを更新するには、一度パーマリンク設定にアクセスすることを忘れないでください。

4
fuxia
add_action( 'init', 'register_my_types' );
function register_my_types() {
    register_post_type( 'recipes',
        array(
            'labels' => array(
                'name' => __( 'Recipes' ),
                'singular_name' => __( 'Recipee' )
            ),
            'public' => true,
            'has_archive' => true,
        )
    );
    register_taxonomy( 'country', array( 'recipes' ), array( 
            'hierarchical' => true, 
            'label' => 'Country'
        )
    );
}
// Add our custom permastructures for custom taxonomy and post
add_action( 'wp_loaded', 'add_clinic_permastructure' );
function add_clinic_permastructure() {
    global $wp_rewrite;
    add_permastruct( 'country', 'recipes/%country%', false );
    add_permastruct( 'recipes', 'country/%country%/recipes/%recipes%', false );
}
// Make sure that all links on the site, include the related texonomy terms
add_filter( 'post_type_link', 'recipe_permalinks', 10, 2 );
function recipe_permalinks( $permalink, $post ) {
    if ( $post->post_type !== 'recipes' )
        return $permalink;
    $terms = get_the_terms( $post->ID, 'country' );

    if ( ! $terms )
        return str_replace( '%country%/', '', $permalink );
    //$post_terms = array();
    foreach ( $terms as $term )
        $post_terms = $term->slug;
    print_r($permalink);
    return str_replace( '%country%',  $post_terms , $permalink );
}
// Make sure that all term links include their parents in the permalinks
add_filter( 'term_link', 'add_term_parents_to_permalinks', 10, 2 );
function add_term_parents_to_permalinks( $permalink, $term ) {
    $term_parents = get_term_parents( $term );
    foreach ( $term_parents as $term_parent )
        $permlink = str_replace( $term->slug, $term_parent->slug . ',' . $term->slug, $permalink );
    return $permlink;
}
// Helper function to get all parents of a term
function get_term_parents( $term, &$parents = array() ) {
    $parent = get_term( $term->parent, $term->taxonomy );

    if ( is_wp_error( $parent ) )
        return $parents;

    $parents[] = $parent;
    if ( $parent->parent )
        get_term_parents( $parent, $parents );
    return $parents;
}

上記のコードをテーマfunction.phpファイルに貼り付け、パーマリンクオプション/%category/%postname%/ %を変更する

0
Ashish Sharma