J'ai un type de message personnalisé et une taxonomie personnalisée enregistrée pour celui-ci. Le type de message personnalisé est appelé "cartes mémoire" et la taxonomie est "leçon" .Pour cette taxonomie, j'ai créé deux termes "anglais" et "français".
Quand je vais à cette URL:
example.com/lesson/english
ou
example.com/lesson/french
Tout se passe comme expeted et il me dirige à archiver la page ou si je crée taxonomy.php ou taxonomy-english.php.
Mais quand j'essaye
example.com/lesson
Je reçois une erreur de page non trouvée.
Ma question est si je fais quelque chose de mal ici? Ne suis-je pas censé accéder à la page d'archive pour toutes les "leçons"? J'ai essayé ces arguments dans mon registre de taxonomie:
'rewrite' => array( 'slug' => 'lesson' ),
et
'rewrite' => true,
mais aucun n'a fonctionné. J'ai vu une autre question similaire à celle-ci mais ils concernent principalement les termes lien plutôt que lien taxonomie. De plus, la plupart des tutoriels traitent de la hiérarchie de la taxonomie plutôt que du lien entre la taxonomie.
C'est le code pour créer la taxonomie:
$labels = array(
'name' => _x( 'Lessons', 'taxonomy general name', 'textdomain' ),
'singular_name' => _x( 'Lesson', 'taxonomy singular name', 'textdomain' ),
'search_items' => __( 'Search Lessons', 'textdomain' ),
'all_items' => __( 'All Lessons', 'textdomain' ),
'parent_item' => __( 'Parent Lesson', 'textdomain' ),
'parent_item_colon' => __( 'Parent Lesson:', 'textdomain' ),
'edit_item' => __( 'Edit Lesson', 'textdomain' ),
'update_item' => __( 'Update Lesson', 'textdomain' ),
'add_new_item' => __( 'Add New Lesson', 'textdomain' ),
'new_item_name' => __( 'New Lesson Name', 'textdomain' ),
'menu_name' => __( 'Lessons', 'textdomain' ),
);
$args = array(
'hierarchical' => true,
'labels' => $labels,
'show_ui' => true,
'show_admin_column' => true,
'query_var' => true,
'rewrite' => array( 'slug' => 'lesson'),
);
register_taxonomy( 'lesson', array( 'memory-cards' ), $args );
Mais quand j'essaye
example.com/lesson
Je reçois une erreur de page non trouvée.
Comme je l'ai indiqué dans votre commentaire à votre question, voici comment cela fonctionne: le terme slug doit être spécifié dans l'URL. C'est pourquoi example.com/lesson/english
(le terme slug est english
) et le example.com/lesson/french
(le terme slug est french
), mais pas example.com/lesson
(le terme slug pas spécifié).
Donc, une façon de faire fonctionner example.com/lesson
consiste à définir le paramètre has_archive
sur lesson
lors de l’enregistrement du CPT memory-cards
via register_post_type()
. Par exemple:
register_post_type( 'memory-cards', array(
'labels' => array(
'name' => 'Memory Cards',
'singular_name' => 'Memory Card',
),
'public' => true,
'has_archive' => 'lesson',
) );
Toutefois, cela signifie également que example.com/memory-cards
, qui est l'URL d'archive par défaut pour votre memory-cards
CPT (lorsque has_archive
est défini sur true
), n'affichera plus l'archive CPT.
Pour résoudre ce problème ou pour conserver l'URL d'archive par défaut, vous pouvez utiliser add_rewrite_rule()
pour ajouter les règles de réécriture de example.com/lesson
, comme suit:
register_taxonomy( 'lesson', 'memory-cards', array(
'labels' => array(
'name' => 'Lessons',
'singular_name' => 'Lesson',
),
'rewrite' => true,
// ...other args here...
) );
add_rewrite_rule( 'lesson/?$', 'index.php?post_type=memory-cards', 'top' );
add_rewrite_rule( 'lesson/page/(\d+)/?$', 'index.php?post_type=memory-cards&paged=$matches[1]', 'top' );
La deuxième règle de réécriture gérera paginé des requêtes telles que example.com/lesson/page/2/
.