it-swarm.com.de

URL umschreiben Autor als Basis hinzufügen

Ich versuche, einen Autor als Slug für meine Designer-Website zu bekommen. Ich werde im Folgenden ein Beispiel geben, was ich zu tun versuche:

Ich habe einen Designer namens "Designer A" mit dem Benutzernamen "Designer-A". Ich habe ein Kunstobjekt (benutzerdefiniertes Post-Type) mit dem Namen "Awesome Art" und dem Namen "awesome-art".

Ich möchte erreichen, dass die URL des Kunstobjekts " http://domain.com/designer-a/awesome-art/ " lautet.

Um dies zu erreichen, habe ich meinen benutzerdefinierten Post-Typ wie folgt umgeschrieben:

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

Und fügte einen Filter wie folgt hinzu:

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;
}

Dies funktioniert, aber jetzt kann ich nicht auf meine normalen Seiten zugreifen und bekomme eine 404 auf sie. Das ist also nicht die Lösung, die ich will. Meine Frage ist also, ist das, was ich will, überhaupt möglich und wenn ja, was mache ich falsch?

Würde mich über Input freuen!

1
Augus

Okay, nach einigen intensiveren Nachforschungen und VIELEN Fehlern habe ich einen Fix bekommen, der legitim erscheint.

Zuallererst habe ich die Rewrite-Regel in meinem benutzerdefinierten Post-Typ beibehalten, aber den Namen geändert:

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

Dann muss ich den% designer% auf das richtige Feld verweisen (in meinem Fall ein von ACF erstelltes benutzerdefiniertes Feld). Ich habe das folgendermaßen gemacht:

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;
}

Dann musste ich sicherstellen, dass der Designer/Autor seine eigene URL ohne/author/base hatte. Und das /% author% /% art-name% funktioniert. Ich habe dies mit dem folgenden Autor neu geschrieben.

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;
}

Dann musste ich die author_base im globalen $ wp_rewrite deaktivieren, wenn nicht in admin:

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;
}

Und das hat den Trick für mich getan, hoffe es hilft jemand anderem.

0
Augus