Rimuovere lo slug del custom post type dall'URL

28 set 2012, 06:33:03
Visualizzazioni: 18.1K
Voti: 15

Non ho trovato una risposta utile per questo. Sono consapevole dei problemi di conflitto e di tutti i problemi che questo potrebbe causare, sono curioso se è POSSIBILE non SUGGERITO. Questo richiederà rewrite di WP, questo lo so.

In pratica, supponiamo di avere un CPT di "eventi". Voglio che la pagina di un singolo evento abbia l'URL http://domain.com/nome-evento-singolo e NON http://domain.com/eventi/nome-evento-singolo. Qualche idea su come procedere?

2
Commenti

Ho sempre voluto scoprirlo, ma non mi è mai venuto in mente di fare la domanda. Grazie!

fischi fischi
13 dic 2012 16:27:43

@robbennet nel 2015 sembra ancora non esserci un modo legittimo per farlo con stile.

Ben Racicot Ben Racicot
28 set 2015 18:58:41
Tutte le risposte alla domanda 4
3

Ecco come puoi fare la prima parte del lavoro - rimuovere lo slug del CPT dal link dell'articolo (ad esempio per il post type news).

function df_custom_post_type_link( $post_link, $id = 0 ) {  

    $post = get_post($id);  

    if ( is_wp_error($post) || 'news' != $post->post_type || empty($post->post_name) )  
        return $post_link;  

    return home_url(user_trailingslashit( "$post->post_name" ));  
}
add_filter( 'post_type_link', 'df_custom_post_type_link' , 10, 2 );

Ora dovrai aggiungere le regole di riscrittura per 'news', altrimenti otterrai un errore 404.

Aggiungi la regola di riscrittura in questo modo:

function df_custom_rewrite_rule() {
    add_rewrite_rule('(.*?)$', 'index.php?news=$matches[1]', 'top');
}
add_action('init', 'df_custom_rewrite_rule');

Infine dovrai svuotare le regole di riscrittura, quindi vai su Impostazioni - Permalink e salva le modifiche.

13 dic 2012 16:56:11
Commenti

Non dovresti aggiungere regole di riscrittura su init. Dovresti semplicemente aggiungere la tua regola alle regole correnti.

Chris_O Chris_O
19 dic 2012 08:36:04

@Chris_O Puoi approfondire? Come si potrebbe aggiungere la regola alle regole correnti?

Desi Desi
25 gen 2015 15:26:29

Dopo aver aggiunto questo codice, tutte le mie pagine con URL come http://example.com/about-us hanno smesso di funzionare? Qualche soluzione per questo?

Rahul Gupta Rahul Gupta
15 dic 2016 10:09:04
3

Puoi provare questo plugin (http://wordpress.org/extend/plugins/remove-slug-from-custom-post-type/) per rimuovere lo slug, ma funzionerà solo se la struttura dei permalink è impostata su "/%postname%/".

13 dic 2012 16:56:39
Commenti

Esattamente questo plugin è fantastico! Sono un utente esperto di questo plugin e lo consiglio vivamente!

Ecco il link del sito del plugin che lo spiega in profondità http://www.ultimatewebtips.com/remove-slug-from-custom-post-type/

Kuldeep Daftary Kuldeep Daftary
17 dic 2012 19:17:03

Questo è un bel Plugin, e ha esattamente la funzionalità che stavo cercando. La soluzione di @bartosz è specifica per un CPT, anche se da lì si capisce l'idea generale. Dopo aver approfondito questo Plugin ora è tutto chiaro, grazie!

fischi fischi
19 dic 2012 14:40:29

Sembra che questo plugin non sia più nel repository di Wordpress. Tuttavia puoi usare questo plugin invece... https://wordpress.org/plugins/remove-cpt-base/

clayRay clayRay
28 nov 2021 04:22:14
0
function register_cpt_type() {
    register_post_type('cpt', array(
        'rewrite' => array("slug" => "/cpt", "with_front" => false),
    ));
}
add_action('init', 'register_cpt_type')

function cpt_rewrite_rule() {
    add_rewrite_rule('(.*?)$', 'index.php?cpt=$matches[1]', 'top');
}
add_action('after_theme_setup', 'cpt_rewrite_rule');

svuota/ricicla le riscritture URL, poi modifica .htaccess

RewriteRule ^cpt/(.+)$ /$1 [R=301,L]
13 dic 2012 20:37:23
0

Puoi sempre agganciarti a "parse_request" per eseguire un controllo e verificare se esiste un tipo personalizzato con il nome richiesto e quindi modificare i query_vars in modo appropriato. Avrai bisogno di qualcosa simile alla risposta di @Bartosz per generare anche il permalink:

 add_filter('parse_request', "t21_parse_request" , 1, 1);

 function t21_parse_request($wpobj)
 {
      $query_vars = $wpobj->query_vars;
      $slug = $query_vars['pagename'];

      $posts = get_posts(array(
           "post_type" => "event",
           "post_name" => $slug
      ));

      if($posts)
      {
           //sappiamo che la tua voce "event" esiste, quindi ora modifichiamo i query_vars
           //prima rimuoviamo 'page' e 'pagename'
           unset($query_vars['page']);
           unset($query_vars['pagename']);

           //ora ricostruiamo i query_vars
           $query_vars['post_type'] = "event"; //nome del CPT
           $query_vars['name'] = $slug;
           $query_vars['event'] = $slug; //di nuovo - questo costruisce la stringa di query "event=myevent"
      }
      else
      {
           //restituiamo semplicemente $wpobj poiché sappiamo che non c'è nessun "event"
           return $wpobj;
      }
 }

Tuttavia, questo presuppone che non avrai nessun nome di post con lo stesso nome di un postname, altrimenti il post non apparirà mai poiché corrisponde prima a un tipo di evento.

13 dic 2012 21:55:52