Folosește register_post_type() pentru a modifica un tip de postare existent
Există multe situații în care o temă sau un plugin înregistrează un tip de postare și dorești să îl modifici. Există, desigur, add_post_type_support()
și remove_post_type_support()
, dar acestea nu oferă acces la lista completă de argumente pe care le acceptă register_post_type()
. În special, poate doresc să dezactivez arhiva unui tip de postare, să ascund interfața de administrare, să ascund din căutare etc., păstrând în același timp restul setărilor tipului de postare.
Pagina Codex pentru register_post_type()
ne prezintă următoarele:
Descriere
Creează sau modifică un tip de postare.
Dar în trecut, când am încercat să fac acest lucru, nu părea să funcționeze. Este această funcție într-adevăr pentru modificarea tipurilor de postare și, dacă da, poți pur și simplu să redeclari câteva argumente și să le lași pe celelalte neschimbate?
Văzând că nici măcar nu există o funcție deregister_post_type()
, nu înțeleg cum poate fi făcut acest lucru.

După o cercetare am descoperit că niciunul dintre aceste răspunsuri nu este actualizat.
Începând cu 8 decembrie 2015, WordPress include un nou filtru, register_post_type_args
, care vă permite să interveniți în argumentele unui tip de postare înregistrat.
function wp1482371_custom_post_type_args( $args, $post_type ) {
if ( $post_type == "animal-species" ) {
$args['rewrite'] = array(
'slug' => 'animal'
);
}
return $args;
}
add_filter( 'register_post_type_args', 'wp1482371_custom_post_type_args', 20, 2 );

Ce se întâmplă dacă trebuie să îl actualizezi după ce a fost înregistrat în timpul execuției? De exemplu: după init

@LucasBustamante Nu contează. Doar apelează linia 'add_filter' în cadrul plugin-ului/temei tale, nu într-o acțiune. Filtrul va fi apelat la fiecare apelare a funcției register_post_type
. Singurul scenariu în care codul meu nu va funcționa este dacă tipul de postare nu este înregistrat corect. Toate tipurile de postare ar trebui să fie înregistrate în timpul hook-ului init. Din codex: "register_post_type nu va funcționa dacă este apelat înainte de 'init', iar aspectele noului tip de postare creat sau modificate vor funcționa incorect dacă sunt apelate mai târziu." Dacă mai ai nevoie de ajutor, sugerez să postezi mai multe detalii într-o întrebare nouă.

deci, acest cod va schimba 'slug-of-post', ca în 'sitename/proiecte/slug-of-post' ??

@Krys Nu sunt sigur ce vrei să spui, dar pentru clarificare: Dacă ai "example.org/specii-animale/slug-of-post", îți permite să schimbi "specii-animale" în simplul "animal", astfel încât URL-ul va deveni "example.org/animal/slug-of-post" iar pagina de arhivă, dacă este activată, va fi "example.org/animal/". Fără a fi nevoie să schimbi numele tipului de postare.

Este această funcție într-adevăr pentru modificarea tipurilor de postări
Da.
și dacă da, poți pur și simplu să redeclari câteva argumente și să lași restul neschimbate?
Nu. Dacă dorești să modifici argumentele unui tip de postare, trebuie să folosești get_post_type_object
pentru a obține obiectul tipului de postare, să modifici ceea ce dorești în el, apoi să-l înregistrezi din nou folosind tipul tău modificat ca noul parametru $args.

Ar fi corect să faci două apeluri consecutive cu argumente modificate la același register_post_type
? Presupun că da prin răspunsul tău "Da.", și nu generează erori și are efectul dorit. Cazul real este a doua opțiune pe care o prezint în acest răspuns: http://wordpress.stackexchange.com/a/74331/12615

Da, funcționează, dar pare că dacă trebuie să faci asta, atunci ar trebui să adaugi niște filtre sau altceva pentru a evita să înregistrezi același tip de postare în mod repetat. Practic, rezolvă mai întâi argumentele, apoi înregistrează.

Iată un exemplu de utilizare a filtrului 'registered_post_type'
pentru a modifica un tip de postare într-un alt plugin.
Un plugin pe care îl foloseam nu includea un menu_icon în definiția sa, așa că am vrut să adaug unul propriu.
<?php
/**
* Adaugă o pictogramă de meniu la CPT-ul WP-VeriteCo Timeline
*
* Plugin-ul de timeline nu are o pictogramă de meniu, așa că folosim hook-ul 'registered_post_type'
* pentru a adăuga una personalizată.
*
* @param string $post_type numele tipului de postare
* @param object $args argumentele tipului de postare
*/
function wpse_65075_modify_timeline_menu_icon( $post_type, $args ) {
// Asigură-te că modificăm doar tipul de postare dorit
if ( 'timeline' != $post_type )
return;
// Setează pictograma de meniu
$args->menu_icon = get_stylesheet_directory_uri() . '/img/admin/menu-timeline.png';
// Modifică obiectul tipului de postare
global $wp_post_types;
$wp_post_types[$post_type] = $args;
}
add_action( 'registered_post_type', 'wpse_65075_modify_timeline_menu_icon', 10, 2 );

Conectează-te la 'registered_post_type'
după ce celălalt cod l-a înregistrat. Acesta este apelat la sfârșitul funcției register_post_type()
. Primești doi parametri: $post_type
și $args
.
Acum poți modifica orice pentru acest tip de post. Inspectează $GLOBALS['wp_post_types']
pentru unele opțiuni.

Mulțumesc că m-ai îndreptat spre acel hook. Asta răspunde la întrebarea (mai importantă) despre cum să modifici un tip de postare, dar cum rămâne cu descrierea din register_post_type()
care include "modificare?" E doar greșită? Ar trebui să mă urc pe calul meu internet și să o înlătur din Codex în clipa asta?

Am întâmpinat aceeași problemă cu plugin-ul The Events Calendar.
Am adăugat codul de mai jos în functions.php pentru a modifica tipul de post tribe_organizer:
function tribe_modify_organizer() {
// Argumente noi
$tribe_organizer_args = get_post_type_object('tribe_organizer'); // obține tipul de post de modificat
$tribe_organizer_args-> taxonomies = array('post_tag' , 'tribe_events_cat'); // adaugă suport pentru taxonomii
$tribe_organizer_args-> exclude_from_search = false; // afișează în rezultatele de căutare
// Reînregistrează același tip de post includând noile argumente
register_post_type( 'tribe_organizer', $tribe_organizer_args );
}
add_action( 'init', 'tribe_modify_organizer', 100 );

Nu știu dacă acest lucru este urât, dar ai putea modifica placeholder-ul GLOBAL
"pe loc" ori de câte ori ai nevoie să manipulezi un singur argument. Iată cum folosim un tip de postare ne-public contents
pentru a fi acceptabil în meniul de administrare. Conectăm funcțiile imediat înainte și imediat după randarea meniului:
function entex_theme_make_contents_public(){
$GLOBALS['wp_post_types']['contents']->public = true;
}
add_action('admin_menu', 'entex_theme_make_contents_public', 10);
function entex_theme_make_contents_private_again(){
$GLOBALS['wp_post_types']['contents']->public = '';
}
add_action('admin_menu', 'entex_theme_make_contents_private_again', 12);
În cazul nostru, dorim ca plugin-ul Admin Menu Post List să accepte tipul nostru de postare, deoarece ei apelează return get_post_types(array('public' => true));
în interiorul hook-ului lor cu prioritatea 11...
Dezvoltatori - Vă rugăm să comentați dacă acest lucru ar putea cauza probleme.
