web-dev-qa-db-ja.com

カスタム投稿タイプに.html拡張子を追加する

実用的な解決策を見つけることができました 私の質問は問題はそれが中和するということです別の関数 カスタム投稿タイプの固定リンクにカテゴリの基礎を追加するどうにかしてそれらをマージする必要があります。どのようにしますか。

これは、カスタム投稿タイプに.html拡張子を追加するコードです。

//Create the rewrite rules like post-type/post-name.html
add_action( 'rewrite_rules_array', 'rewrite_rules' );
function rewrite_rules( $rules ) {
    $new_rules = array();
    foreach ( get_post_types() as $t )
        $new_rules[ $t . '/([^/]+)\.html$' ] = 'index.php?post_type=' . $t . '&name=$matches[1]';
    return $new_rules + $rules;
}

//Format the new permalink structure for these post types.
add_filter( 'post_type_link', 'custom_post_permalink' ); // for cpt post_type_link (rather than post_link)
function custom_post_permalink ( $post_link ) {
    global $post;
    $type = get_post_type( $post->ID );
    return home_url( $type . '/' . $post->post_name . '.html' );
}

//And then stop redirecting the canonical URLs to remove the trailing slash.
add_filter( 'redirect_canonical', '__return_false' );

これはカテゴリベースをcourcesカスタム投稿タイプに追加するコードです( 同様の解決策 、および another を参照)。

//Change your rewrite to add the course query var:
'rewrite' => array('slug' => 'courses/%course%')

//Then filter post_type_link to insert the selected course into the permalink:
function wpa_course_post_link( $post_link, $id = 0 ){
    $post = get_post($id);  
    if ( is_object( $post ) ){
        $terms = wp_get_object_terms( $post->ID, 'course' );
        if( $terms ){
            return str_replace( '%course%' , $terms[0]->slug , $post_link );
        }
    }
    return $post_link;  
}
add_filter( 'post_type_link', 'wpa_course_post_link', 1, 3 );
3
Iurie Malai

これらの関数を取り、英語に言い換えて、実行した順番に並べてみましょう。この回答では意図的にPHPを使用しないようにしますが、PHPの基本的な理解が必要になります。

When the `post_type_link` filter runs: // the add_action calls
    run: `wpa_course_post_link` as it has priority 3 // function wpa_course_post_link(....
        if the object is a post
            and that post has a course term
                search for %course% in the URL string and replace it
    Then, run `custom_post_permalink` as it has priority 10: // function custom_post_permalink(...
        Ignore the URL we got given and construct a brand new one by returning the post_type + "/" + posts name + ".html"

だからcustom_post_permalinkはあなたが思ったようにあなたのURLの最後に.htmlを付け加えません、それは全く新しいURLを作成します。優先度を3から11に変更した場合、.html URLは機能しますが、コースURLは%course%が置き換えられたときと異なります。

幸いなことに、wpa_course_post_link関数は、これを行う方法のためのはるかに優れたテンプレートを提供します。コースの用語を取得して文字列を置換することに興味があるので、$post_link文字列の最後に.htmlを追加して返します。

それで、代わりにそれを普通の英語で擬似コードとして書き出すならば、我々はこれを得るかもしれません:

When the `post_type_link` filter runs:
    run: `wpa_course_post_link` as it has priority 3
        if the object is a post, then:
            if that post has a course term then:
                search for %course% in the URL string and replace it
            then add ".html" to the end

私は読者の仕事としてPHPへの変換を任せています。必要なすべてのPHPはすでに質問で利用可能です。

4
Tom J Nowell

@ tom-j-nowell の助けを借りて私は実用的な解決策を持っています。まだ完璧ではないと思いますが、うまくいきます。

//When your create a custom post type change your rewrite to:
'rewrite' => array('slug' => 'courses/%course_category%')

//Then filter post_type_link to insert the category of selected course into the permalink:
function wpa_course_post_link( $post_link, $id = 0 ){
    $post = get_post($id);
    if ( is_object( $post ) ){
        $terms = wp_get_object_terms( $post->ID, 'course_category' );
        if( $terms ){
            $post_link = str_replace( '%course_category%' , $terms[0]->slug , $post_link );
            //and add the .html extension to the returned post link:
            return $post_link . '.html';
        }
    }
    return $post_link;  
}
add_filter( 'post_type_link', 'wpa_course_post_link', 1, 3 );

//Then create the rewrite rules for the post-type/post-category/post-name.html permalink structure:
add_action( 'rewrite_rules_array', 'rewrite_rules' );
function rewrite_rules( $rules ) {
    $new_rules = array();
    $new_rules[ 'courses/([^/]+)/(.+)\.html$' ] = 'index.php?courses=$matches[2]';
    return $new_rules + $rules;
}
2
Iurie Malai