web-dev-qa-db-fra.com

Supprimer le slogan de taxonomie lorsqu'aucune taxonomie n'est affectée à un type de publication personnalisé?

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

Voici mon code original:

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:

Code mis à jour avec CPT et taxonomie enregistrés (ne fonctionne pas complètement!)

// 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 problème

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!

2
Marz

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;
}
2
Marz