J'ai ces types de messages personnalisés (CPT) et ces méta-boîtes:
Si un film s'appelle Die hard, je veux que le lien permanent soit:/genres/action/die-hard
Ceci est facilement corrigé en réglant movie-CPT sur 'rewrite' => false et utilisez ce code à la place:
add_action('init', 'rb_add_rewrite_rules');
add_filter('post_type_link', 'rb_create_permalinks', 10, 3);
function rb_add_rewrite_rules() {
global $wp_rewrite;
$wp_rewrite->add_rewrite_tag('%movies%', '([^/]+)', 'movies=');
$wp_rewrite->add_rewrite_tag('%genre%', '([^/]+)', 'genre=');
$wp_rewrite->add_permastruct('movies', '/genres/%genre%/%movies%', false);
}
function rb_create_permalinks($permalink, $post, $leavename) {
$no_data = 'no-data';
$post_id = $post->ID;
if($post->post_type != 'movies' || empty($permalink) || in_array($post->post_status, array('draft', 'pending', 'auto-draft')))
return $permalink;
$event_id = get_post_meta($post_id, 'genre', true);
$var1 = basename(get_permalink($event_id));
$var1 = sanitize_title($var1);
if(!$var1)
$var1 = $no_data;
$permalink = str_replace('%genre%', $var1, $permalink);
return $permalink;
}
Ok, voici le problème. Le lien permanent Die Hard et le fichier archive-genres.php (affichant tous les genres) ont bonne apparence, mais le fichier single-genres.php n’est pas trouvé. Au lieu de cela, aller à/genres/action affichera le code index.php.
Je suppose que le problème est que mes réécritures entrent en collision, il est peut-être impossible de faire ceci:
Lien permanent du CPT 'films'
/custom base name/custom field meta box value)/'movies' CPT post name
Lien permanent du CPT 'genres'
/custom post type name (same value as the custom base name above!!)/'genres' CPT post name
Comment faire en sorte que WordPress utilise single-genres.php pour/genres/action, etc.?
On dirait que vous êtes très proche ici et votre seul problème restant est que vos liens permanents pour les genres et les films se rencontrent.
'movies' CPT permalink
/genres/%custom field meta box value%/%movie%/
'genres' CPT permalink
/genres/%genre%/
Le problème ici utilise le add_permastruct
. Quand il crée les règles pour les films, ils ressemblent à ceci:
genres/([^/]+)/([^/]+)(/[0-9]+)?/?$
=> index.php?genre=$matches[1]&movies=$matches[2]&page=$matches[3]
Comme le traitement des demandes fonctionne dans WordPress, vous ne pouvez pas définir plusieurs types d'article dans la même URL - WordPress s'arrête après le premier. Autrement dit, ils peuvent figurer dans la jolie URL, mais pas dans celle "laide" qui génère la requête et la requête . Toute règle de réécriture avec movies=
ne peut pas contenir genre=
. Vous trouverez ci-dessous la révision complète et épuisante de rb_add_rewrite_rules
. Vous pouvez définir toutes les règles inutiles telles que les URL de pièces jointes, les URL de flux, etc. Comme toujours lors de la réécriture des modifications, veillez à vider vos permaliens en accédant à Paramètres-> Permaliens et en cliquant sur "Enregistrer les modifications". Assurez-vous également que 'rewrite' => false
est défini sur les deux types de publication personnalisés.
function rb_add_rewrite_rules() {
add_rewrite_rule( 'genres/[^/]+/[^/]+/attachment/([^/]+)/?$', 'index.php?attachment=$matches[1]', 'top' );
add_rewrite_rule( 'genres/[^/]+/[^/]+/attachment/([^/]+)/trackback/?$', 'index.php?attachment=$matches[1]&tb=1', 'top' );
add_rewrite_rule( 'genres/[^/]+/[^/]+/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'top' );
add_rewrite_rule( 'genres/[^/]+/[^/]+/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'top' );
add_rewrite_rule( 'genres/[^/]+/[^/]+/attachment/([^/]+)/comment-page-([0-9]{1,})/?$', 'index.php?attachment=$matches[1]&cpage=$matches[2]', 'top' );
add_rewrite_rule( 'genres/[^/]+/([^/]+)/trackback/?$', 'index.php?movies=$matches[1]&tb=1', 'top' );
add_rewrite_rule( 'genres/[^/]+/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$', 'index.php?movies=$matches[1]&feed=$matches[2]', 'top' );
add_rewrite_rule( 'genres/[^/]+/([^/]+)/(feed|rdf|rss|rss2|atom)/?$', 'index.php?movies=$matches[1]&feed=$matches[2]', 'top' );
add_rewrite_rule( 'genres/[^/]+/([^/]+)/page/?([0-9]{1,})/?$', 'index.php?&movies=$matches[1]&paged=$matches[2]', 'top' );
add_rewrite_rule( 'genres/[^/]+/([^/]+)(/[0-9]+)?/?$', 'index.php?movies=$matches[1]&page=$matches[3]', 'top' );
add_rewrite_rule( 'genres/[^/]+/[^/]+/([^/]+)/?$', 'index.php?attachment=$matches[1]', 'top' );
add_rewrite_rule( 'genres/[^/]+/[^/]+/([^/]+)/trackback/?$', 'index.php?attachment=$matches[1]&tb=1', 'top' );
add_rewrite_rule( 'genres/[^/]+/[^/]+/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'top' );
add_rewrite_rule( 'genres/[^/]+/[^/]+/([^/]+)/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'top' );
add_rewrite_rule( 'genres/[^/]+/[^/]+/([^/]+)/comment-page-([0-9]{1,})/?$', 'index.php?attachment=$matches[1]&cpage=$matches[2]', 'top' );
add_rewrite_rule( 'genres/[^/]+/attachment/([^/]+)/?$', 'index.php?attachment=$matches[1]', 'top' );
add_rewrite_rule( 'genres/[^/]+/attachment/([^/]+)/trackback/?$', 'index.php?attachment=$matches[1]&tb=1', 'top' );
add_rewrite_rule( 'genres/[^/]+/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'top' );
add_rewrite_rule( 'genres/[^/]+/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'top' );
add_rewrite_rule( 'genres/[^/]+/attachment/([^/]+)/comment-page-([0-9]{1,})/?$', 'index.php?attachment=$matches[1]&cpage=$matches[2]', 'top' );
add_rewrite_rule( 'genres/([^/]+)/trackback/?$', 'index.php?genre=$matches[1]&tb=1', 'top' );
add_rewrite_rule( 'genres/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$', 'index.php?genre=$matches[1]&feed=$matches[2]', 'top' );
add_rewrite_rule( 'genres/([^/]+)/(feed|rdf|rss|rss2|atom)/?$', 'index.php?genre=$matches[1]&feed=$matches[2]', 'top' );
add_rewrite_rule( 'genres/([^/]+)/page/?([0-9]{1,})/?$', 'index.php?genre=$matches[1]&paged=$matches[2]', 'top' );
add_rewrite_rule( 'genres/([^/]+)(/[0-9]+)?/?$', 'index.php?genre=$matches[1]&page=$matches[2]', 'top' );
add_rewrite_rule( 'genres/[^/]+/([^/]+)/?$', 'index.php?attachment=$matches[1]', 'top' );
add_rewrite_rule( 'genres/[^/]+/([^/]+)/trackback/?$', 'index.php?attachment=$matches[1]&tb=1', 'top' );
add_rewrite_rule( 'genres/[^/]+/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'top' );
add_rewrite_rule( 'genres/[^/]+/([^/]+)/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'top' );
add_rewrite_rule( 'genres/[^/]+/([^/]+)/comment-page-([0-9]{1,})/?$', 'index.php?attachment=$matches[1]&cpage=$matches[2]', 'top' );
}
Je pense que vous prenez la mauvaise approche en termes de structure de données. Vous devez créer une taxonomie personnalisée appelée Genres et lier votre CPT de films à la taxonomie personnalisée Genres, puis sélectionner les genres auxquels le film appartient.
Pour répondre aux questions concernant votre code existant. Le modèle single-XXX.php est utilisé pour afficher le contenu du CPT appelé XXX. Donc, pour afficher des films, vous devez utiliser single-movies.php. Et adresser le contenu spécifiquement pour un post_meta particulier, vous pouvez effectuer les opérations suivantes:
if(get_post_meta($post_id, 'genres', false) == 'action') {
//Do Stuff Here
}