web-dev-qa-db-fra.com

Comment réaliser ce permalien -> nom de catégorie/nom-type-post-personnalisé/nom-post

J'essaie d'utiliser des catégories pour fournir la structure de mon site. Je créerai sur mon site des sections appelées Angleterre, Pays de Galles, Écosse et Irlande. Ce seront des catégories. Mes publications utiliseront des types de publication personnalisés: vidéo, guide, événement, clubs, etc.

Donc, si je crée un article appelé 'Trouble down south' en utilisant le CPT 'Video', attachez-le à la catégorie 'Angleterre', je voudrais que le format slug soit:

nom-catégorie/nom-type-poste-personnalisé/nom-poste

par exemple. mysite.com/francais/video/trouble-down-south

J'aimerais aussi que les permaliens suivants fonctionnent comme suit -

mysite.com/england/ - Afficher tous les messages de cette catégorie, indépendamment du CPT

mysite.com/video/ - Afficher tous les messages Video CPT indépendamment de la catégorie

En collant avec mon exemple, je crée ma vidéo CPT comme ceci:

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

Cela fait presque ce dont j'ai besoin. Je reçois les bonnes listes à

mysite.com/francais (i.e, page d'archives des catégories)

et

mysite.com/video (i.e page d'archive CPT)

Malheureusement, lorsque je clique sur le message, le slug indique:

mysite.com/video/trouble-down-south

J'aimerais

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

J'ai essayé d'utiliser le slug de réécriture suivant

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

Cela ne fonctionne pas.% category% est littéralement inséré dans l'URL sans être converti dans le nom de la catégorie.

J'ai cherché une solution sur ce site, mais je n'en ai trouvé aucune. La plupart des réponses apparentées semblent concerner l'ajout de taxonomies à la limace du CPT.

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

Ils semblent y parvenir en préfixant explicitement le nom du CPT au slug de réécriture de taxonomie qui exploite la nature en cascade des règles de réécriture (plus quelques autres sorcières que je ne comprends pas.)

Quoi qu'il en soit, rien de ce que j'ai trouvé ne répond à mon besoin de nom de catégorie/nom de type de poste/nom de poste personnalisé , plus les pages d'archive dont j'ai besoin.

Des idées comment réaliser ma structure permalien désirée?

2
bob

Vous devez filtrer 'post_type_link' pour créer le lien permanent approprié. Voir cette réponse pour un exemple similaire.

Le code suivant fonctionne:

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

N’oubliez pas de consulter les paramètres de permalien une fois pour actualiser les règles de réécriture stockées.

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

Au-dessus du code, collez-le dans le fichier theme function.php et modifiez l’option permalien /%category/%postname%/ %

0
Ashish Sharma