Rimuovi la lumaca del tipo di post personalizzato dall'URL


15

Non ho trovato una risposta utile per questo. Sono a conoscenza dei problemi di conflitto e di tutti i problemi che ciò può causare, sono curioso di sapere se POSSIBILE non CONSIGLIATO. Ciò richiederà riscritture WP, lo so molto.

Fondamentalmente, diciamo che abbiamo un CPT di "eventi". Voglio che la pagina di un singolo evento abbia l'URL http://domain.com/single-event-name e NON http://domain.com/events/single-event-name . Qualche idea su come procedere?


Ho sempre voluto scoprirlo, non ho mai pensato di porre la domanda. Grazie!
fischi,

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

Risposte:


9

È così che puoi fare la prima parte del lavoro: sbarazzarsi della lumaca CPT nel post link (ad es. Tipo di post di notizie).

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 dovresti andare a riscrivere le regole per 'news', perché 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');

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


1
Non dovresti aggiungere regole di riscrittura su init. Devi solo aggiungere la tua regola alle regole attuali.
Chris_O

2
@Chris_O Puoi elaborare? Come si aggiungerebbe la regola alle regole attuali?
Desi

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

4

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 del permalink è "/% postname % /


Esattamente questo plugin è fantastico! Sono un utente esperto di questo plugin e lo consiglio vivamente! ecco il link del sito del plug-in che lo spiega in profondità ultimatewebtips.com/remove-slug-from-custom-post-type
Kuldeep Daftary

Questo è un bel plugin e ha esattamente la funzione che stavo cercando. La soluzione di @bartosz è specifica per un CPT, anche se anche tu ne hai un'idea generale. Dopo aver scavato in questo plugin è tutto chiaro ora, grazie!
fischi,

0

Puoi sempre collegarti a "parse_request" per eseguire un controllo per vedere se esiste un tipo personalizzato con il nome richiesto e quindi modificare query_vars in modo appropriato. Avrai bisogno di qualcosa sulla falsariga della risposta di @ Bartosz per generare inoltre il permalink:

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

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

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

      if($posts)
      {
           //we know your "event" entry exists so we now amend the query_vars
           //first unset the 'page' and 'pagename'
           unset($query_vars['page']);
           unset($query_vars['pagename'];

           //now rebuild the query_vars
           $query_vars['post_type'] = "event"; //CPT name
           $query_vars['name'] = $slug;
           $query_vars['event'] = $slug //again - this constructs the "event=myevent" query string
      }
      else
      {
           //just return $wpobj since we know that there is no "event"
           return $wpobj;
      }
 }

Ciò presuppone tuttavia che non si avranno nomi di post con lo stesso nome di un postname altrimenti, il post non verrà mai visualizzato in quanto corrisponde prima a un tipo di evento.


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');

flush / recycle url riscrive, quindi modifica .htaccess

RewriteRule ^cpt/(.+)$ /$1 [R=301,L]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.