2014-05-16 17 views
18

Sto provando a creare una struttura di permalink personalizzata che mi consenta di realizzare quanto segue.Struttura permalink personalizzata: /% custom-post-type% /% custom-taxonomy% /% post-name%/

  1. Ho un tipo di messaggio personalizzato denominato "progetti"
  2. ho una tassonomia personalizzata denominata "progetto-categoria" che viene assegnato al CPT "progetti"

Voglio che la mia struttura dei permalink a guardare come questo:

progetti/categoria/nome-progetto

o

/% custom-post-type% /% custom-taxonomy% /% post-name%/

Sono stato in grado di utilizzare con successo /% category%/in permalink per normale, out-of-the-the- box WP posts, ma non per CPT.

In che modo la creazione di una tale struttura permalink influisce sugli URL o su altre pagine? È possibile definire una struttura di permalink personalizzata e limitarla a un singolo CPT?

Grazie

+2

Questo plug-in risolvera il problema? https://wordpress.org/plugins/custom-post-type-permalinks/ –

+0

Sono sempre riluttante a usare troppi plug-in, ma ci proverò sicuramente! Grazie. –

+0

Sono totalmente d'accordo con te, anche se ultimamente sono stato un po 'più indulgente con plugin molto semplici che essenzialmente ci stanno portando via un po' di lavoro. Spero che funzioni per te! –

risposta

18

Fortunatamente per voi, ho appena dovevano fare questo per un progetto client. Ho usato this answer on the WordPress Stackexchange come guida:

/** 
* Tell WordPress how to interpret our project URL structure 
* 
* @param array $rules Existing rewrite rules 
* @return array 
*/ 
function so23698827_add_rewrite_rules($rules) { 
    $new = array(); 
    $new['projects/([^/]+)/(.+)/?$'] = 'index.php?cpt_project=$matches[2]'; 
    $new['projects/(.+)/?$'] = 'index.php?cpt_project_category=$matches[1]'; 

    return array_merge($new, $rules); // Ensure our rules come first 
} 
add_filter('rewrite_rules_array', 'so23698827_add_rewrite_rules'); 

/** 
* Handle the '%project_category%' URL placeholder 
* 
* @param str $link The link to the post 
* @param WP_Post object $post The post object 
* @return str 
*/ 
function so23698827_filter_post_type_link($link, $post) { 
    if ($post->post_type == 'cpt_project') { 
    if ($cats = get_the_terms($post->ID, 'cpt_project_category')) { 
     $link = str_replace('%project_category%', current($cats)->slug, $link); 
    } 
    } 
    return $link; 
} 
add_filter('post_type_link', 'so23698827_filter_post_type_link', 10, 2); 

Quando si registra il tipo di messaggio personalizzato e la tassonomia, assicurarsi di utilizzare le seguenti impostazioni:

// Used for registering cpt_project custom post type 
$post_type_args = array(
    'rewrite' => array(
    'slug' => 'projects/%project_category%', 
    'with_front' => true 
) 
); 

// Some of the args being passed to register_taxonomy() for 'cpt_project_category' 
$taxonomy_args = array(
    'rewrite' => array(
    'slug' => 'projects', 
    'with_front' => true 
) 
); 

Naturalmente, assicurarsi di svuotare regole di riscrittura quando si' fatto. In bocca al lupo!

+0

Eccellente, grazie! Ero di fretta, quindi ho dovuto affidarmi a un plugin (che preferisco non fare) per farlo in fretta. Lo implementerò in progetti futuri! –

+1

Hai mai provato a farlo funzionare con sottocategorie o sapere come posso farlo funzionare con le sottocategorie? – Jordan

+0

Questo funziona; tuttavia, 'get_post_type_archive_link ('projects')' ritorna con '% project_catgory%' nell'URL dato che lo slug è definito con esso. – Seed

Problemi correlati