Cum să modifici o taxonomie care este deja înregistrată
Astăzi am avut nevoie să modific argumentele unei taxonomii personalizate care era deja înregistrată de un plugin terț. Mai exact, am vrut să setez argumentul show_admin_column
la true
și să schimb slug-ul de rewrite
astfel încât să nu fie doar slug-ul taxonomiei. În acest caz, era vorba de un tip de postare "People" cu o taxonomie personalizată "People Category".
Am fost surprins că această întrebare nu a fost pusă înainte, așa că iată întrebarea și răspunsul.

register_taxonomy()
este instrumentul potrivit pentru această sarcină. Din Codex:
Această funcție adaugă sau suprascrie o taxonomie.
O opțiune ar fi să copiem argumentele $args
din register_taxonomy()
și să le modificăm. Totuși, asta ar însemna că orice modificări viitoare la codul original al register_taxonomy()
ar fi suprascrise.
Prin urmare, cel puțin în acest caz, este preferabil să obținem argumentele originale, să modificăm cele pe care vrem să le schimbăm și apoi să reînregistrăm taxonomia. Inspirația pentru această soluție vine de la @Otto în acest răspuns la o întrebare similară despre tipurile personalizate de postări.
Folosind tipul de postare personalizat people
și taxonomia people_category
din exemplu, iată cum putem face acest lucru:
function wpse_modify_taxonomy() {
// obținem argumentele taxonomiei deja înregistrate
$people_category_args = get_taxonomy( 'people_category' ); // returnează un obiect
// facem modificări la argumente
// în acest exemplu sunt trei modificări
// din nou, rețineți că este un obiect
$people_category_args->show_admin_column = true;
$people_category_args->rewrite['slug'] = 'people';
$people_category_args->rewrite['with_front'] = false;
// reînregistrăm taxonomia
register_taxonomy( 'people_category', 'people', (array) $people_category_args );
}
// conectăm funcția la prioritatea 11 pentru a suprascrie funcția originală register_taxonomy
add_action( 'init', 'wpse_modify_taxonomy', 11 );
Observați că am convertit al treilea argument al register_taxonomy()
în tipul array
așteptat. Acest lucru nu este strict necesar, deoarece register_taxonomy()
folosește wp_parse_args()
care poate procesa atât object
cât și array
. Totuși, conform Codex, argumentele $args
ale register_taxonomy()
ar trebui să fie trimise ca array
, așa că această abordare pare corectă.

Încerc să fac asta pentru a schimba o taxonomie plată într-una ierarhică. Pur și simplu schimb proprietatea hierarchical în true. Prin aceasta, apar două cutii meta pentru taxonomia în partea dreaptă a ecranului de editare a postării și nu pot adăuga efectiv taxonomii...

Asigură-te că folosești același slug (de ex. 'people_category'
) ca și taxonomia originală, astfel încât să o suprascrii.

Am găsit o problemă cu această soluție: parametrul capabilities
este stocat intern ca cap
, așa că nu va fi transmis la noua taxonomie înregistrată. Vezi răspunsul meu la o întrebare similară aici

se pare că adăugarea flush_rewrite_rules();
după register_taxonomy
este necesară pentru aplicarea regulilor de rescriere ale noului slug

@SajjadShirazy Nu este recomandat, deoarece aceasta va reseta regulile de rescriere la fiecare încărcare de pagină. Este mai bine să mergi la Setări > Legături permanente pentru a le reseta manual o singură dată.

Este minunat, l-am folosit pentru a adăuga URL-uri ierarhice unei taxonomii personalizate.

add_filter( 'register_taxonomy_args', function( $args, $taxonomy, $object_type ) {
if( $taxonomy !== 'people_category' || ! $object_type || $object_type[0] !== 'people' ) return $args;
$args['show_admin_column'] = true;
$args['rewrite']['slug'] = 'people';
return $args;
}, 10, 3);
