Annulla / Cambia lumaca del tipo di posta personalizzato di un plugin


28

È possibile dichiarare / modificare la lumaca del tipo di posta personalizzato esistente di un plug-in (senza semplicemente modificare il plug-in)?

Cioè, se il plugin X crea un tipo di post personalizzato con lo slug / uncookedtoast /, è possibile aggiungere un filtro a Functions.php (o qualcosa di simile) che cambia lo slug in / bread /?


Ho appena risolto questo stesso problema collegandomi a init con una priorità di 20 e quindi chiamando nuovamente register_post_type per lo stesso tipo di post. Qualcuno sa se questo mi causerà qualche problema lungo la strada?
Dustin,

Risposte:


24

Sì, questo è possibile, ma se il plug-in sta creando un tipo di post personalizzato utilizzando il rewrite => array('slug' => 'post_type')parametro, è improbabile che tu possa sostituire la lumaca.

Ogni volta che vengono creati tipi di post personalizzati, le regole di riscrittura degli URL vengono scritte nel database. A seconda dell'azione che avvia la creazione del tipo di post personalizzato (come l' azione init ), WordPress annulla le regole di riscrittura e ripristina gli slug del tipo di post personalizzato indipendentemente dalle modifiche che si tenta di apportare.

Detto questo, puoi fornire lumache personalizzate per i tipi di post personalizzati. L'esempio seguente presuppone che tu abbia un tipo di post personalizzato di moviese che stai tentando di modificare la /movies/lumaca in /films/.

Per essere completo, ecco la funzione di base utilizzata per definire il moviestipo di post personalizzato. Il plugin a cui fai riferimento dovrebbe fare qualcosa del genere:

function movies_register_post_type() {

    register_post_type(
        'movies',
        array(
            'labels' => array(
                'name' => __('Movies'),
                'singular_name' => __('Movie')
            ),
            'public' => true,
            'has_archive' => true,
            'rewrite' => array(
                'slug' => 'movies'
            )
        )
    );

} // end example_register_post_type
add_action('init', 'movies_register_post_type');

Puoi modificare la tabella delle opzioni fornendo le tue regole personalizzate in base al tipo di post esistente.

Fondamentalmente, faremo questo:

  • Prendi il set di regole esistente e poi scrivi il nostro con le nostre lumache personalizzate
  • Assegna alla nuova regola una priorità più alta rispetto alla lumaca del tipo di post personalizzato

Ecco come puoi farlo:

function add_custom_rewrite_rule() {

    // First, try to load up the rewrite rules. We do this just in case
    // the default permalink structure is being used.
    if( ($current_rules = get_option('rewrite_rules')) ) {

        // Next, iterate through each custom rule adding a new rule
        // that replaces 'movies' with 'films' and give it a higher
        // priority than the existing rule.
        foreach($current_rules as $key => $val) {
            if(strpos($key, 'movies') !== false) {
                add_rewrite_rule(str_ireplace('movies', 'films', $key), $val, 'top');   
            } // end if
        } // end foreach

    } // end if/else

    // ...and we flush the rules
    flush_rewrite_rules();

} // end add_custom_rewrite_rule
add_action('init', 'add_custom_rewrite_rule');

Ora avrai due modi per accedere ai tuoi film:

  • /movies/Back-To-The-Future
  • /films/Back-To-The-Future

Si noti che io non consiglio l'aggancio add_custom_rewrite_rulein initazione in quanto scatterà troppo frequentemente. Questo è solo un esempio. Un posto migliore per applicare la funzione sarebbe l'attivazione del tema, l'attivazione del plug-in, forse l'azione save_post, ecc. A seconda di ciò che è necessario fare, potrebbe essere necessario attivarlo solo una o poche volte.

A questo punto, potresti voler prendere in considerazione l'aggiornamento dei permalink per il tipo di post personalizzato in modo da utilizzare la ' /movies/lumaca ' . Ad esempio, se navighi /films/, vedrai un elenco di tutti i tuoi film, ma passando con il mouse sopra il titolo rivelerai che la /movies/lumaca è ancora in uso.

Per fare un ulteriore passo, potresti tecnicamente installare un reindirizzamento 301 per catturare tutti i link /movies/per reindirizzare alla loro /films/controparte, ma tutto dipende da cosa stai tentando di fare.


Ha funzionato magnificamente! Potresti anche indicarmi la giusta direzione per l'aggiornamento dei permalink?
Edbury,

1
A seconda del tema, puoi farlo a livello di modello. Quando vedi la chiamata a 'the_title ()', puoi sostituirla con $ title = get_the_title (), quindi sostituisci la stringa '/ movies /' in $ title con '/ films /'.
Tom,

Cosa succede se lo slug che vuoi cambiare viene creato dinamicamente da un meta valore del post corrente? Devo essere in grado di utilizzare $postla add_custom_rewrite_rule()funzione ma sta generando errori in WP Admin che dice "Cercare di ottenere proprietà di non oggetti". Come posso ottenere $ post per ottenere il meta valore?
Lee,

6

Questo codice ha funzionato bene per il tema di mio figlio. Necessario cambiare la lumaca "programma" in "luogo".

/*
CHANGE SLUGS OF CUSTOM POST TYPES
*/

function change_post_types_slug( $args, $post_type ) {

   /*item post type slug*/   
   if ( 'program' === $post_type ) {
      $args['rewrite']['slug'] = 'place';
   }

   return $args;
}
add_filter( 'register_post_type_args', 'change_post_types_slug', 10, 2 );

/*
CHANGE SLUGS OF TAXONOMIES, slugs used for archive pages
*/

function change_taxonomies_slug( $args, $taxonomy ) {

   /*item category*/
   if ( 'program-category' === $taxonomy ) {
      $args['rewrite']['slug'] = 'locations';
   }

   return $args;
}
add_filter( 'register_taxonomy_args', 'change_taxonomies_slug', 10, 2 );

Funziona perfettamente, l'ho usato anche per i tag aggiungendo la relativa regola, è necessario aggiornare i permalink eseguendo un salvataggio dalla pagina delle impostazioni> permalink. Grazie!
Lorenzo Magon,

Funziona perfettamente per cambiare anche altri argomenti, avevo bisogno di impostare $args['has_archive'] = falsee questo ha funzionato.
Mere Development
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.