J'ai un type de message personnalisé appelé "ensembles" et une taxonomie définie sous celui-ci appelé "projet". La plupart des publications de ce type de publication personnalisée se verront attribuer une durée de projet, mais pas nécessairement. Quand un terme de projet n'a pas été attribué, je me retrouve avec une URL telle que:
example.com/sets/no-project/the-post-name
Dans ce cas, j'aimerais qu'il s'affiche comme ceci lorsqu'aucune taxonomie n'est affectée :
example.com/sets/the-post-name
add_filter('post_link', 'sets_permalink', 10, 3);
add_filter('post_type_link', 'sets_permalink', 10, 3);
function sets_permalink($permalink, $post_id, $leavename) {
if (strpos($permalink, '%project%') === FALSE) return $permalink;
// Get post
$post = get_post($post_id);
if (!$post) return $permalink;
// Get taxonomy terms
$terms = wp_get_object_terms($post->ID, 'project');
if (!is_wp_error($terms) && !empty($terms) && is_object($terms[0]))
$taxonomy_slug = $terms[0]->slug;
else $taxonomy_slug = 'no-project';
return str_replace('%project%', $taxonomy_slug, $permalink);
}
En suivant les instructions de de ce message , j'ai pu trouver ceci:
// Register Taxonomy
add_action( 'init', 'create_project_taxonomies', 0 );
function create_project_taxonomies() {
$labels = array(
'name' => _x( 'Project', 'taxonomy general name' ),
'singular_name' => _x( 'Project', 'taxonomy singular name' ),
'search_items' => __( 'Search Projects' ),
'all_items' => __( 'All Projects' ),
'parent_item' => __( 'Parent Project' ),
'parent_item_colon' => __( 'Parent Project:' ),
'edit_item' => __( 'Edit Project' ),
'update_item' => __( 'Update Project' ),
'add_new_item' => __( 'Add New Project' ),
'new_item_name' => __( 'New Project Name' ),
'menu_name' => __( 'Projects' ),
);
$args = array(
'hierarchical' => true,
'labels' => $labels,
'_builtin' => false,
'public' => true,
'show_ui' => true,
'with_front' => false,
'show_admin_column' => true,
'query_var' => true,
'rewrite' => array( 'slug' => 'sets' ),
);
register_taxonomy( 'project', array('set'), $args );
}
// Project Permalink
add_filter('post_type_link', 'sets_permalink', 10, 3);
function sets_permalink($permalink, $post_id, $leavename) {
if (strpos($permalink, '%project%') === FALSE) return $permalink;
// Get post
$post = get_post($post_id);
if (!$post) return $permalink;
// Get taxonomy terms
$terms = wp_get_object_terms($post->ID, 'project');
if (!is_wp_error($terms) && !empty($terms) && is_object($terms[0]))
$taxonomy_slug = $terms[0]->slug . '/';
else $taxonomy_slug = '';
return str_replace('%project%/', $taxonomy_slug, $permalink);
}
add_action ('init', 'custom_rewrite', 10, 0);
function custom_rewrite () {
add_rewrite_rule( 'sets/([^/]+)/?$', 'index.php?set=$matches[1]', 'top');
flush_rewrite_rules();
}
// Custom Post Type
add_action( 'init', 'create_post_type' );
function create_post_type() {
register_post_type( 'set',
array(
'labels' => array(
'name' => __( 'Sets' ),
'all_items' => __( 'All Sets'.$plural),
'singular_name' => __( 'Set' ),
'edit_item' => __( 'Edit Set' ),
),
'public' => true,
'has_archive' => 'sets',
'can_export' => true,
'publicly_queryable' => true,
'exclude_from_search' => false,
'query_var' => true,
'show_in_nav_menus' => true,
'show_ui' => true,
'menu_position' => 8,
'capability_type' => 'post',
'heirarchical' => true,
'menu_icon' => 'dashicons-playlist-audio',
'rewrite' => array('slug' => 'sets/%project%', 'with_front' => false ),
'supports' => array( 'title', 'thumbnail', 'editor'),
'register_meta_box_cb' => 'set_meta_boxes',
)
);
flush_rewrite_rules();
}
Le code mis à jour semble fonctionner correctement. Cependant, lorsque j'essaie d'afficher un article pour lequel aucune taxonomie n'est attribuée, je rencontre un problème étrange. Par exemple, cette URL fonctionne mais renvoie une page 404 :
example.com/sets/the-post-name
Il semble que la publication de l'URL précédente s'affiche à l'adresse suivante:
example.com/sets/project/the-post-name
Mais comme indiqué ci-dessus, , j'ai besoin de l'afficher comme ceci lorsqu'aucune taxonomie n'est affectée :
example.com/sets/the-post-name
Maintenant, quand j'assigne une taxonomie avec le slug nommé, " groove-sessions " à la publication, tout s'affiche parfaitement et le lien ne montre pas une page 404. Par exemple, cette URL fonctionne :
example.com/sets/groove-sessions/the-post-name
Des idées sur la façon dont je peux résoudre ce problème? Par exemple, y a-t-il un moyen de le faire ignorer tout le% projet% quand aucun terme de taxonomie n'est attribué? Merci.
Merci!
Grâce aux conseils utiles de Milo, j'ai pu supprimer le slug de taxonomie lorsqu'aucune taxonomie n'est affectée au type de publication personnalisé en ajoutant le code suivant aux fonctions mises à jour ci-dessus:
add_filter( 'request', 'project_request_filter' );
function project_request_filter( $request ){
if( array_key_exists( 'project' , $request )
&& ! get_term_by( 'slug', $request['project'], 'project' ) ){
$request['set'] = $request['project'];
$request['name'] = $request['project'];
$request['post_type'] = 'set';
unset( $request['project'] );
}
return $request;
}