Je suis en train d'essayer d'obtenir un auteur en tant que limace pour le site Web de mes concepteurs. Je vais donner un exemple ci-dessous de ce que je cherche à faire:
J'ai un designer nommé "Designer A" avec nicename "designer-a". J'ai un objet d'art (type de post personnalisé) nommé "Awesome Art" avec nicename "awesome-art".
Je veux réaliser que l'URL de l'objet d'art sera " http://domain.com/designer-a/awesome-art/ "
Pour ce faire, j'ai ajouté une réécriture à mon post-type personnalisé comme suit:
'rewrite' => array(
'slug' => '/%author%/',
),
Et ajouté un filtre comme suit:
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;
}
Cela fonctionne mais maintenant je ne peux pas accéder à mes pages normales et je reçois un 404 dessus. Donc, ce n'est pas la solution que je veux. Ma question est donc la suivante: est-ce que ce que je veux est possible, et si oui, que fais-je de travers?
J'aimerais des commentaires!
Très bien, après quelques recherches plus intensives et BEAUCOUP d’erreurs, j’ai trouvé une solution qui semble légitime.
Tout d'abord, je garde la règle de réécriture dans mon post-type personnalisé, mais j'ai changé le nom:
'rewrite' => array(
'slug' => '/%designer%/',
),
Ensuite, je dois pointer le% designer% sur le champ approprié (qui était dans mon cas un champ personnalisé créé par ACF. Je l'ai fait comme suit:
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;
}
Ensuite, je devais m'assurer que le concepteur/auteur avait sa propre URL sans/author/base. Et que /% author% /% art-name% fonctionne. Je l'ai fait avec l'auteur suivant réécrire.
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;
}
Ensuite, je devais désactiver author_base dans le dossier global $ wp_rewrite si ce n’était pas dans 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;
}
Et cela a fait l'affaire pour moi, espérons que cela aidera quelqu'un d'autre.