web-dev-qa-db-fra.com

Afficher les publications avec l'auteur dans l'URL avec les types de publication personnalisés

Je passe un moment vraiment difficile avec ça. J'ai un site de galerie multi-utilisateurs. Chaque auteur a sa propre page qui répertorie les messages de l'auteur (il s'agit d'un type de message personnalisé).

J'ai fait en sorte que l'URL de l'auteur (author.php) soit www.example.com/firstname-lastname/. Mais lorsqu'un visiteur clique sur l'un des messages de l'auteur, l'URL devient www.example.com/custom-post-type-name/postname/, alors que je veux que ce soit www.example.com/firstname-lastname/postname/ . Comment puis-je y arriver? Avec .htaccess? Ou changer la règle de réécriture lors de l'enregistrement du type de message? Comment?

J'utilise ceci pour enregistrer mon type de message dans le fichier functions.php:

// Make custom post type Add media

function galleryRegister()
{
$labels = array(
'name' => _x('Add gallery', 'post type general name'),
'singular_name' => _x('Add gallery', 'post type singular name'),
);

$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'query_var' => true,
'capability_type' => 'post',
'hierarchical' => false,
'menu_position' => null,
'supports' => array('title', 'editor', 'thumbnail'),
'rewrite' => false,
'show_in_nav_menus' => true,
);

register_post_type('gallery' , $args);
}

add_action('init', 'galleryRegister');

Merci pour l'aide.

Edit: J'ai découvert que je pouvais saisir manuellement www.example.com/nom-nom/nom/ et il affiche le message correct, mais le permalien est toujours le même ancien www.example.com/custom-post-nom- postname/partout

Solution: Merci Stephen pour cette excellente réponse! Ceci est le code que j'ai utilisé et cela a fonctionné:

// ****************************************************
// Make a custom post type "Add gallery"
// ****************************************************
function galleryRegister()
{
$labels = array(
'name' => _x('Add gallery', 'post type general name'),
'singular_name' => _x('Add gallery', 'post type singular name'),
'add_new' => _x('Add gallery ', 'portfolio item'),
'all_items' => __( 'Manage your galleries' ),
'add_new_item' => __('Add gallery'),
'edit_item' => __('Edit your galleries'),
'new_item' => __('New gallery'),
'view_item' => __('View gallery on site'),
'search_items' => __('Search galleries'),
'not_found' => __('Nothing found'),
'not_found_in_trash' => __('Nothing found in Trash'),
'parent_item_colon' => ''
);

$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'query_var' => true,
'capability_type' => 'post',
'hierarchical' => false,
'menu_position' => null,
'supports' => array('title', 'editor', 'thumbnail'),
'rewrite' =>  array( 'slug' => _x( '%author%', 'URL slug') ),
'show_in_nav_menus' => true,
);

register_post_type('gallery' , $args);
}

add_action('init', 'galleryRegister');

// ****************************************************
// Flush rewrite rules. Delete this 
// ****************************************************
function my_rewrite_flush() {
    my_cpt_init();

    // ATTENTION: This is *only* done during plugin activation hook in this example!
    // You should *NEVER EVER* do this on every page load!!
    flush_rewrite_rules();
}
register_activation_hook( __FILE__, 'my_rewrite_flush' );

// ****************************************************
// Make author as slug for posts
// ****************************************************
add_filter('post_type_link', 'wpse73228_author_tag',10,4);
function wpse73228_author_tag($post_link, $post, $leavename, $sample){

    if( 'gallery' != get_post_type($post) )
        return $post_link;

    $authordata = get_userdata($post->post_author);
$author = $authordata->user_nicename;

$post_link = str_replace('%author%', $author, $post_link);

return $post_link;
}
5
hlotvonen

Vous pouvez utiliser la balise %author% dans la propriété rewrite dans register_post_type(). Cependant, bien que les règles de réécriture soient ajoutées (après leur vidage), WordPress ne remplace pas la balise par sa valeur appropriée lors de la génération du permalien de votre type de publication. Par exemple, vous vous retrouvez avec le lien permanent www.example.com/%author%/gallery-name

Ce qui suit remplace %author% par la valeur appropriée:

add_filter('post_type_link', 'wpse73228_author_tag',10,4);
function wpse73228_author_tag($post_link, $post, $leavename, $sample){

    if( 'gallery' != get_post_type($post) )
        return $post_link;

    $authordata = get_userdata($post->post_author);
    $author = $authordata->user_nicename;

    $post_link = str_replace('%author%', $author, $post_link);

    return $post_link;
}
4
Stephen Harris