Redeclare/Modificare Slug pentru un Tip de Postare Personalizat al unui Plugin
Este posibilă redeclararea/modificarea slug-ului unui tip de postare personalizat existent al unui plugin (fără a edita plugin-ul)?
Adică, dacă Plugin X creează un tip de postare personalizat cu slug-ul /uncookedtoast/, este posibil să adăugăm un filtru în functions.php (sau ceva similar) care să schimbe slug-ul în /bread/?

Da, acest lucru este posibil, dar dacă plugin-ul creează un tip de postare personalizat folosind parametrul rewrite => array('slug' => 'post_type')
, atunci este puțin probabil să poți înlocui slug-ul.
Ori de câte ori sunt create tipuri de postări personalizate, regulile de rescriere URL sunt scrise în baza de date. În funcție de acțiunea care declanșează crearea tipului de postare personalizat (cum ar fi acțiunea init), WordPress va reseta regulile de rescriere și va restaura slug-urile tipului de postare personalizat, indiferent de modificările pe care încerci să le faci.
Cu toate acestea, poți furniza slug-uri personalizate pentru tipurile de postări personalizate. Următorul exemplu presupune că ai un tip de postare personalizat numit movies
și încerci să schimbi slug-ul /movies/
în /films/
.
Pentru a fi complet, iată funcția de bază folosită pentru a defini tipul de postare personalizat movies
. Plugin-ul pe care îl referențiezi ar trebui să facă ceva similar:
function movies_register_post_type() {
register_post_type(
'movies',
array(
'labels' => array(
'name' => __('Filme'), // Traducere: 'Filme'
'singular_name' => __('Film') // Traducere: 'Film'
),
'public' => true,
'has_archive' => true,
'rewrite' => array(
'slug' => 'movies'
)
)
);
} // end example_register_post_type
add_action('init', 'movies_register_post_type');
Poți modifica tabela de opțiuni furnizând propriile reguli personalizate bazate pe tipul de postare existent.
În esență, vom face următoarele:
- Preluăm setul existent de reguli și apoi scriem propriile noastre reguli cu slug-uri personalizate
- Dăm noii reguli o prioritate mai mare decât slug-ul tipului de postare personalizat
Iată cum poți face acest lucru:
function add_custom_rewrite_rule() {
// Încercăm mai întâi să încărcăm regulile de rescriere. Facem asta pentru cazul în care
// structura implicită a permalink-urilor este folosită.
if( ($current_rules = get_option('rewrite_rules')) ) {
// Apoi, iterăm prin fiecare regulă personalizată adăugând o nouă regulă
// care înlocuiește 'movies' cu 'films' și îi dăm o prioritate
// mai mare decât regula existentă.
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
// ...și resetăm regulile
flush_rewrite_rules();
} // end add_custom_rewrite_rule
add_action('init', 'add_custom_rewrite_rule');
Acum, vei avea două modalități de a accesa filmele tale:
/movies/Back-To-The-Future
/films/Back-To-The-Future
Reține că nu recomand să conectezi funcția add_custom_rewrite_rule
la acțiunea init
, deoarece se va declanșa prea des. Acesta este doar un exemplu. Un loc mai potrivit pentru a aplica funcția ar fi la activarea temei, activarea plugin-ului, poate acțiunea save_post etc. În funcție de ce trebuie să faci, poate fi nevoie să o declanșezi doar o dată sau de câteva ori.
În acest moment, poate dorești să actualizezi permalink-urile pentru tipul de postare personalizat pentru a folosi slug-ul '/movies/
. De exemplu, dacă navighezi la /films/
, vei vedea o listă cu toate filmele tale, dar dacă treci cursorul peste titlu, vei vedea că slug-ul /movies/
este încă folosit.
Pentru a merge mai departe, ai putea tehnic să institui o redirecționare 301 pentru a intercepta toate link-urile către /movies/
și a le redirecționa către omologul lor /films/
, dar totul depinde de ceea ce încerci să realizezi.

A funcționat perfect! Ai putea să mă îndrumi și în direcția corectă pentru actualizarea permalinkurilor?

În funcție de tema ta, poți face asta la nivelul template-ului. Când vezi apelul la 'the_title()', poți înlocui acel lucru cu $title = get_the_title(), apoi înlocuiește '/movies/' în $title cu '/films/'.

Ce se întâmplă dacă slug-ul pe care vrei să-l schimbi este creat dinamic de o valoare meta a postului curent? Am nevoie să pot folosi $post
în funcția add_custom_rewrite_rule()
, dar primesc erori în WP Admin care spun 'Trying to get property of non-object'. Cum pot obține $post pentru a prelua valoarea meta?

Acest cod a funcționat bine pentru tema mea copil. A trebuit să schimb slug-ul "program" în "place".
/*
SCHIMBĂ SLUG-URILE TIPURILOR DE POSTĂRI PERSONALIZATE
*/
function change_post_types_slug( $args, $post_type ) {
/*slug pentru tipul de postare item*/
if ( 'program' === $post_type ) {
$args['rewrite']['slug'] = 'place';
}
return $args;
}
add_filter( 'register_post_type_args', 'change_post_types_slug', 10, 2 );
/*
SCHIMBĂ SLUG-URILE TAXONOMIILOR, slug-uri folosite pentru paginile de arhivă
*/
function change_taxonomies_slug( $args, $taxonomy ) {
/*categorie pentru item*/
if ( 'program-category' === $taxonomy ) {
$args['rewrite']['slug'] = 'locations';
}
return $args;
}
add_filter( 'register_taxonomy_args', 'change_taxonomies_slug', 10, 2 );

Funcționează perfect, am folosit-o și pentru etichete adăugând regula relativă, este necesar să actualizați permalink-urile executând o salvare din pagina de setări > permalink. Mulțumesc!

Funcționează perfect și pentru a schimba alte argumente, eu aveam nevoie să setez $args['has_archive'] = false
și a funcționat.

În cazul meu, exista un plugin (necesar pentru ca tema să funcționeze) care înregistra un tip de postare personalizat și am vrut să modific unele lucruri la el, inclusiv slug-ul.
Așadar, ceea ce am făcut a fost să reînregistrez (ca un fel de suprascriere a funcției de înregistrare a plugin-ului) tipul de postare personalizat, adăugând următoarele în fișierul functions.php
al temei mele copil, astfel:
function my-theme-name_post_type_my-custom-post-type-name()
{
$labels = array(
...
);
$args = array(
...
'rewrite' => array(
'slug' => __('the-slug-of-your-choise', 'the-textdomain-of-your-choise-for-translation-if-needed'),
),
);
register_post_type('the-custom-post-type-name-registered-by-the-plugin', $args);
}
add_action('init', 'my-theme-name_post_type_my-custom-post-type-name');
După cum puteți vedea, puteți schimba slug-ul pur și simplu adăugând următoarele în array-ul $args
:
'rewrite' => array(
'slug' => __('the-slug-of-your-choise', 'the-textdomain-of-your-choise-for-translation-if-needed'),
)
Mai multe informații despre acest lucru găsiți la: https://developer.wordpress.org/reference/functions/register_post_type/
FOARTE IMPORTANT
Nu uitați să reîmprospătați permalink-urile pentru ca modificările să fie aplicate și pentru a putea accesa postările implicate. Mergeți la setările permalink-urilor și pur și simplu apăsați "Salvare"... apoi ar trebui să funcționeze!

function change_portfolio_slug() {
$args = get_post_type_object( 'portfolio' );
if ( ! empty( $args ) ) {
$args->rewrite['slug'] = 'proiect';
register_post_type( 'portfolio', $args );
}
}
add_action( 'init', 'change_portfolio_slug', 20 );
În cazul meu, plugin-ul declară un tip de postare personalizată "portfolio" cu 'rewrite' => array( 'slug' => 'portfolio')
, folosind un hook în acțiunea 'init' add_action( 'init', 'some_plugin_custom_posts_init' );
.
Fragmentul de mai sus, plasat în fișierul functions.php al temei, definește o nouă funcție change_portfolio_slug()
care modifică argumentul rewrite pentru tipul de postare portfolio, schimbându-i slug-ul în "proiect". Apoi folosim funcția register_post_type()
pentru a înregistra tipul de postare cu argumentele modificate.
Funcția add_action()
atașează funcția change_portfolio_slug()
la acțiunea init, astfel încât să fie executată când WordPress se inițializează.
În ultima linie a fragmentului add_action( 'init', 'change_portfolio_slug', 10 );
, numărul 10
reprezintă prioritatea hook-ului de acțiune. Dacă doriți să modificați prioritatea, puteți înlocui 10
cu un alt număr. În cazul meu, prioritatea funcțională a fost 20
.
Notă: Poate fi necesar să reîmprospătați structura de legături permanente după această modificare pentru a vă asigura că noua structură de URL-uri este aplicată corect. Puteți face acest lucru mergând la Setări > Legături permanente în panoul de administrare WordPress și făcând clic pe butonul "Salvare modificări".
