Wie füge ich eine benutzerdefinierte Taxonomie in einem benutzerdefinierten Beitragstyp-Permalink hinzu?

Lesezeit: 4 Minuten

Ich habe eine benutzerdefinierte Taxonomie namens campaign und einen benutzerdefinierten Beitragstyp namens asset. Für Assets möchte ich die folgende Permalink-Struktur haben: mysite.com/<campaign_name>/<asset_name>. Ich habe dies durch den folgenden Code erreicht, aber wenn ich jetzt auf eine normale Seite mit der URL-Struktur gehe mysite.com/<pagename> es gibt einen 404. Und wenn ich den Rewrite-Slug-Teil in der Funktion zum Registrieren des benutzerdefinierten Beitragstyps auskommentiere oder stattdessen diesen hinzufüge ams/%campaign%es funktioniert, aber das ist nicht die URL-Struktur, die ich für meinen benutzerdefinierten Beitragstyp haben möchte.

Code zum Registrieren einer benutzerdefinierten Taxonomie:

...
'rewrite' => array(
    'slug' => '',
    'with_front' => true,
),
...

Code zum Registrieren des benutzerdefinierten Beitragstyps:

...
rewrite' => array(
    'slug' => '%campaign%',
    'with_front' => true,
),
...

Funktionen für Rewrite-Regeln:

function ams_asset_add_rewrite_rules( $rules ) {
    global $post;
    if ($post->post_type == 'asset' ) {
        $new = array();
        $new['([^/]+)/(.+)/?$'] = 'index.php?asset=$matches[2]';
        $new['(.+)/?$'] = 'index.php?campaign=$matches[1]';
        return array_merge( $new, $rules );
    }
    return $rules;
}
add_filter( 'rewrite_rules_array', 'ams_asset_add_rewrite_rules' );

// Handle the '%campaign%' URL placeholder
function ams_asset_filter_post_type_link( $link, $post = 0 ) {
    if ( $post->post_type == 'asset' ) {
        $cats = wp_get_object_terms( $post->ID, 'campaign' );
        if ( $cats ) {
            $link = str_replace( '%campaign%', $cats[0]->slug, $link );
        }
    }
    return $link;
}
add_filter( 'post_type_link', 'ams_asset_filter_post_type_link', 10, 2 );

Registrieren Sie zuerst Ihre Taxonomie und setzen Sie das Slug-Argument von rewrite auf show:

register_taxonomy(
    'campaign',
    'asset',
    array(
        'rewrite' => array( 'slug' => 'shows', 'with_front' => false ),
        // your other args...
    )
);

Registrieren Sie als Nächstes Ihren Beitragstyp und setzen Sie den Slug auf Shows/%show_category% und setzen Sie das Argument has_archive auf Shows:

register_post_type(
    'show',
    array(
        'rewrite' => array( 'slug' => 'campaign/%asset%', 'with_front' => false ),
        'has_archive' => 'asset',
        // your other args...
    )
);

Fügen Sie zuletzt einen Filter zu post_type_link hinzu, um die Show-Kategorie in einzelnen Show-Permalinks zu ersetzen:

function wpa_show_permalinks( $post_link, $post ){
    if ( is_object( $post ) && $post->post_type == 'asset' ){
        $terms = wp_get_object_terms( $post->ID, 'campaign' );
        if( $terms ){
            return str_replace( '%campaign%' , $terms[0]->slug , $post_link );
        }
    }
    return $post_link;
}
add_filter( 'post_type_link', 'wpa_show_permalinks', 1, 2 );

  • benutzerdefinierte Archivseite für Beitragstypen funktioniert nicht

    – e-Lab-Innovationen

    22. Februar um 18:25 Uhr

Benutzer-Avatar
C0c0b33f

Registrieren Sie zuerst Ihre Taxonomie und dann Ihren benutzerdefinierten Beitragstyp. Möglicherweise müssen Sie auch Ihre Permalinks speichern. Ich glaube nicht, dass Sie ‘with_front’ auf true setzen möchten. Der Rest mag ok sein, aber hier ist ein funktionierendes Beispiel.

/**
 * Register a 'campaign' taxonomy for post type 'asset'.
 *
 * @see register_post_type for registering post types.
 */
function wpdocs_create_campaign_tax_rewrite() {
    register_taxonomy( 'campaign', 'asset', array(
        'rewrite' => array(
            'slug' => '',
            'with_front' => false,
        ),
    ) );
}
add_action( 'init', 'wpdocs_create_campaign_tax_rewrite', 0 );


/**
 * Implements init_hook to register post type.
 * https://codex.wordpress.org/Function_Reference/register_post_type
 */
function generic_create_posttype_asset() {
    register_post_type(
        'asset',
        array(
            'labels'       => array(
                'name'          => __( 'Assets' ),
                'singular_name' => __( 'Assets' ),
                'add_new'       => __( 'New Asset' ),
                'add_new_item'  => __( 'New Asset' ),
                'edit_item'     => __( 'Edit Asset' ),
            ),
            'description'  => 'Campaign ...',
            'public'       => true,
            'hierarchical' => true,
            'has_archive'  => true,
            'rewrite' => array(
                'slug' => '%campaign%',
                'with_front' => false,
            ),
            'show_in_menu' => true,
            'menu_icon'    => 'dashicons-category', // https://developer.wordpress.org/resource/dashicons/ .
            'supports'     => array( 'title', 'editor', 'revisions', 'thumbnail' ),
        )
    );
}
add_action( 'init', 'generic_create_posttype_asset' );

/**
 * Rewrite '%campaign%' with taxonomy assigned.
 */
function asset_show_permalinks( $post_link, $post ){
    if ( is_object( $post ) && $post->post_type == 'asset' ){
        $terms = wp_get_object_terms( $post->ID, 'campaign' );
        if( $terms ){
            return str_replace( '%campaign%' , $terms[0]->slug , $post_link );
        }
    } else {
            return $post_link;
    }
}
add_filter( 'post_type_link', 'asset_show_permalinks', 1, 2 );

function generic_cpt_rewrite_flush() {
    generic_create_posttype_asset();
    flush_rewrite_rules();
}
register_activation_hook( __FILE__, 'generic_cpt_rewrite_flush' );

  • Hallo danke aber das hatte ich schon mal probiert. Dies funktioniert für die benutzerdefinierten Beitragstypen, aber wenn ich auf eine Seite gehe, gibt es einen 404.

    – Sadmansch

    7. September 2019 um 12:17 Uhr

  • seltsam, bei mir hat es funktioniert. Hast du versucht, zu Einstellungen > Permalinks zu gehen und dann Permalinks zu speichern?

    – C0c0b33f

    9. September 2019 um 13:20 Uhr

1386080cookie-checkWie füge ich eine benutzerdefinierte Taxonomie in einem benutzerdefinierten Beitragstyp-Permalink hinzu?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy