it-swarm.com.de

Wie man diesen Permalink erreicht -> Kategorie-Name/Benutzerdefinierter Post-Typ-Name/Post-Name

Ich versuche, Kategorien zu verwenden, um die Struktur für meine Site bereitzustellen. Ich werde Abschnitte auf meiner Website namens England, Wales, Schottland und Irland erstellen. Dies werden Kategorien sein. Meine Posts verwenden benutzerdefinierte Post-Typen - Video, Guide, Event, Clubs usw.

Wenn ich also einen Beitrag namens "Trouble down south" mit dem CPT "Video" erstelle und ihn der Kategorie "England" hinzufüge, möchte ich, dass das Slug-Format wie folgt lautet:

Kategorie-Name/benutzerdefinierte-Post-Typ-Name/Post-Name

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

Ich möchte auch, dass die folgenden Permalinks so funktionieren -

mysite.com/england/ - Alle Posts in dieser Kategorie unabhängig von der CPT anzeigen

mysite.com/video/ - Alle Video-CPT-Beiträge unabhängig von der Kategorie anzeigen

Ich halte mich an mein Beispiel und erstelle mein Video-CPT folgendermaßen:

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

Das macht fast das, was ich brauche. Ich erhalte die korrekten Auflistungen an

mysite.com/england (d. h. Kategoriearchivseite)

und

mysite.com/video (d. h. CPT-Archivseite)

Wenn ich mich zum eigentlichen Beitrag durchklicke, wird der Slug leider als angezeigt

mysite.com/video/trouble-down-south

Ich würde gern

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

Ich habe versucht, den folgenden Rewrite-Slug zu verwenden

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

Das funktioniert nicht.% category% wird buchstäblich in die URL eingefügt, ohne in den tatsächlichen Kategorienamen konvertiert zu werden.

Ich habe auf dieser Website nach einer Lösung gesucht, aber keine gefunden. Die meisten verwandten Antworten scheinen anhängende Taxonomien an den CPT-Slug zu richten.

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

Sie scheinen dies zu erreichen, indem sie den CPT-Namen explizit dem Taxonomie-Rewrite-Slug voranstellen, der die kaskadenähnliche Natur der Rewrite-Regeln ausnutzt (und einige andere Zauberkünste, die ich nicht verstehe.)

Wie auch immer, nichts, was ich gefunden habe, hat meine Anforderung an Kategoriename/Benutzerdefinierter Beitragstypname/Beitragsname sowie die Archivseiten, die ich benötige, erfüllt.

Irgendwelche Ideen, wie ich meine gewünschte Permalink-Struktur erreichen kann?

2
bob

Sie müssen 'post_type_link' filtern, um den entsprechenden Permalink zu erstellen. Siehe diese Antwort für ein ähnliches Beispiel.

Der folgende Code funktioniert:

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

Vergessen Sie nicht, die Permalink-Einstellungen einmal aufzurufen, um die gespeicherten Umschreiberegeln zu aktualisieren.

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

oben Code einfügen in Theme function.php Datei und ändern Sie die Permalink-Option /%category/%postname%/ %

0
Ashish Sharma