web-dev-qa-db-ja.com

URL書き換えベースに著者を追加

私のデザイナーのウェブサイトのためのナメクジとして著者を取得しようとしています。私はimがやろうとしていることの例を以下に挙げます。

私は、ニックネームが "designer-a"で "Designer A"という名前のデザイナーを持っています。 「Awesome Art」という名前のアートオブジェクト(カスタムポストタイプ)があり、「ニースネーム」は「awesome-art」です。

アートオブジェクトのURLが「 http://domain.com/designer-a/awesome-art/ 」になるようにします。

これを達成するために、私は以下のように私のカスタム投稿タイプに書き換えを追加しました:

    'rewrite' => array(
        'slug' => '/%author%/',
    ),

そして、次のようにフィルタを追加しました:

add_filter( 'post_type_link', 'art_post_type_link', 10, 4 );
function art_post_type_link( $post_link, $post, $leavename, $sample )
{
    if ( 'art' == $post->post_type ) {
        $authordata = get_userdata( $post->post_author );
        $author = $authordata->user_nicename;
        $post_link = str_replace( '%author%', $author, $post_link );
    }

    return $post_link;
}

これは動作しますが、今私は私の通常のページにアクセスすることができず、それらの404を取得しています。だからこれは私が望む解決策ではありません。だから私の質問は、私が欲しいものでさえ可能であり、もしそうなら私は何を間違っているのですか?

いくつかの入力が大好きです!

1
Augus

もう少し徹底的な調査とエラーの多くの後私は合法的に思われる修正を得た。

まず第一に私は私のカスタムポストタイプで書き換え規則を守りますが名前を変えました:

'rewrite' => array(
    'slug' => '/%designer%/',
),

それから、私は%designer%に正しいフィールドを指示する必要があります(私の場合ACFによって作られたカスタムフィールドです。私はこれを以下のようにしました:

add_filter( 'post_type_link', 'art_post_type_link', 10, 4 );

function art_post_type_link( $post_link, $post, $leavename, $sample )
{
    if ( 'art' == $post->post_type ) {
        $designer = get_field( 'designer', $post->ID );
        $post_link = str_replace( '%designer%', $designer['user_nicename'], $post_link );
    }

    return $post_link;
}

それから私はデザイナー/作者が/ author/baseなしで自分のURLを持っていることを確認する必要がありました。そして/%author%/%art-name%は動作します。私は以下の著者の書き直しでこれを行いました。

add_filter( 'author_rewrite_rules', 'no_author_base_rewrite_rules' );

function no_author_base_rewrite_rules( $author_rewrite ) {
    global $wpdb;
    $author_rewrite = array();
    $authors = $wpdb->get_results("SELECT user_nicename AS nicename from $wpdb->users");

    foreach($authors as $author) {
        $author_rewrite["({$author->nicename})/?$"] = 'index.php?author_name=$matches[1]';
        $author_rewrite["({$author->nicename})/([^/]+)/?$"] = 'index.php?post_type=art&name=$matches[2]';
    }

    return $author_rewrite;
}

それから私は管理者でない場合はグローバル$ wp_rewriteでauthor_baseを無効にする必要がありました:

if( !is_admin() ) {
    add_action('init', 'author_rewrite_base_null');
}

function author_rewrite_base_null() {
    global $wp_rewrite;
    if( 'author' == $wp_rewrite->author_base ) $wp_rewrite->author_base = null;
}

そして、これは私のためのトリックをしました、それが他の誰かに役立つことを願っています。

0
Augus